diff --git a/.github/workflows/app-pacakge-build-client-python.yml b/.github/workflows/app-pacakge-build-client-python.yml
new file mode 100644
index 0000000..10f1a3c
--- /dev/null
+++ b/.github/workflows/app-pacakge-build-client-python.yml
@@ -0,0 +1,125 @@
+# This workflow will install Python dependencies, run tests and lint with a single version of Python
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
+
+name: Unity-app-package-client Python Build
+
+# Do Run if we push anything changes in /libs/app-package-build-client to the main branch
+# Run on an PR if it includes unity-py changes OR if the schema in health are changed.
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'libs/app-package-build-client/**'
+ pull_request:
+ branches:
+ - main
+ paths:
+ - 'libs/app-package-build-client/**'
+
+jobs:
+ build:
+ defaults:
+ run:
+ working-directory: ./libs/app-package-build-client
+ strategy:
+ fail-fast: false
+ max-parallel: 2
+ matrix:
+ python-version: [ "3.8", "3.9", "3.10" ]
+ poetry-version: [ "1.5.1" ]
+ # os: [ ubuntu-18.04, macos-latest, windows-latest ]
+ os: [ ubuntu-22.04, macos-latest ]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install Poetry
+ uses: abatilo/actions-poetry@v2.0.0
+ with:
+ poetry-version: ${{ matrix.poetry-version }}
+ #- uses: dorny/paths-filter@v3
+ # id: changes
+ # with:
+ # filters: |
+ # src:
+ # - 'libs/unity-py/**'
+ - name: Software Version Check
+ if: steps.filter.outputs.src == 'true'
+ run: |
+ proposed_version=`poetry version -s`
+ echo "curl -s -o /dev/null -w \"%{http_code}\" https://pypi.org/project/unity-sds-apgs-client/$proposed_version/"
+ status_code=`curl -s -o /dev/null -w "%{http_code}" https://pypi.org/project/unity-sds-apgs-client/$proposed_version/`
+ echo "Received status code of $status_code"
+ if ((status_code == 200)); then
+ echo "Version already exists."
+ exit 1
+ fi
+ - name: Install dependencies
+ run: |
+ poetry install
+ # This is good practice, but because these are autogenerated libraries, we will forgo the linting.
+ #- name: Lint with flake8
+ # run: |
+ # # stop the build if there are Python syntax errors or undefined names
+ # poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
+ # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
+ # poetry run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
+ - name: Test with pytest
+ run: |
+ poetry run pytest --cov-report=lcov --cov=unity_sds_apgs_client -o log_cli=true --log-cli-level=DEBUG
+ - name: Coveralls
+ uses: coverallsapp/github-action@v2.3.0
+ version:
+ needs: build
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./libs/app-package-build-client
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.UNITY_BUILD_PAT }}
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ - name: Install Poetry
+ uses: abatilo/actions-poetry@v2.0.0
+ with:
+ poetry-version: "1.5.1"
+ # Commented out the version bump code. Will publish new version to pypi on push to main.
+ # This means we are always releasing. This will fail if the version already exists in Pypi.
+ # We must ensure that the version has been updated.
+ # ADded version check above.
+ # Future work: set PR test to ensure the version has been updated.
+
+ # - name: version-bump
+ # run: |
+ # poetry version prerelease
+ # - name: Commit Version Bump
+ # run: |
+ # git config --global user.name 'mdps bot'
+ # git config --global user.email 'mdps@noreply.github.com'
+ # git commit -am "development version bump. [skip actions]"
+ # git push
+ - name: Install dependencies
+ run: |
+ poetry install
+ - name: build
+ run: |
+ poetry build
+ - name: Get version
+ id: get-version
+ run: |
+ echo "::set-output name=current_version::$(poetry version | awk '{print $2}')"
+ - name: Publish a Python distribution to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_API_TOKEN }}
+ packages-dir: ./libs/app-package-build-client/dist
+ outputs:
+ publishedVersion: ${{ steps.get-version.outputs.current_version }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f7838f3..c14bd63 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -22,11 +22,12 @@ repos:
- --allow-missing-credentials
- id: check-toml # Checks toml files for parsable syntax.
# unity-py markdown lint
+ # Ignored because it caused exceptions with no clear indication as to the problem
#- repo: https://github.com/igorshubovych/markdownlint-cli
# rev: "v0.39.0"
# hooks:
# - id: markdownlint
- # # args: ["--config", ".markdownlintrc", "--ignore", "libs/unity-py/CHANGELOG.md"]
+ # args: ["--config", ".markdownlintrc", "--ignore", "**/CHANGELOG.md"]
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
diff --git a/libs/app-package-build-client/.openapi-generator-ignore b/libs/app-package-build-client/.openapi-generator-ignore
new file mode 100644
index 0000000..7484ee5
--- /dev/null
+++ b/libs/app-package-build-client/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/libs/app-package-build-client/.openapi-generator/FILES b/libs/app-package-build-client/.openapi-generator/FILES
new file mode 100644
index 0000000..e0697d2
--- /dev/null
+++ b/libs/app-package-build-client/.openapi-generator/FILES
@@ -0,0 +1,26 @@
+.github/workflows/python.yml
+.gitignore
+.gitlab-ci.yml
+.travis.yml
+README.md
+docs/AdsAcbMcpCloneGet200Response.md
+docs/DefaultApi.md
+git_push.sh
+pyproject.toml
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+test/__init__.py
+tox.ini
+unity_sds_apgs_client/__init__.py
+unity_sds_apgs_client/api/__init__.py
+unity_sds_apgs_client/api/default_api.py
+unity_sds_apgs_client/api_client.py
+unity_sds_apgs_client/api_response.py
+unity_sds_apgs_client/configuration.py
+unity_sds_apgs_client/exceptions.py
+unity_sds_apgs_client/models/__init__.py
+unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py
+unity_sds_apgs_client/py.typed
+unity_sds_apgs_client/rest.py
diff --git a/libs/app-package-build-client/.openapi-generator/VERSION b/libs/app-package-build-client/.openapi-generator/VERSION
new file mode 100644
index 0000000..1985849
--- /dev/null
+++ b/libs/app-package-build-client/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.7.0
diff --git a/libs/app-package-build-client/CHANGELOG.md b/libs/app-package-build-client/CHANGELOG.md
new file mode 100644
index 0000000..38d5a30
--- /dev/null
+++ b/libs/app-package-build-client/CHANGELOG.md
@@ -0,0 +1,16 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [0.1.0] - 2024-08-05
+
+### Added
+- Added Schema and built application client code, including github workflows
+### Changed
+### Deprecated
+### Removed
+### Fixed
+### Security
diff --git a/libs/app-package-build-client/README.md b/libs/app-package-build-client/README.md
new file mode 100644
index 0000000..4bcac94
--- /dev/null
+++ b/libs/app-package-build-client/README.md
@@ -0,0 +1,116 @@
+# unity-sds-apgs-client
+Service for application package generation
+
+This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: 1.0.0
+- Package version: 1.0.0
+- Generator version: 7.7.0
+- Build package: org.openapitools.codegen.languages.PythonClientCodegen
+
+## Requirements.
+
+Python 3.7+
+
+## Installation & Usage
+### pip install
+
+If the python package is hosted on a repository, you can install directly using:
+
+```sh
+pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git
+```
+(you may need to run `pip` with root permission: `sudo pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git`)
+
+Then import the package:
+```python
+import unity_sds_apgs_client
+```
+
+### Setuptools
+
+Install via [Setuptools](http://pypi.python.org/pypi/setuptools).
+
+```sh
+python setup.py install --user
+```
+(or `sudo python setup.py install` to install the package for all users)
+
+Then import the package:
+```python
+import unity_sds_apgs_client
+```
+
+### Tests
+
+Execute `pytest` to run the tests.
+
+## Getting Started
+
+Please follow the [installation procedure](#installation--usage) and then run the following:
+
+```python
+
+import unity_sds_apgs_client
+from unity_sds_apgs_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://api.dev.mdps.mcp.nasa.gov
+# See configuration.py for a list of all supported configuration parameters.
+configuration = unity_sds_apgs_client.Configuration(
+ host = "http://api.dev.mdps.mcp.nasa.gov"
+)
+
+# The client must configure the authentication and authorization parameters
+# in accordance with the API server security policy.
+# Examples for each auth method are provided below, use the example that
+# satisfies your auth use case.
+
+# Configure Bearer authorization: bearerAuth
+configuration = unity_sds_apgs_client.Configuration(
+ access_token = os.environ["BEARER_TOKEN"]
+)
+
+
+# Enter a context with an instance of the API client
+with unity_sds_apgs_client.ApiClient(configuration) as api_client:
+ # Create an instance of the API class
+ api_instance = unity_sds_apgs_client.DefaultApi(api_client)
+ clone_url = 'clone_url_example' # str |
+
+ try:
+ # Begins the MCP Clone process
+ api_response = api_instance.ads_acb_mcp_clone_get(clone_url)
+ print("The response of DefaultApi->ads_acb_mcp_clone_get:\n")
+ pprint(api_response)
+ except ApiException as e:
+ print("Exception when calling DefaultApi->ads_acb_mcp_clone_get: %s\n" % e)
+
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to *http://api.dev.mdps.mcp.nasa.gov*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*DefaultApi* | [**ads_acb_mcp_clone_get**](docs/DefaultApi.md#ads_acb_mcp_clone_get) | **GET** /ads-acb/mcp-clone | Begins the MCP Clone process
+
+
+## Documentation For Models
+
+ - [AdsAcbMcpCloneGet200Response](docs/AdsAcbMcpCloneGet200Response.md)
+
+
+
+## Documentation For Authorization
+
+
+Authentication schemes defined for the API:
+
+### bearerAuth
+
+- **Type**: Bearer authentication
+
+
+## Author
diff --git a/libs/app-package-build-client/coverage.lcov b/libs/app-package-build-client/coverage.lcov
new file mode 100644
index 0000000..dc193e7
--- /dev/null
+++ b/libs/app-package-build-client/coverage.lcov
@@ -0,0 +1,852 @@
+TN:
+SF:unity_sds_apgs_client/__init__.py
+DA:5,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:17,1,wsMlrTn33AvDPsz2kJoFzw
+DA:20,1,O4fPLUss4TuiS0JV7PK6Ig
+DA:23,1,Fg4K8TjB1w77+/CSfwjjAg
+DA:24,1,ZXbBlWI+PR/Wh0aFSPpogw
+DA:25,1,ZCyhYz0Inf6pAKsEACH07w
+DA:26,1,V5CUECXCAJTNFTGoxSdY/A
+DA:27,1,k4mk/BSywZc3vFl7rykamA
+DA:28,1,83f7lgTrCGbihhO7XEl2Kw
+DA:29,1,P8+lNspe4CkuTy0FxtCxvA
+DA:30,1,qFDEBDkO7OgaxcvMZSOi/g
+DA:31,1,MgjE1jx3p0JLVvOgoVHQ0Q
+DA:34,1,n+S4Q3M2X5b4GGJfzMpw6w
+LF:12
+LH:12
+end_of_record
+TN:
+SF:unity_sds_apgs_client/api/__init__.py
+DA:4,1,O4fPLUss4TuiS0JV7PK6Ig
+LF:1
+LH:1
+end_of_record
+TN:
+SF:unity_sds_apgs_client/api/default_api.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:14,1,uqQzsyLE2snBclOsmsd0qA
+DA:15,1,kpbjQTY8X43PSh14EOmyhw
+DA:16,1,JunjvWP6TTs7gV7iVxi/UQ
+DA:17,1,FL2e1W6bq78fvUH1aLz4Xg
+DA:19,1,/a8547GzlL2Sm4dQamqNMw
+DA:20,1,n+S4Q3M2X5b4GGJfzMpw6w
+DA:22,1,CVJGDFJDT523s5SvGsbAOg
+DA:23,1,Fg4K8TjB1w77+/CSfwjjAg
+DA:24,1,T67nnKn3EAg0ltY0WdFNRA
+DA:27,1,VrcwdlZEOLKxyTgYAARz3w
+DA:28,1,RAN1UGYPLOLKS3esTJJ6ZA
+DA:34,1,IT4kqGUJSBpKAm0pi/i4pQ
+DA:35,1,vErEKWfEZVuY0nxcu+wplQ
+DA:36,1,L7d6YQ1IEZkdQyUQyxnAwg
+DA:37,1,Ie8cxi2kaGzbCTrlcLl0KQ
+DA:40,1,AjisgRRMc8scFWicLmjSdQ
+DA:41,1,GamwTOpDGoANWQnfW9/LhA
+DA:106,1,AjisgRRMc8scFWicLmjSdQ
+DA:107,1,kScYxn9RmXLSKgwIwLkW6A
+DA:172,1,AjisgRRMc8scFWicLmjSdQ
+DA:173,1,VL4vHHtFsQBGSumFAWQGoA
+DA:234,1,ZMATpNVoweWpftTlhYVlBA
+DA:84,0,2cmiycDTYgzO2vT2ncv/Ow
+DA:92,0,HySOsJ9gZWrzVMsr1/hDNw
+DA:95,0,xVmsq2otHaabXYiKmKfHRg
+DA:99,0,mc8sSiUjUQ0ZVszybckhVA
+DA:100,0,Tl0irD+4FzhOnKLYC/fkwg
+DA:150,0,2cmiycDTYgzO2vT2ncv/Ow
+DA:158,0,HySOsJ9gZWrzVMsr1/hDNw
+DA:161,0,xVmsq2otHaabXYiKmKfHRg
+DA:165,0,mc8sSiUjUQ0ZVszybckhVA
+DA:166,0,Tl0irD+4FzhOnKLYC/fkwg
+DA:216,0,2cmiycDTYgzO2vT2ncv/Ow
+DA:224,0,HySOsJ9gZWrzVMsr1/hDNw
+DA:227,0,xVmsq2otHaabXYiKmKfHRg
+DA:231,0,Jf0ZtawpspLOL5bwtEW/Ag
+DA:243,0,GdGRwbt/y/4QnnAXg2mCGg
+DA:245,0,Ch/CetksBAPNy8VNGnxs1w
+DA:248,0,4KT8Y7afhNY/oagXBeN8XA
+DA:249,0,PaehIcOUt5JYXGauVMJnRQ
+DA:250,0,m4iEZ5wF7BJSCzaMXSNE/g
+DA:251,0,P6Fsw8IzfYO8kt/mTOc3+Q
+DA:252,0,mNq3pObSFRuuDJrKyv9K9Q
+DA:253,0,FRBdNvpYeqrDa1GxNXCSkw
+DA:258,0,xLakscK5SkqoOwxuIPEVrw
+DA:259,0,zDfdEy55VqcWGw0qlVoWVQ
+DA:265,0,SbvafVPBbx4eTatUOSBCJg
+DA:266,0,aagE1Nf/+7+11HPGGoryXA
+DA:274,0,RpnctquVq/dNfvM9mZTb7Q
+DA:278,0,D8sasEMaU5oofPf6sOrG/Q
+LF:49
+LH:21
+end_of_record
+TN:
+SF:unity_sds_apgs_client/api_client.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:15,1,L/jqrDHxbfUd/SDMFGHfTA
+DA:16,1,8IQnfsOg8QP1j6xtCxez8A
+DA:17,1,gRHjawkciFUavd6j4zLvOw
+DA:18,1,OaTlemF3bXMi5MP7Db8vkQ
+DA:19,1,S+QG4QhjTlJVZy3CzoUeLw
+DA:20,1,7Z9Lj4ed27Wf2hBX6jooEA
+DA:21,1,p7hNY1S5rX9QtYADf+cK4g
+DA:22,1,5hwPtyw5fWMOX90GeC1WXw
+DA:24,1,/9j88LWsDOfeMPFsLqmQlQ
+DA:25,1,3E/n8fPDewkUsVO2LdwZ4A
+DA:26,1,hPmmdyR8p6B0qSlKjTineg
+DA:28,1,ZCyhYz0Inf6pAKsEACH07w
+DA:29,1,elMzElYIbXA8kYFGvoRdpg
+DA:30,1,a5aYupcnafWoOlHrRXyGrA
+DA:31,1,F2oAzBzI53tZjsA6ssHtMw
+DA:32,1,+82OetNlrLdYpATcvPfM6g
+DA:42,1,bvgiEkADpDNVBbjHkfmPkQ
+DA:44,1,T5e9V1wqwX4wl/f8yTyhFA
+DA:45,1,RWNwHOzmCDa8/CNLM0uZSA
+DA:60,1,B6OfmLZS8dR/xgp41eX6Qg
+DA:61,1,b6GYh7NaX34vs5f8TwQEXA
+DA:71,1,RcEwuguk7XGdR+woMBnqdg
+DA:73,1,4LgMgWBGno1n5MNJ8WRFsQ
+DA:81,1,8p5UUpNfVPivYU8uMU+xOw
+DA:82,1,aOdxCy/5fAlFiJ1h0sSVKA
+DA:83,1,CaIGIDuesj+7+ilrTuM2Tw
+DA:85,1,AZcJIvGRC5YIw1devDm0pg
+DA:86,1,uqeFwN6OIUF4T3INhN8PuA
+DA:87,1,1GHgMyZvaxbxg298gyORBQ
+DA:89,1,GRka5VBX0Mpf3vd2WUkt5Q
+DA:91,1,10jKWSScUtwtcRG0/xHhbQ
+DA:92,1,yo4ymP0yijW37S2YGgUGvw
+DA:94,1,mnoV0T4hEkr2W8HjAfJidA
+DA:97,1,X7Jctv7Y9ipZV+LU0Dd22Q
+DA:100,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:101,1,ypArBlZxcx6r25dxNXTl3g
+DA:105,1,WE4WLKG8C21p5ChibiY1Iw
+DA:106,1,1bc0jMsA50Ih+vS89vfxrQ
+DA:107,1,wsRgeZL31aaARy0EujfQ6A
+DA:109,1,mQ8i1DUZClSVAWoriBZScQ
+DA:113,1,DMrmzAbOJlkXgq6rUeaYlA
+DA:115,1,Nnqu9X+lU2lagW39QNhFWA
+DA:116,1,sL59D/BjjwWVMqKu9HkeTw
+DA:125,1,sQ7Ma5M/TpG+U9Ms3noBjg
+DA:126,1,GsUMmn1YxtuQKRrAYK9nNA
+DA:127,1,0Y1+B1TSmbfSRzQ9pMUTHA
+DA:129,1,Nnqu9X+lU2lagW39QNhFWA
+DA:130,1,vkjAkPD8Ao5elLqVslDIcw
+DA:139,1,yRoDES/2Q+zM0Fx5DnQbDA
+DA:248,1,tthkdDrEm15qnNO7g867jA
+DA:283,1,K154voObD7ZMYRuZGTQwLw
+DA:333,1,oFk4/LXQsnfV3s7yGDIDKg
+DA:385,1,TqC6pt9k/KF3oa00wld4lw
+DA:417,1,IkXOcrtk1HS5qEunMWEk5Q
+DA:462,1,5WuCrhft5eDtavIvR5P2wA
+DA:492,1,Ck7hqKzpTB7t61NJHrwIRw
+DA:531,1,s1+20R2NwP5NOmBAVjKKwQ
+DA:557,1,i9DN/ESvXsne2v+/yfB9vQ
+DA:572,1,Fin1TeQsPt9tRT7FgUQT4g
+DA:587,1,3RAjC8fZi5I+/KlyMtgqIQ
+DA:634,1,Hcm43rH1gjEOi68sQji2bA
+DA:665,1,kG56jYdSh5PEJfk36h7uNw
+DA:696,1,2awQ2pFPV/egn3oJxxbmxg
+DA:711,1,HQLucIU2XZRdHr51Ku5A8Q
+DA:718,1,Wx/cXNJHnaDI2u+3wmOQGg
+DA:734,1,bMlvFTQDiYXd3MflSu0rVQ
+DA:755,1,9BUGTnGi/ZliN/CAZ+iajw
+DA:773,1,bTAwRnXaK4Wa20kPDLGKSg
+DA:88,0,Yb8gdxBoPLEii5OU9iFfwA
+DA:95,0,ackOWdJx2/IgtB/ELuvQJg
+DA:98,0,wWvyVCzDRWfTVXhFZNNl1w
+DA:103,0,om4nRigaE6pgcpmLzmdF0Q
+DA:110,0,spr+4axVYDaRG2yt7Z/d5w
+DA:137,0,TKy196zT//FvROowc6G68w
+DA:176,0,Wv8av44cMriVyynmGYIZ+Q
+DA:179,0,OJCKTMwKWT9oA7Sg0dONLg
+DA:180,0,sDJfAZAL8qWpOElxDvBP9A
+DA:181,0,TpJKA38uij5z4XqDsO2Nng
+DA:182,0,4zRUgNAnoxKS4ZhzrJ/m7A
+DA:183,0,CT1/BUzWx9XBDYaojDAFKw
+DA:184,0,gabIDNRI6UszC9H5dMxvUg
+DA:185,0,TEqSKYhHmm/2HF8RhamUGw
+DA:190,0,Xs6nEGgRJ5ugyLDWWVdTTA
+DA:191,0,WoZbRVV58B65RzFwmY+Dkg
+DA:192,0,xjCSp71/CkkHjP3yJR17PA
+DA:196,0,9xWuHscjiMOxdom+2Zqckw
+DA:198,0,qolm1WHjEZzTckpyc+/rEQ
+DA:204,0,vDfJPNwnCmeCF9bk+vyCBg
+DA:205,0,I3tqjGTZsr22UHaBW9W/zQ
+DA:206,0,79R8t27hx3nBoicW/eXI2A
+DA:207,0,P8eFp6qdHkwWKdQpulQE4g
+DA:211,0,tn1HD2bOfhyhrHM4FK3kiA
+DA:212,0,RwTcgbi0zpYQpHuDUDzU/A
+DA:215,0,3vAZVhWMwNRY4WvdY4hlRQ
+DA:226,0,EwboNcMWRQ2eAhV98aHUBA
+DA:227,0,XbEJrbsBRy/IVemCVgIL+g
+DA:230,0,841sOT5iWdZN3Y43+UXLOA
+DA:231,0,t/8E5bQvu3NHwzSUzNOYmw
+DA:234,0,1t6nQfOMNGE248MJuGnrSQ
+DA:237,0,Gx5tZGYoMcf7nPW9vei7SA
+DA:238,0,R9vUBW85FQkcpFTs4gNP8Q
+DA:239,0,tLLLhMLYRh6deyNLAELKBw
+DA:243,0,lrlvsn3SKpolZoPsDL9ITg
+DA:245,0,nO4AniocSOtViaoKYrN34A
+DA:269,0,xjcDBnSwra0OiNOAYAwoHA
+DA:271,0,TAIxg2RToZ8iBXNiWOEaKg
+DA:278,0,+oG1IqMT8gjQJNwrTZVSzg
+DA:279,0,rqOSYv65nziWPZcVBXpkDg
+DA:281,0,6Gn8Crfk1W1RGgnhaX7dAw
+DA:294,0,DqjC5e7q/cMO5RMWN3IMMA
+DA:295,0,JX95Hdz0mzdrmJrpwoha5Q
+DA:297,0,KiqEa42jbDahaapgV2051g
+DA:298,0,NVWldSQdkKEzq650fMq9bA
+DA:300,0,c+oDkFKrLEyxV7x/+wLy+w
+DA:303,0,zYr51ajArgGHf6FcEpeduw
+DA:304,0,9gfHvYWoFOSMkGxjd/Zspw
+DA:305,0,xjcDBnSwra0OiNOAYAwoHA
+DA:306,0,Tt+Tyj9xhsgG+wsunfT7Fw
+DA:307,0,2meXSwd+hK9QVRM5HcilCA
+DA:308,0,5U14NKQ+5LMVs0MHymCjOw
+DA:309,0,uP+Es/AcaWmKdb5GXptcOQ
+DA:310,0,aFu8HBbDdLHEf1bAObCdnw
+DA:311,0,OStFJlCallgcf3EY95aOqA
+DA:312,0,v30xjw/rKYGYIVodBqkq8A
+DA:313,0,p6KFk8382pBRfR+Eb3d4QA
+DA:314,0,2x14VNJAvG31+SPUDRUNHg
+DA:315,0,1K9XwnYNnsmyzrtCI55RNQ
+DA:316,0,XlNgPsllXGGo9La2a4X4vw
+DA:317,0,o/SVDlpUdCv4KDJ1cojtWw
+DA:319,0,m55rD7lKWeNMYhCTw7Ik0g
+DA:320,0,SLg7Thv47Bna4SIVm+pLFg
+DA:326,0,0YvuNA670iPFW1IAejtnlg
+DA:348,0,EGNruTy0X+Kp9Jkg/flHiw
+DA:349,0,Dwjd91USmMoWKfkSCVg/jg
+DA:350,0,NIhhOU4A6h8X1cFk44V50w
+DA:351,0,RppjTUHFwty27m2xWGe8og
+DA:352,0,0uyOO2npFjxcvNnpW0sunQ
+DA:353,0,fgoceC6jFgAkJRMmUi+Xig
+DA:354,0,uZaxC41qMM1FB82UbGveDg
+DA:355,0,egeGH0WCFDrynfdYasf3dA
+DA:356,0,rjDmmHsUHGBi/QarAVwPiw
+DA:357,0,xFrbOGpTPq98OhW9uFmMjw
+DA:360,0,R7EOIltGxPCV81tIJh9ZIw
+DA:361,0,lppJvAiWalj/RP10Wpe+HA
+DA:364,0,XI8OKj9s9UucwCJ4B06imw
+DA:365,0,FccZ2ChaWzzSU8p6U9/1AQ
+DA:367,0,dDIZx3PEi72u0ePx6phP3A
+DA:368,0,nVwE7nxJMZNcdhf0XdNJeQ
+DA:375,0,0Bu7+DUnO1Z+CoPoNd579A
+DA:376,0,5TA52XsRp4ShGyxFrrpw6A
+DA:378,0,LDfEkePt3N7EGLu6PX19YA
+DA:380,0,xD//Fkn+kpQyWk8pVb3isQ
+DA:397,0,lklPr4aNpzYQs3DI4bNH2g
+DA:398,0,xvWIcpcyNr0gyGcTkdMxXw
+DA:399,0,iIyXRVBiY0CS13SplFH8WA
+DA:400,0,73DqMM/tqQHuZOmnv6mLRw
+DA:401,0,1glSez1X9YSxeAtB6KUm7g
+DA:402,0,7EL02RozWKr+XwuMvn+poQ
+DA:403,0,CxG4YD21CZKEDuLszDARSg
+DA:404,0,GWa++x2hrM1/aA/9kSS/wA
+DA:406,0,iIyXRVBiY0CS13SplFH8WA
+DA:407,0,ctI1Z+DJgeWVu0OzJoeDTA
+DA:408,0,3b7eW6a/SHDvWzBiJ0a/Ag
+DA:410,0,hg+bivYKQiyujzy35su5Xw
+DA:415,0,gT31KA1yCDrekSyi7/nejA
+DA:425,0,aNO6RD05+QROmqa+SuJhkQ
+DA:426,0,Dwjd91USmMoWKfkSCVg/jg
+DA:428,0,eWcj2QbDPJ+BxNvzZjZ2lA
+DA:429,0,MdtykzmqmhOC+qblyrKwMg
+DA:430,0,R2utgrlIwYwHERHxaK7pCQ
+DA:431,0,P5TU1lICbMn6p2TpBCzhLA
+DA:432,0,tX+4Vs34/ldUBSSLV1XFPg
+DA:433,0,xJJwCtMukItXhXos+kYJbA
+DA:436,0,Cr5q+o/r83p5DavMXyIGRw
+DA:437,0,oz02lksDR7sGMOQ/pDeh1w
+DA:438,0,T7FlvJYB/FlQal4fknhQCA
+DA:439,0,nzU/Q8rUHaOuvi8TprRxTw
+DA:440,0,QhqwzWsLdsep5dSNGJsKkA
+DA:444,0,NxYcS7ZF0HEVeCrBUwAB/Q
+DA:445,0,Gxcxt44bjUmYEupJJUb9UA
+DA:447,0,kvK3I+eoDqZZBjlSiaEC2w
+DA:449,0,Akrojtv3gnMS3dIN5imzCQ
+DA:450,0,rrWUlBb0pCPhkXzowigZgw
+DA:451,0,LVvDIpM60yV/7lWk2lAvOA
+DA:452,0,2Yxx2z2+GLysG4aIbuW7gQ
+DA:453,0,sXQNrY7Qh3E06VlXr/L/Nw
+DA:454,0,JwVnJAfTTJ+op26EJpjFjg
+DA:455,0,Ac9KZa1mD7tUU8yxxlJ/MQ
+DA:456,0,ITJM17mjxAmUHh41P/YawA
+DA:457,0,RypuDorEFeGqprALXFyzJQ
+DA:458,0,a6l9bUWFP124h80vW+QOLg
+DA:460,0,wZKVg3rXDW4Rh2fr5c7GCA
+DA:469,0,4lF0OWAyi0pjm3I+Ex4C/A
+DA:470,0,8dJf82NLTBNLgn9Jrhpwzg
+DA:471,0,9gYpi3zNLir2AM9L2JfvtQ
+DA:472,0,bWxEwZ63NJSBBh/CMkWluw
+DA:473,0,sVuvcM+1XCINJ/OK2wR6cw
+DA:474,0,VFMLJQJGDgjsMkhIwfTvJA
+DA:475,0,1jxINXoq4uLI3sYXdgiYwg
+DA:476,0,oMf9aAuEY60io7dNZVCRVA
+DA:478,0,Z3l02J7Izwk4JFefvgO1+w
+DA:479,0,foTB5CT/+2AfeZp8f+7yrQ
+DA:480,0,iO8WugfhJWeSQcTom+8Zaw
+DA:481,0,R17UHoCo0WzHZZsd4eIVDg
+DA:482,0,3B3SbEGdGufJDNNZPPPdRg
+DA:483,0,N7GEaO9w7UTiIqfIqI5NUQ
+DA:485,0,l4ilPojsMliexEuGg8R0Zg
+DA:486,0,NEhP1cNcesXJM6BSNQbS9g
+DA:489,0,CBrjRRu+CXDBgDumfGBWLw
+DA:490,0,zVUJP7QvufiHi3EIYi3YvQ
+DA:499,0,4lF0OWAyi0pjm3I+Ex4C/A
+DA:500,0,8dJf82NLTBNLgn9Jrhpwzg
+DA:501,0,9gYpi3zNLir2AM9L2JfvtQ
+DA:502,0,bWxEwZ63NJSBBh/CMkWluw
+DA:503,0,tFGHM8lZncoGaf3B7gXKXw
+DA:504,0,GHpb33qqwWRX89JpmsJg8w
+DA:505,0,tfMZfxX3NFu5VJ8AWWXhtg
+DA:506,0,EkGkfI4JAgxBUiEFv85jEA
+DA:507,0,nCXmjEcgHTA9FTBsceB4NA
+DA:508,0,1aGk4agkDqxlnAOv1yqHIw
+DA:510,0,sVuvcM+1XCINJ/OK2wR6cw
+DA:511,0,VFMLJQJGDgjsMkhIwfTvJA
+DA:512,0,1jxINXoq4uLI3sYXdgiYwg
+DA:513,0,3iskCdRbxeVa9h9fSQEwzg
+DA:515,0,Z3l02J7Izwk4JFefvgO1+w
+DA:516,0,foTB5CT/+2AfeZp8f+7yrQ
+DA:517,0,iO8WugfhJWeSQcTom+8Zaw
+DA:518,0,R17UHoCo0WzHZZsd4eIVDg
+DA:519,0,3B3SbEGdGufJDNNZPPPdRg
+DA:520,0,N7GEaO9w7UTiIqfIqI5NUQ
+DA:522,0,l4ilPojsMliexEuGg8R0Zg
+DA:523,0,NEhP1cNcesXJM6BSNQbS9g
+DA:527,0,KdBcb6c275aGyrixBteLwg
+DA:529,0,X4nIL5HDN0uDVlEbyOWEZQ
+DA:537,0,V9kmgqLJA48/+mY9r/ff7Q
+DA:538,0,DrfO4azYNfu50X2Oeiw/Mg
+DA:539,0,QP0FJCIzxuyiOVRMCZXPUw
+DA:540,0,fg3qitju69EAXdqoZos04Q
+DA:541,0,U4BsvtP+mJC/r8QHid1cXg
+DA:542,0,T9Ynw4scG0XZBqY30hTxXw
+DA:543,0,fmduHTQOHtDomjbLp2RABA
+DA:544,0,qS25FdKz+GuagBapla5Ivg
+DA:545,0,BKEzIo72mt2H6JzmuqBc3A
+DA:547,0,D5TgPr65+dt7zyPaGR5Z1Q
+DA:548,0,e0AJc2jEk0x/FHu7Qy8iDg
+DA:552,0,sZ/ac+KVdF75gkKsC4xiHw
+DA:555,0,WoGK0qntVcds/C51IQHxJw
+DA:563,0,aHIsKrAPO5vmDFqfL9jGiA
+DA:564,0,Dwjd91USmMoWKfkSCVg/jg
+DA:566,0,j3smpybyknKJUlBA578+dg
+DA:567,0,VwQB9rl5yZRFvWkWy0zBCw
+DA:568,0,8kDQlqIGymhynsJElvb00Q
+DA:570,0,pB87FoWPqbNTTGCDOqtMBg
+DA:578,0,RdHTUiaTjbxhfYw5DDDjWw
+DA:579,0,Dwjd91USmMoWKfkSCVg/jg
+DA:581,0,DjeIjI8hjG6cQ2dBbWE/Gg
+DA:582,0,/jWE/++vMEKhrQiQApdumw
+DA:583,0,oT/2TEx+eI9IgkpYunyddg
+DA:585,0,DEYv7SPkZeJGz8NDBuhrrQ
+DA:609,0,MbH+0IPBGioiEUoX1xmUMw
+DA:610,0,MnzpXe1veqpfA7nIMRo0OA
+DA:612,0,XYLs/rVBa8qWx0Ph8VeRYg
+DA:613,0,jf/NmKBWJforyMcTEC81HA
+DA:622,0,ixZg6JmPlT0K257WPSYcfA
+DA:623,0,2LCD+nb7NNGKjlKlwyys/w
+DA:624,0,jPJfX3lHs8eCSiWwtbrpKw
+DA:625,0,nsNX9dS9vUaOlHRtpxqvtw
+DA:653,0,Sm6K1Oh/PKxMt218HG8j4A
+DA:654,0,cdyFQSBcw+5aeQ0XJYcvNQ
+DA:655,0,HZaGaOT2FP0PkOZsqMve3A
+DA:656,0,EFnI1Awg/z9hpBYVY2uMrg
+DA:657,0,Mj4g+KnNyNcDkFJcZ2FDOg
+DA:658,0,firc+/LWBHMgt93xjez7jQ
+DA:659,0,iDSNqNdB8QBy6UF5Gl4JhQ
+DA:661,0,6KHR6FDiuAE2BVhl29sOlw
+DA:677,0,jrMN71i85a5hJ8yalbV3OQ
+DA:678,0,FM34FbW7xhCMAgn8OnwZbg
+DA:679,0,WRiEjBdRivHF7N2Ed+v2lQ
+DA:681,0,lsMJzFschYtuWVwm6dnG8w
+DA:682,0,pKtejcsC1aTMD+rTix9+2A
+DA:683,0,9KgTBXcHpNKro1POyGfi+A
+DA:687,0,yCS93V1TuYDsG+kV3/Lt5g
+DA:688,0,MkFf4sYKInDZ9rUrEmj7Uw
+DA:689,0,tVeNEe9gaJMiVsaMnb0WIA
+DA:691,0,wOsNFB3x9Dq5pUH9me7KJw
+DA:692,0,+2N30rheXKKfadZGfT7KTg
+DA:694,0,OK9BqPPDg6dfVMYLBOqu/w
+DA:704,0,xjcDBnSwra0OiNOAYAwoHA
+DA:705,0,7n5aww2pywrHZFcMrGwuKQ
+DA:706,0,nUtFHaBFN584vqRZ7rVM7g
+DA:707,0,86LfS4vT8U3haozGFONIZQ
+DA:708,0,aG8hzM939a6klmerpUAbhg
+DA:709,0,mbMGZ7Kf4AGNvBHXcFByzg
+DA:716,0,BorTe+0HQpcr3zDD5zth5A
+DA:724,0,xjcDBnSwra0OiNOAYAwoHA
+DA:725,0,8s4f50fq5ArODS7XV/QvPg
+DA:726,0,c8nwtmEW1t5MtspOQSB7Mw
+DA:727,0,gdTm4L+Bvxgdi0hTn2UeOQ
+DA:728,0,MQAw7ryZXIqoa+XVvQuYKQ
+DA:729,0,c0NG1XIKlE20nx8isJHYNQ
+DA:742,0,xjcDBnSwra0OiNOAYAwoHA
+DA:743,0,oBMYiqiv+yZbk5Y6ebSrzQ
+DA:744,0,c8nwtmEW1t5MtspOQSB7Mw
+DA:745,0,gdTm4L+Bvxgdi0hTn2UeOQ
+DA:746,0,MQAw7ryZXIqoa+XVvQuYKQ
+DA:747,0,c0NG1XIKlE20nx8isJHYNQ
+DA:762,0,xjcDBnSwra0OiNOAYAwoHA
+DA:763,0,7n5aww2pywrHZFcMrGwuKQ
+DA:764,0,MQAw7ryZXIqoa+XVvQuYKQ
+DA:765,0,c0NG1XIKlE20nx8isJHYNQ
+DA:781,0,NQXiHTAyW9mlX69LYHBJVQ
+LF:310
+LH:67
+end_of_record
+TN:
+SF:unity_sds_apgs_client/api_response.py
+DA:1,1,up+Jk05WkkQnoJhVkj27OA
+DA:3,1,ydCxunymauVRdfWlNGpIBA
+DA:4,1,trcK9pAnALwbUj2tcqRG7Q
+DA:5,1,fTXi/pFa83SZXpkpXScO1A
+DA:7,1,S0pcSKxIVyyS+9/ideA+Rg
+DA:9,1,YA7coXH2j9gOGLjDSln6ug
+DA:10,1,/ZvqiDY7XVzMiSFdpC6ZCg
+DA:14,1,MFJW7qUKL3t+H+r3NQXr9w
+DA:15,1,QbRx49DKLxfX6VS8ghGuQQ
+DA:16,1,39Gkr2hgZIwsvXIzK0W7gw
+DA:17,1,Hdaeo7jllUyvddO4n/yNvA
+DA:19,1,o8YiORjaN3FnkCYNuskH+A
+LF:10
+LH:10
+end_of_record
+TN:
+SF:unity_sds_apgs_client/configuration.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:15,1,2/+ysJB2BBzVWbseKUaEjQ
+DA:16,1,EZEzNmL93PY96zsSuI0PfQ
+DA:17,1,ApjyhS1U2PZboEP6WIl26g
+DA:18,1,e0T+vIAAj5hu0lfCvp+CwA
+DA:19,1,mUDsnWRiqW9R9nTILGKIZg
+DA:20,1,jEc91tz0B1b2beSYnS+UDQ
+DA:21,1,QVi7pppJimfL+FuMB26y3g
+DA:23,1,gRGiH0xKWcl1MUDxeAyFxQ
+DA:25,1,yLtMsMY+g07zAtRo30NIww
+DA:31,1,9SHf7BWQgIEdLXlK/mOPPw
+DA:32,1,bETK/dBaTqmmsnjda7wiLw
+DA:65,1,DMrmzAbOJlkXgq6rUeaYlA
+DA:67,1,0/kqPmTb34yEvKFi6WDrRA
+DA:81,1,XMhQzU65+tXwKRjrTg/UeA
+DA:82,1,D/PuF7edTaxXpN++0a6LTA
+DA:84,1,WU8NAx3MDGqSUKjlTwY+Ww
+DA:85,1,1dKnbRqoSOcGPEN0mQK/aw
+DA:86,1,zBdCALLUDP7ShyU3ziBp4A
+DA:88,1,uaCufJNfbrevdhXHSjtYaw
+DA:89,1,FIfTQa9Rr8itHWQh+uun9A
+DA:90,1,gsGkDzjafRE81bW9gHgl5A
+DA:92,1,ig00G5iMAR2iJyhB4Gq3YQ
+DA:93,1,mV/Mmds9Ts1karYBODHwmg
+DA:95,1,eC3Efx7ho0KZFZIm7IbLFA
+DA:96,1,ueLLTo38ndF7ROs5hlInQQ
+DA:99,1,0Xe32FEP2rHCm0AWWvJRRQ
+DA:100,1,H2hUN6AL/7TX5C7mzvYvGQ
+DA:102,1,Xpabhl/imUBsket/A8u84w
+DA:104,1,VYj+WTs/42VZ1kiX1HnGAQ
+DA:105,1,w4LsAQ8iwPiNsTBPUKMXJg
+DA:107,1,1BC3Clpvt8DiT9UrmUSSYA
+DA:109,1,CSLA9AM+hnBObmOMJ2i26Q
+DA:110,1,cY/juQbBHwZ6mWDqX+HKCw
+DA:112,1,dtqlV9mtrgmwcabvHVUC7w
+DA:113,1,As9v4OZ1zdF2b6DLtKksNQ
+DA:115,1,wJEzWn/+AHNiTZbyYxuzCQ
+DA:116,1,73950BxIKDzPB3nfXHrg+w
+DA:118,1,Dp+OqmwMeiPWgLUguGaMIw
+DA:119,1,XGdi2Ac2MZJe4i+OKZsbfg
+DA:121,1,P1JZBb+3wUwyh9r71MeZVA
+DA:122,1,OAM9kusvEFjgbAopQTGmLQ
+DA:124,1,8V379MqX/5YigGd+OR/sJA
+DA:125,1,AP3EyNkaV302fAG7ucVyLw
+DA:126,1,wl67DKalM/HKZEg3bx873g
+DA:127,1,WJ7wbaQoZ5cIt8UO3OaNkQ
+DA:129,1,9yosVe7KFDBja1qIo0cM+Q
+DA:130,1,d56KecOu1b/q1NBCSimcAQ
+DA:132,1,wKL1vwuXbxqAuRWdJ+tjdA
+DA:133,1,nu7hmqg+xi+4BvyCn+vxDw
+DA:135,1,5LnEmGLCVA7Ui3XLKMHlnQ
+DA:136,1,TgxNKI9ymiCO6ijKm6EckQ
+DA:138,1,FewkYiE1g2QgF+l7KdSYqA
+DA:141,1,bwedKwS4IYQzb6J/judo0A
+DA:142,1,FnaZmhd3tNlG5jSDMIVZig
+DA:145,1,lSUmZlf2pGZGYmUbnqG69g
+DA:146,1,GGPvZ+kfEQr7zWviDgffxQ
+DA:150,1,YnzxGK0LSqXOew4WnsYhkw
+DA:151,1,9h62xiZyc6DxtNgo5GFhxA
+DA:153,1,LOC/MscP01vo2WTl9sS9Mg
+DA:154,1,Vayj6XOK/+md+rLAP9WMZA
+DA:156,1,xG/XPDkq0JNExjZK3Qsvwg
+DA:157,1,BkhlMZ5M0GlECrGyBVB64A
+DA:159,1,4VeDbyQl8cSnNgwxTjd2Hg
+DA:160,1,vWpPWXQ5W+rYVVb36gRaqA
+DA:162,1,PWLof3Tn30tnMtwsHyBOlQ
+DA:163,1,mFrOMcxBJGBgR/6L+A6dYw
+DA:167,1,pfEai2kLQ+6T9JcSAhQI8w
+DA:168,1,0O/fpmqzhpgG3wT3fcsLSA
+DA:175,1,whlASy0+ZxGpeU10dXZloQ
+DA:176,1,sCqZHbfzaCjOddLV0ANOPA
+DA:178,1,8n5B7wWNIoBOMForoFI/Yg
+DA:179,1,Kn7jdEUi8mtM06zU/dBhuA
+DA:181,1,VzlmRzT5DpHM89IH/y3nCA
+DA:182,1,lQ/xdOGdksfFu5I1LBmrVg
+DA:184,1,/zEe1eGdUmXhfVib26NUuw
+DA:185,1,ddD1bWKzvcZDW4xYNcOHEg
+DA:188,1,wqle25EaOttxUvuvw6I34w
+DA:190,1,urLQNQJF0YTngXqXz+9oEA
+DA:191,1,ydGPIDNzHr3hxUFKOXXpiw
+DA:194,1,oGuYTPmGnNKUfdVsFKqcHA
+DA:195,1,dFL1jtnqvn9C4QZyfBzchA
+DA:198,1,eYD3cFJS0OLZ3qvqVg2LJg
+DA:199,1,v5tVlr4QC29Er+qU/EeGQg
+DA:202,1,4vC9EH6AHm/qB4DbkXW/Tw
+DA:216,1,I+QmhWa5Q7im42yIpxqpPQ
+DA:217,1,ems2/YaTbIpGDg2mCtJmPQ
+DA:219,1,Nnqu9X+lU2lagW39QNhFWA
+DA:220,1,vkjAkPD8Ao5elLqVslDIcw
+DA:230,1,Nnqu9X+lU2lagW39QNhFWA
+DA:231,1,cQnyKYB68+TSV6jzHAyimg
+DA:240,1,Nnqu9X+lU2lagW39QNhFWA
+DA:241,1,sL59D/BjjwWVMqKu9HkeTw
+DA:250,1,sQ7Ma5M/TpG+U9Ms3noBjg
+DA:251,1,ecsGUULdZs6QsnqlwkEpEQ
+DA:252,1,0Y1+B1TSmbfSRzQ9pMUTHA
+DA:254,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:255,1,wQcF+BlRmffGTMhWXKDqNQ
+DA:266,1,ILf/c8Zs5iYYx07OH0nuKQ
+DA:267,1,4E4ddAEOyTNnHy1Po73Nxg
+DA:276,1,ag2O7hpY1CjS0x0z9aT7Nw
+DA:277,1,UCkDGS65Y/lKQigddm8ekw
+DA:285,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:286,1,2xjAAxN/7rvv7BjRp/XZlA
+DA:294,1,tFJS0TR6KFLAZLmm6SSQVw
+DA:295,1,tyEe8A4HYWf4gEBnRDII+g
+DA:316,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:317,1,iXRjPXMOLX88HcHwWh5Rhw
+DA:327,1,K7qORmtTlNLX9tIwUTT+CQ
+DA:328,1,j5GjaB889DQIlCwY3PB1VQ
+DA:336,1,/e0+sl3H9AbA6ZrJ3aaJ4A
+DA:337,1,tYgNJGdmbz5EV6XeiXavjA
+DA:339,1,GBtbGcik0ea6QRkHjkp1DA
+DA:356,1,IV7BH03RMG32CjMv1+/kUw
+DA:371,1,4/TNrZwPONo/ZjXuE9bPsQ
+DA:386,1,MyMpoohJ7KCbwm1TJ0z+xQ
+DA:398,1,ed8qRHI3jKtz2B2jEnGNfg
+DA:410,1,P1cl8jUQqinQGMcQIaYvSQ
+DA:449,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:450,1,AcGjNe5E9EmUckQD5Soxmg
+DA:454,1,YZ8yIOKiHnZFpW7ejEdb3w
+DA:455,1,E11tgscORnHXrTNm9Z7oWQ
+DA:101,0,917WzSHYynLIG3ULZbM0Uw
+DA:106,0,C25xwUEGQqTo3j7yHJ8yRQ
+DA:139,0,02CqaKuB1TpwSkVc/WI3zA
+DA:203,0,hNFF5LpKMcgq4m4z5uAS/A
+DA:204,0,MWYsKUS7ZNGi/K71D7qqww
+DA:205,0,PL+a0Kql8zQumpn5MJhnQA
+DA:206,0,ycAOsyo5cYFXyee5da9/mA
+DA:207,0,i0wxLbipYdyTdyjtPKOQcQ
+DA:208,0,EsrTAX49nWvNPxzDJWrtdw
+DA:210,0,8UEJx5pE2TanfeMOlcjBEg
+DA:212,0,rSRhnepGJE7HIc4EuW0cMg
+DA:213,0,4dho/cFO0QJoy1bD/9ii8A
+DA:214,0,cPa3dAsIk+eSRfSpgwNsyg
+DA:228,0,TKy196zT//FvROowc6G68w
+DA:238,0,BUVrq/8MLsPvH3G/ddg02A
+DA:264,0,Ji4bnpGHGmtoA5IE/gIi9w
+DA:280,0,Y4mezam8yRvT6haHvZOqTw
+DA:281,0,M6f3V/0S+sc4LMXPNZy6ag
+DA:282,0,jhvIkcEUl01aNDe6f0O22Q
+DA:283,0,WPSps+ZXHw6cdDDH5Kl9aA
+DA:292,0,nKYrkkmqO1Cz9opHN8yf5A
+DA:301,0,JVNHaLoQsMQHD/Uyrf71kA
+DA:302,0,7yxLbHj4VsKezqNd+JslMw
+DA:304,0,jhvIkcEUl01aNDe6f0O22Q
+DA:305,0,6HdNxxqmXZ26kGjxwfEMug
+DA:307,0,rk0z9h/7Ftmw7N/vZLmTdg
+DA:311,0,jhvIkcEUl01aNDe6f0O22Q
+DA:312,0,dRi2ADrgMstzeuEl4TK/4g
+DA:314,0,eB5GPshMRAQ8r4f5I5a93A
+DA:325,0,gGsrAzxnyja+UYD1t1pqWg
+DA:346,0,llv4NEclY79/iim2Ll1V9Q
+DA:347,0,p99aGwfNcMbUZSkMVpjSuA
+DA:348,0,iQ/ztY4ZqZEFi0TfcOVfOQ
+DA:349,0,E0Ndr5PCSkZOfV73eqo0sw
+DA:350,0,yuTmlCiCpJLtfz6jlqkK5w
+DA:351,0,yxYLIA92QDdY4b4cIIeikw
+DA:352,0,s+FK8qx/dd1iPDP6fwTwIA
+DA:354,0,LgnVCa03m5XbN1tmtKgu4w
+DA:361,0,ckzJ8wNg70aaAtSXJWXKCQ
+DA:362,0,U/DHDtHRPNCgNt0M4f1f7Q
+DA:363,0,HNRe6sNF2R1LWbcfVOiajg
+DA:364,0,B2RaMAUnyzeDYYw6+SztkA
+DA:365,0,F8U+sGLPv2J+9oBdO3F3qg
+DA:366,0,/5unPpzrGCUTzwJJJKSsLw
+DA:367,0,oij/ORAgk7QFqeE0DmScvA
+DA:376,0,SrTMHHoRni8LljRBaxzadg
+DA:377,0,hOc4OdVwR/1OXSTzn99Deg
+DA:378,0,UWlRSp3BOR09o5g7HBC/Zg
+DA:384,0,4/99OhkFYfONvW6TMHKkkw
+DA:391,0,Mw3mMBZyTcsNdb13r3j7UQ
+DA:403,0,R+8InUbBHLa2qQoc7tpflA
+DA:417,0,gLA3UQFzu/18BkmlaF2C1w
+DA:418,0,HY8rxZH6NAkIEniShIsv0g
+DA:420,0,b8ZHf9F5PQej94rC0DDglA
+DA:421,0,8d1ggOMwbd3if8iaoktAOw
+DA:423,0,xjcDBnSwra0OiNOAYAwoHA
+DA:424,0,0oQ69SHoVq5Oux7oZBwMeA
+DA:425,0,eDv4sdo0P607swGYhjlu+g
+DA:426,0,HVyrBJ61ni9ux6MdUIeaUA
+DA:430,0,nC2HKF0jNQqtkLd0Zr/Grw
+DA:433,0,qOSYl1LXfYVUQAnBRX3xZQ
+DA:434,0,YRji6eOztkxDW8gThERpBA
+DA:437,0,2OQMZoCv5WGqeMAN84J4Fw
+DA:439,0,ziMwbdP43Yl2rkv+Iw0+Vg
+DA:445,0,8TMGHyvhJtkVh0TZUelGOA
+DA:447,0,eQ78iCu++712trFyNCkbOw
+DA:452,0,Te/8+PcVdD3j5yNyxjw1WA
+DA:457,0,Qv2gFcUZ/h2wBRoVY5nPvw
+DA:458,0,uq1xzSyEuruXSkzKOlsBUA
+LF:189
+LH:120
+end_of_record
+TN:
+SF:unity_sds_apgs_client/exceptions.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:14,1,8d2CrmlOB2GQqBsCmpM3Nw
+DA:15,1,Gm7xNPPVXMJm0wNNsliqzg
+DA:17,1,+qK/dgkPP7FRtz7i2ryNog
+DA:18,1,S2HgRmv0Ow9GrxhmUtFydA
+DA:21,1,D0VDayUMb4bMWkioH9VUlA
+DA:22,1,TGd5SpYlW8PUUW4tQRg5iw
+DA:50,1,A7a34wfUNyh9efmu3rIKuw
+DA:51,1,7y30HRK4bIrZ2vfBm5iW9Q
+DA:68,1,3GOrGhC2lA7yYHSKYFR99g
+DA:69,1,7y30HRK4bIrZ2vfBm5iW9Q
+DA:87,1,rCECrPVBqXv2w4Cj3uXpAQ
+DA:88,1,7y30HRK4bIrZ2vfBm5iW9Q
+DA:104,1,xMlzPlPiPvo41t2H4K9hog
+DA:106,1,4LgMgWBGno1n5MNJ8WRFsQ
+DA:133,1,Nnqu9X+lU2lagW39QNhFWA
+DA:134,1,NoKVGBt2ITeHF804GBAb5A
+DA:157,1,j+CcxAIEiLeqjzkbiEHnZA
+DA:171,1,zUVFsXXIKTAmd1jNiamk+w
+DA:172,1,PdeqDqr4bOft68ON3+/7kg
+DA:175,1,f26v4zfuD7DKQU9tfEGRug
+DA:176,1,PdeqDqr4bOft68ON3+/7kg
+DA:179,1,rxNLt0JC9RNRtoSLWTxEug
+DA:180,1,PdeqDqr4bOft68ON3+/7kg
+DA:183,1,fH9uK155ISef36YwOldADw
+DA:184,1,PdeqDqr4bOft68ON3+/7kg
+DA:187,1,mYAy+3lbtI3yhVNkyq4F9A
+DA:188,1,PdeqDqr4bOft68ON3+/7kg
+DA:191,1,E5HgcJAAC7YVcLYO1lmTOw
+DA:41,0,Meyj1ZLtUuJT6F8UymDXdA
+DA:42,0,7noN3G27K5LBKcMeqcrTOw
+DA:43,0,lsGkYc4VhYpSiWnBOSJwog
+DA:44,0,EPFS6GjP/JcMyhBhti99Xg
+DA:45,0,YkYthLaUL5O/5cgVTSuhkg
+DA:46,0,O6TNssveCmGOpapsrTkHUQ
+DA:47,0,Qx96k2am58lVFLMGbWgfmw
+DA:61,0,Meyj1ZLtUuJT6F8UymDXdA
+DA:62,0,EPFS6GjP/JcMyhBhti99Xg
+DA:63,0,YkYthLaUL5O/5cgVTSuhkg
+DA:64,0,O6TNssveCmGOpapsrTkHUQ
+DA:65,0,vXnIf8jNZZz1QRh7MAaKPQ
+DA:80,0,Meyj1ZLtUuJT6F8UymDXdA
+DA:81,0,EPFS6GjP/JcMyhBhti99Xg
+DA:82,0,YkYthLaUL5O/5cgVTSuhkg
+DA:83,0,O6TNssveCmGOpapsrTkHUQ
+DA:84,0,3QtXI9hAIkEk7LePQYX2Vw
+DA:97,0,Meyj1ZLtUuJT6F8UymDXdA
+DA:98,0,EPFS6GjP/JcMyhBhti99Xg
+DA:99,0,YkYthLaUL5O/5cgVTSuhkg
+DA:100,0,O6TNssveCmGOpapsrTkHUQ
+DA:101,0,BYCpPE5roTgVVuJXu+mlGA
+DA:115,0,PN+KRWNonp3KhxxgmVMKbA
+DA:116,0,aTkl1CfTifV7VgIM032vPA
+DA:117,0,ChYK08AXc/WCk02UFyfCnQ
+DA:118,0,4VPuoQvINcH8KOXzptY2nw
+DA:119,0,UyHgYCi2lHuojylwSm/nqQ
+DA:121,0,NFhxaiFYLHATZDvRAvBnpQ
+DA:122,0,4nUUJAcqMmssmWxcTCNLrw
+DA:123,0,BgZ66HpvJ7rL1ARDxImvcg
+DA:124,0,dX45pKZZ6NJtOeq6o8G1pg
+DA:125,0,c1HV8gUKy7vOsffhdY89+g
+DA:126,0,jabyabswK1zeTVBcq/S5QQ
+DA:127,0,Uk1iEqLYWHwxE4nbWtF0CQ
+DA:128,0,sSRhPbJQZIwq6s5Y0/4wZQ
+DA:129,0,jcUcrUlQLqPE/0vq4Sa+DA
+DA:130,0,Mit16hMNcznEd8lSMy284Q
+DA:131,0,NDOAeZ+LrM2H0NljkEqLag
+DA:141,0,vCJUBkD2IQTVUgSt8zNlig
+DA:142,0,ROMPvS4JS/prAfF64KT7EQ
+DA:144,0,6TRYBc/3ymLC5BJjQHc5kQ
+DA:145,0,lp4GRTFfD0sgGqcSwfKqIg
+DA:147,0,mybssFZ8ngsVk+OxHSimBQ
+DA:148,0,wFCVd9IBRlw9/bfPv5+NXA
+DA:150,0,Qs0pyRa+tKGNlXZ0Z/cF4Q
+DA:151,0,nJLCObJUiCl2SHFw0I1lWw
+DA:153,0,alIs3GOisA5JbQuIkmQomw
+DA:154,0,xfbNwWoTsuHYiua+fbNorg
+DA:155,0,xmiAhxXhybhf+78+W6uzcg
+DA:159,0,wNMX0I8PqqzcKJzOB6jZug
+DA:161,0,LupmvhaVVENvp7dJ/IzXiw
+DA:162,0,5brQM357jFMEJGTjzl9u1g
+DA:165,0,Nkw44MmhcfzI2orFVtGw1g
+DA:166,0,HJJwJQUlTgxRtyOl3hNhkw
+DA:168,0,cwteFA87TpN6lMO8cQdjrA
+DA:193,0,bpi85sy3v1hut4GKjJMUfQ
+DA:194,0,dMxG7NwxKBWK38sfMaFroQ
+DA:195,0,zijjefz/T3PrL2/G3Y2Esg
+DA:196,0,EaiM0FlsjYtAgO8WIXlcvQ
+DA:198,0,KFWPep8ItMNVBxdy+426Yg
+DA:199,0,BJBlZsSWstphiTlZImt1kA
+LF:88
+LH:27
+end_of_record
+TN:
+SF:unity_sds_apgs_client/models/__init__.py
+DA:4,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:17,1,n+S4Q3M2X5b4GGJfzMpw6w
+LF:1
+LH:1
+end_of_record
+TN:
+SF:unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:15,1,ydCxunymauVRdfWlNGpIBA
+DA:16,1,jXQwuRSnDQOG8XUCnnsycg
+DA:17,1,XqRs0Xj9sy25/MIkviDZHQ
+DA:18,1,OaTlemF3bXMi5MP7Db8vkQ
+DA:20,1,3/4e3Gk5GuXaAGIZyPy68A
+DA:21,1,sZix1rjvO0gehaS1PuKJGA
+DA:22,1,eCP3SKU2HjSYjxO/cM1gVg
+DA:23,1,Gm7xNPPVXMJm0wNNsliqzg
+DA:25,1,jcpYJdG1gxP68ljG6m4ATw
+DA:26,1,/ZvqiDY7XVzMiSFdpC6ZCg
+DA:29,1,dzjgBukp3jnI6syjxYFR3Q
+DA:30,1,p2Xl3AuXk3iewvxG1CAiBg
+DA:31,1,5qU4IJ+FxPVKO0iwXRJJDg
+DA:33,1,bQAOMJFe1pWWTg/kwhNW/A
+DA:40,1,/kjMWq9hoYpwQrxEoNOLew
+DA:44,1,FB1dSNddycsxSk1O60gL1A
+DA:49,1,Nnqu9X+lU2lagW39QNhFWA
+DA:50,1,a2YFU5AlYpFZ6Mxyye5TuQ
+DA:54,1,CmdSuZgKibi/6SRT5iiW+Q
+DA:74,1,Nnqu9X+lU2lagW39QNhFWA
+DA:75,1,/HioYpvxXRQC9N2op74xWg
+DA:42,0,plYnTYc7gEFe96pURv6cbw
+DA:47,0,gaOQut2NlOQY2tXDuV59sQ
+DA:52,0,8lKaozUZbEqH+sj7nP/6qA
+DA:64,0,rlmslO5YBQF4z1s8K/qqYA
+DA:67,0,W1SSuJlGnxKEWEidVqysVw
+DA:72,0,5KOm6Sqlb3KyDijt4F7/hQ
+DA:77,0,EGNruTy0X+Kp9Jkg/flHiw
+DA:78,0,Dwjd91USmMoWKfkSCVg/jg
+DA:80,0,lPttVqCMv7zxaWYa8hWY+Q
+DA:81,0,OUlaMoKwBpPNewY7kUJl7g
+DA:83,0,2Gl3e1gIl+Vpf5KJXIXLRg
+DA:87,0,JCCYeaAOoRG6YyUo+YRpWw
+LF:32
+LH:20
+end_of_record
+TN:
+SF:unity_sds_apgs_client/rest.py
+DA:3,1,1+9wdnNK6ERHmSA06tdyPQ
+DA:15,1,xmMLoYBW1BFhJ6Xn+A/vug
+DA:16,1,OaTlemF3bXMi5MP7Db8vkQ
+DA:17,1,p7hNY1S5rX9QtYADf+cK4g
+DA:18,1,Ndg2bsTwQL/bjJU7FIwX/A
+DA:20,1,QVi7pppJimfL+FuMB26y3g
+DA:22,1,0Z0We7wRnyAJFxE866dvbg
+DA:24,1,VTyiTX+A4jxK7+DP9vGhlg
+DA:25,1,29NyqZ3QR7VkiCK1vXZW+A
+DA:28,1,P7F1ehu7C/pPJnuYPbqSOg
+DA:38,1,DMTW2hL+B51QdzJkFuux3g
+DA:40,1,rmh/ukvI9V2p08g6F/tGYg
+DA:46,1,kWXAxjzMoxa0AQWM6k7EKw
+DA:51,1,x/cN6njhV4/DacArAt4WyQ
+DA:55,1,eIH44Cd8M4w5kwYV1PvaUA
+DA:60,1,VBb9w5M4Syi/7lyKfOMAcQ
+DA:62,1,lWyW2VceismbjNeNX9YNXA
+DA:69,1,lbnToKP9wcjEWGvgGR6DRg
+DA:70,1,WBk46j2eAb7wYlzHta4GyA
+DA:74,1,DmFFmJhnngKJKvOigkdoDw
+DA:80,1,5pGnHSHFYjrpo08LkFXMTQ
+DA:85,1,MhRHcmWGeMZG7XdKKk0Sew
+DA:88,1,PPSF5eUUWIJMyX1CwSwh8w
+DA:92,1,3GiR00oDQMSMe+bTvsnXPA
+DA:95,1,dYoT58IlnWW9Whs5sDC4vQ
+DA:96,1,3AaPbUdbydTp0lZPJ1DdLA
+DA:99,1,b7HSsH0UhycuFnB4N2K5fg
+DA:101,1,VW2lacJK1j/8OLP76EvNQw
+DA:112,1,DjSPaEzz5sjrShCk2q4/WQ
+DA:114,1,f+GgTfAi/pnPH4nsKhUaKQ
+DA:29,0,BYAykC7R+NQWgDN+HDo3zA
+DA:30,0,W/g8GJDAYJkSSurt59Mzfw
+DA:31,0,+pQlDmZ80H1u4f7oz2H4cg
+DA:32,0,UAHh9L53QqIuZAm3Ow0WLw
+DA:33,0,W/g8GJDAYJkSSurt59Mzfw
+DA:35,0,2VP69puJhwo4Nbqq0MGgng
+DA:41,0,ZpSXVITclVoV5EstKeUevg
+DA:42,0,1/MN5bnmNMeb03TzJIUh9Q
+DA:43,0,bDb6OYObJEuszVuUs8JclQ
+DA:44,0,nD6IqmVnfgwLaLjYGRQZ+g
+DA:47,0,ZwwgrV0YK3jr7cUg0vt9Sw
+DA:48,0,yB3uHHOTbI9YvWykjp9vRg
+DA:49,0,vKBm9gBluxtcdhl4eyVhhg
+DA:53,0,BZWqBE0FsYkdm6JQw0POMQ
+DA:57,0,L7t5L9DZQKhEFBlTeiVMZA
+DA:72,0,KglTpPWbFCmJ9JrwYUQEqA
+DA:81,0,PzztaR1uOym3wfKC16aa8w
+DA:86,0,dX7rCSlW+J/qSwANu2V+ag
+DA:89,0,5uhHt7HOQE/uFiOC0dEVNg
+DA:93,0,YGCXLnsusHN5pdPTbyAsiw
+DA:102,0,+DrXDyQTkC+5Fe5Uk/920A
+DA:103,0,ZcEuVq0m4QUoJwEjw+gJ2w
+DA:104,0,9HYIGyhFXirrJBJoeyeZCA
+DA:105,0,6SAOj2Dd/kUq32DAlzABLQ
+DA:106,0,v3wUQDcgazcpQ8YuP8I3JA
+DA:108,0,9HYIGyhFXirrJBJoeyeZCA
+DA:109,0,hhPpRQVUrZrZQWFpeH+7sg
+DA:110,0,oodQ7gjARxsiZh9aeIFmRQ
+DA:137,0,ekw+Yxd0oOYIxTvl0R8U9w
+DA:138,0,d87v2C/v567I1due5ICT3w
+DA:148,0,9yAX/ZDULSv+pwMl/TlA4w
+DA:149,0,6KHR6FDiuAE2BVhl29sOlw
+DA:153,0,ZOsUn9L8Behy+XPfu4C76A
+DA:154,0,/rvErLdPVPhlxc+S2/drOA
+DA:156,0,qzOxFK2A3ccNd5zIgC0lbA
+DA:157,0,6VcFy/iAsA6V/rsPlv7JMg
+DA:158,0,Cx7iv9kh3d15w7VD4JuWEg
+DA:159,0,siMvQbwxTcEK4jIlVtpYZQ
+DA:160,0,A5mEjdFdMnwzkdLOxB4lUA
+DA:164,0,sWqEbJ/uqHBYG/trAcFjYg
+DA:169,0,xjcDBnSwra0OiNOAYAwoHA
+DA:171,0,wulkt29eBaw7/8Dlb+4dBg
+DA:174,0,PJetmWd4Grzf2f3Ezghy0w
+DA:175,0,D+AUVEp5jwmNg4l4Plltwg
+DA:179,0,i6RJ1Ueh/0qVRtvEZCEo7g
+DA:180,0,Gp5o00fX64m9WkaKGh9tKQ
+DA:181,0,7GiMgCidvgUf+3Hi67gnIA
+DA:182,0,Dmdi1JXr/4Hsr+whCTvIww
+DA:190,0,jlDeHtK+vyyEz2Nlo0Ldcg
+DA:191,0,Dmdi1JXr/4Hsr+whCTvIww
+DA:200,0,bRv1Fbyi8zsLEAZn4b2new
+DA:204,0,kfk1yfF61ngCCv6Mis9LCg
+DA:206,0,CqTo2nciOlSDVFzNtd7d5w
+DA:207,0,Dmdi1JXr/4Hsr+whCTvIww
+DA:219,0,YRjhErd8n13LKkcerBZO9g
+DA:220,0,Dmdi1JXr/4Hsr+whCTvIww
+DA:228,0,e5ZTIw1vQK0Tx6qS2rkaDw
+DA:229,0,VEVGfU3vz1cCZ0SAmJFQxA
+DA:230,0,Dmdi1JXr/4Hsr+whCTvIww
+DA:239,0,bVK2ScyURZDvhPNzDvqcfA
+DA:242,0,yC/4o/w1DcDxnSBdebS60Q
+DA:245,0,e4FpGTJN4X18FKYplVGhfg
+DA:253,0,J8JY+CgoelHIdCcIk6Dqtw
+DA:254,0,5DsgE4/9yEYPV5TN4bPnVg
+DA:255,0,Ead/nB45NOM2ipoOt9Gl7g
+DA:257,0,9esNaSvxdVZ8fy4tThCBOQ
+LF:95
+LH:29
+end_of_record
diff --git a/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md b/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md
new file mode 100644
index 0000000..d0ee11f
--- /dev/null
+++ b/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md
@@ -0,0 +1,28 @@
+# AdsAcbMcpCloneGet200Response
+
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**clone_url** | **str** | | [optional]
+**log_group_name** | **str** | | [optional]
+
+## Example
+
+```python
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import AdsAcbMcpCloneGet200Response
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of AdsAcbMcpCloneGet200Response from a JSON string
+ads_acb_mcp_clone_get200_response_instance = AdsAcbMcpCloneGet200Response.from_json(json)
+# print the JSON string representation of the object
+print(AdsAcbMcpCloneGet200Response.to_json())
+
+# convert the object into a dict
+ads_acb_mcp_clone_get200_response_dict = ads_acb_mcp_clone_get200_response_instance.to_dict()
+# create an instance of AdsAcbMcpCloneGet200Response from a dict
+ads_acb_mcp_clone_get200_response_from_dict = AdsAcbMcpCloneGet200Response.from_dict(ads_acb_mcp_clone_get200_response_dict)
+```
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
diff --git a/libs/app-package-build-client/docs/DefaultApi.md b/libs/app-package-build-client/docs/DefaultApi.md
new file mode 100644
index 0000000..f1f6459
--- /dev/null
+++ b/libs/app-package-build-client/docs/DefaultApi.md
@@ -0,0 +1,84 @@
+# unity_sds_apgs_client.DefaultApi
+
+All URIs are relative to *http://api.dev.mdps.mcp.nasa.gov*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**ads_acb_mcp_clone_get**](DefaultApi.md#ads_acb_mcp_clone_get) | **GET** /ads-acb/mcp-clone | Begins the MCP Clone process
+
+
+# **ads_acb_mcp_clone_get**
+> AdsAcbMcpCloneGet200Response ads_acb_mcp_clone_get(clone_url)
+
+Begins the MCP Clone process
+
+### Example
+
+* Bearer Authentication (bearerAuth):
+
+```python
+import unity_sds_apgs_client
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import AdsAcbMcpCloneGet200Response
+from unity_sds_apgs_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://api.dev.mdps.mcp.nasa.gov
+# See configuration.py for a list of all supported configuration parameters.
+configuration = unity_sds_apgs_client.Configuration(
+ host = "http://api.dev.mdps.mcp.nasa.gov"
+)
+
+# The client must configure the authentication and authorization parameters
+# in accordance with the API server security policy.
+# Examples for each auth method are provided below, use the example that
+# satisfies your auth use case.
+
+# Configure Bearer authorization: bearerAuth
+configuration = unity_sds_apgs_client.Configuration(
+ access_token = os.environ["BEARER_TOKEN"]
+)
+
+# Enter a context with an instance of the API client
+with unity_sds_apgs_client.ApiClient(configuration) as api_client:
+ # Create an instance of the API class
+ api_instance = unity_sds_apgs_client.DefaultApi(api_client)
+ clone_url = 'clone_url_example' # str |
+
+ try:
+ # Begins the MCP Clone process
+ api_response = api_instance.ads_acb_mcp_clone_get(clone_url)
+ print("The response of DefaultApi->ads_acb_mcp_clone_get:\n")
+ pprint(api_response)
+ except Exception as e:
+ print("Exception when calling DefaultApi->ads_acb_mcp_clone_get: %s\n" % e)
+```
+
+
+
+### Parameters
+
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **clone_url** | **str**| |
+
+### Return type
+
+[**AdsAcbMcpCloneGet200Response**](AdsAcbMcpCloneGet200Response.md)
+
+### Authorization
+
+[bearerAuth](../README.md#bearerAuth)
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+### HTTP response details
+
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+**200** | Successfully submitted a job | - |
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
diff --git a/libs/app-package-build-client/git_push.sh b/libs/app-package-build-client/git_push.sh
new file mode 100644
index 0000000..f53a75d
--- /dev/null
+++ b/libs/app-package-build-client/git_push.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+ git_host="github.com"
+ echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="GIT_USER_ID"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="GIT_REPO_ID"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="Minor update"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=$(git remote)
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
diff --git a/libs/app-package-build-client/poetry.lock b/libs/app-package-build-client/poetry.lock
new file mode 100644
index 0000000..53db2d1
--- /dev/null
+++ b/libs/app-package-build-client/poetry.lock
@@ -0,0 +1,644 @@
+# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+description = "Reusable constraint types to use with typing.Annotated"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
+
+[package.dependencies]
+typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""}
+
+[[package]]
+name = "cachetools"
+version = "5.4.0"
+description = "Extensible memoizing collections and decorators"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"},
+ {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"},
+]
+
+[[package]]
+name = "chardet"
+version = "5.2.0"
+description = "Universal encoding detector for Python 3"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"},
+ {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"},
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+description = "Cross-platform colored terminal text."
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+files = [
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+
+[[package]]
+name = "coverage"
+version = "7.6.1"
+description = "Code coverage measurement for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"},
+ {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"},
+ {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"},
+ {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"},
+ {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"},
+ {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"},
+ {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"},
+ {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"},
+ {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"},
+ {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"},
+ {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"},
+ {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"},
+ {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"},
+ {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"},
+ {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"},
+ {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"},
+ {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"},
+ {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"},
+ {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"},
+ {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"},
+ {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"},
+ {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"},
+ {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"},
+ {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"},
+ {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"},
+ {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"},
+ {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"},
+ {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"},
+ {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"},
+ {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"},
+ {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"},
+ {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"},
+ {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"},
+ {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"},
+ {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"},
+ {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"},
+ {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"},
+ {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"},
+ {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"},
+ {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"},
+ {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"},
+ {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"},
+ {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"},
+ {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"},
+]
+
+[package.dependencies]
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
+
+[package.extras]
+toml = ["tomli"]
+
+[[package]]
+name = "distlib"
+version = "0.3.8"
+description = "Distribution utilities"
+optional = false
+python-versions = "*"
+files = [
+ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"},
+ {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"},
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.2.2"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
+ {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
+[[package]]
+name = "filelock"
+version = "3.15.4"
+description = "A platform independent file lock."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"},
+ {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"]
+typing = ["typing-extensions (>=4.8)"]
+
+[[package]]
+name = "flake8"
+version = "5.0.4"
+description = "the modular source code checker: pep8 pyflakes and co"
+optional = false
+python-versions = ">=3.6.1"
+files = [
+ {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"},
+ {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
+]
+
+[package.dependencies]
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.9.0,<2.10.0"
+pyflakes = ">=2.5.0,<2.6.0"
+
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[package]]
+name = "mccabe"
+version = "0.7.0"
+description = "McCabe checker, plugin for flake8"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
+]
+
+[[package]]
+name = "mypy"
+version = "1.4.1"
+description = "Optional static typing for Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8"},
+ {file = "mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878"},
+ {file = "mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd"},
+ {file = "mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc"},
+ {file = "mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1"},
+ {file = "mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462"},
+ {file = "mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258"},
+ {file = "mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2"},
+ {file = "mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7"},
+ {file = "mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01"},
+ {file = "mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b"},
+ {file = "mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b"},
+ {file = "mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7"},
+ {file = "mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9"},
+ {file = "mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042"},
+ {file = "mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3"},
+ {file = "mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6"},
+ {file = "mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f"},
+ {file = "mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc"},
+ {file = "mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828"},
+ {file = "mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3"},
+ {file = "mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816"},
+ {file = "mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c"},
+ {file = "mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f"},
+ {file = "mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4"},
+ {file = "mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b"},
+]
+
+[package.dependencies]
+mypy-extensions = ">=1.0.0"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typing-extensions = ">=4.1.0"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+install-types = ["pip"]
+python2 = ["typed-ast (>=1.4.0,<2)"]
+reports = ["lxml"]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+description = "Type system extensions for programs checked with the mypy type checker."
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
+
+[[package]]
+name = "packaging"
+version = "24.1"
+description = "Core utilities for Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
+ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.2.2"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"},
+ {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
+type = ["mypy (>=1.8)"]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "pycodestyle"
+version = "2.9.1"
+description = "Python style guide checker"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"},
+ {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"},
+]
+
+[[package]]
+name = "pydantic"
+version = "2.8.2"
+description = "Data validation using Python type hints"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"},
+ {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"},
+]
+
+[package.dependencies]
+annotated-types = ">=0.4.0"
+pydantic-core = "2.20.1"
+typing-extensions = [
+ {version = ">=4.12.2", markers = "python_version >= \"3.13\""},
+ {version = ">=4.6.1", markers = "python_version < \"3.13\""},
+]
+
+[package.extras]
+email = ["email-validator (>=2.0.0)"]
+
+[[package]]
+name = "pydantic-core"
+version = "2.20.1"
+description = "Core functionality for Pydantic validation and serialization"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"},
+ {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"},
+ {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"},
+ {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"},
+ {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"},
+ {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"},
+ {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"},
+ {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"},
+ {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"},
+ {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"},
+ {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"},
+ {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"},
+ {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"},
+ {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"},
+ {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"},
+ {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"},
+ {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"},
+ {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"},
+ {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"},
+ {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"},
+ {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"},
+ {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"},
+]
+
+[package.dependencies]
+typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
+
+[[package]]
+name = "pyflakes"
+version = "2.5.0"
+description = "passive checker of Python programs"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"},
+ {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
+]
+
+[[package]]
+name = "pyproject-api"
+version = "1.7.1"
+description = "API to interact with the python pyproject.toml based projects"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"},
+ {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"},
+]
+
+[package.dependencies]
+packaging = ">=24.1"
+tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
+
+[package.extras]
+docs = ["furo (>=2024.5.6)", "sphinx-autodoc-typehints (>=2.2.1)"]
+testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=70.1)"]
+
+[[package]]
+name = "pytest"
+version = "8.3.2"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"},
+ {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=1.5,<2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
+
+[package.extras]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "pytest-cov"
+version = "4.1.0"
+description = "Pytest plugin for measuring coverage."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
+ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
+]
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+description = "Extensions to the standard Python datetime module"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+files = [
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
+]
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+
+[[package]]
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+
+[[package]]
+name = "tox"
+version = "4.16.0"
+description = "tox is a generic virtualenv management and test command line tool"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "tox-4.16.0-py3-none-any.whl", hash = "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0"},
+ {file = "tox-4.16.0.tar.gz", hash = "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748"},
+]
+
+[package.dependencies]
+cachetools = ">=5.3.3"
+chardet = ">=5.2"
+colorama = ">=0.4.6"
+filelock = ">=3.15.4"
+packaging = ">=24.1"
+platformdirs = ">=4.2.2"
+pluggy = ">=1.5"
+pyproject-api = ">=1.7.1"
+tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
+virtualenv = ">=20.26.3"
+
+[package.extras]
+docs = ["furo (>=2024.5.6)", "sphinx (>=7.3.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"]
+testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.2)", "time-machine (>=2.14.2)", "wheel (>=0.43)"]
+
+[[package]]
+name = "types-python-dateutil"
+version = "2.9.0.20240316"
+description = "Typing stubs for python-dateutil"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"},
+ {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"},
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+description = "Backported and Experimental Type Hints for Python 3.8+"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
+ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
+]
+
+[[package]]
+name = "urllib3"
+version = "2.2.2"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
+ {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
+h2 = ["h2 (>=4,<5)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "virtualenv"
+version = "20.26.3"
+description = "Virtual Python Environment builder"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"},
+ {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"},
+]
+
+[package.dependencies]
+distlib = ">=0.3.7,<1"
+filelock = ">=3.12.2,<4"
+platformdirs = ">=3.9.1,<5"
+
+[package.extras]
+docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.8"
+content-hash = "2812b12ccaa6cd9fd89b97054aba22a0f2b8c8e2db8fa632298af918cf3285a1"
diff --git a/libs/app-package-build-client/pyproject.toml b/libs/app-package-build-client/pyproject.toml
new file mode 100644
index 0000000..d4f7587
--- /dev/null
+++ b/libs/app-package-build-client/pyproject.toml
@@ -0,0 +1,76 @@
+[tool.poetry]
+name = "unity-sds-apgs-client"
+version = "0.1.0"
+description = "App Package API"
+authors = ["OpenAPI Generator Community "]
+license = "NoLicense"
+readme = "README.md"
+repository = "https://github.com/GIT_USER_ID/GIT_REPO_ID"
+keywords = ["OpenAPI", "OpenAPI-Generator", "App Package API"]
+include = ["unity_sds_apgs_client/py.typed"]
+
+[tool.isort]
+profile = "black"
+
+[tool.poetry.dependencies]
+python = "^3.8"
+
+urllib3 = ">= 1.25.3"
+python-dateutil = ">=2.8.2"
+pydantic = ">=2"
+typing-extensions = ">=4.7.1"
+
+[tool.poetry.dev-dependencies]
+pytest = ">=7.2.1"
+tox = ">=3.9.0"
+flake8 = ">=4.0.0"
+types-python-dateutil = ">=2.8.19.14"
+mypy = "1.4.1"
+coverage = "^7.3.1"
+pytest-cov = "^4.1.0"
+
+
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"
+
+[tool.pylint.'MESSAGES CONTROL']
+extension-pkg-whitelist = "pydantic"
+
+[tool.mypy]
+files = [
+ "unity_sds_apgs_client",
+ #"test", # auto-generated tests
+ "tests", # hand-written tests
+]
+# TODO: enable "strict" once all these individual checks are passing
+# strict = true
+
+# List from: https://mypy.readthedocs.io/en/stable/existing_code.html#introduce-stricter-options
+warn_unused_configs = true
+warn_redundant_casts = true
+warn_unused_ignores = true
+
+## Getting these passing should be easy
+strict_equality = true
+strict_concatenate = true
+
+## Strongly recommend enabling this one as soon as you can
+check_untyped_defs = true
+
+## These shouldn't be too much additional work, but may be tricky to
+## get passing if you use a lot of untyped libraries
+disallow_subclassing_any = true
+disallow_untyped_decorators = true
+disallow_any_generics = true
+
+### These next few are various gradations of forcing use of type annotations
+#disallow_untyped_calls = true
+#disallow_incomplete_defs = true
+#disallow_untyped_defs = true
+#
+### This one isn't too hard to get passing, but return on investment is lower
+#no_implicit_reexport = true
+#
+### This one can be tricky to get passing if you use a lot of untyped libraries
+#warn_return_any = true
diff --git a/libs/app-package-build-client/requirements.txt b/libs/app-package-build-client/requirements.txt
new file mode 100644
index 0000000..80776ee
--- /dev/null
+++ b/libs/app-package-build-client/requirements.txt
@@ -0,0 +1,5 @@
+pydantic >= 2
+python_dateutil >= 2.5.3
+setuptools >= 21.0.0
+typing-extensions >= 4.7.1
+urllib3 >= 1.25.3, < 2.1.0
diff --git a/libs/app-package-build-client/setup.cfg b/libs/app-package-build-client/setup.cfg
new file mode 100644
index 0000000..11433ee
--- /dev/null
+++ b/libs/app-package-build-client/setup.cfg
@@ -0,0 +1,2 @@
+[flake8]
+max-line-length=99
diff --git a/libs/app-package-build-client/setup.py b/libs/app-package-build-client/setup.py
new file mode 100644
index 0000000..f6ea4f0
--- /dev/null
+++ b/libs/app-package-build-client/setup.py
@@ -0,0 +1,49 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+from setuptools import find_packages, setup # noqa: H301
+
+# To install the library, run the following
+#
+# python setup.py install
+#
+# prerequisite: setuptools
+# http://pypi.python.org/pypi/setuptools
+NAME = "unity-sds-apgs-client"
+VERSION = "1.0.0"
+PYTHON_REQUIRES = ">=3.7"
+REQUIRES = [
+ "urllib3 >= 1.25.3, < 2.1.0",
+ "python-dateutil",
+ "pydantic >= 2",
+ "typing-extensions >= 4.7.1",
+]
+
+setup(
+ name=NAME,
+ version=VERSION,
+ description="App Package API",
+ author="OpenAPI Generator community",
+ author_email="team@openapitools.org",
+ url="",
+ keywords=["OpenAPI", "OpenAPI-Generator", "App Package API"],
+ install_requires=REQUIRES,
+ packages=find_packages(exclude=["test", "tests"]),
+ include_package_data=True,
+ long_description_content_type="text/markdown",
+ long_description="""\
+ Service for application package generation
+ """, # noqa: E501
+ package_data={"unity_sds_apgs_client": ["py.typed"]},
+)
diff --git a/libs/app-package-build-client/test-requirements.txt b/libs/app-package-build-client/test-requirements.txt
new file mode 100644
index 0000000..9c375f0
--- /dev/null
+++ b/libs/app-package-build-client/test-requirements.txt
@@ -0,0 +1,5 @@
+mypy>=1.4.1
+pytest~=7.1.3
+pytest-cov>=2.8.1
+pytest-randomly>=3.12.0
+types-python-dateutil>=2.8.19
diff --git a/libs/app-package-build-client/test/__init__.py b/libs/app-package-build-client/test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py b/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py
new file mode 100644
index 0000000..40cdf11
--- /dev/null
+++ b/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py
@@ -0,0 +1,56 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+import unittest
+
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import (
+ AdsAcbMcpCloneGet200Response,
+)
+
+
+class TestAdsAcbMcpCloneGet200Response(unittest.TestCase):
+ """AdsAcbMcpCloneGet200Response unit test stubs"""
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def make_instance(self, include_optional) -> AdsAcbMcpCloneGet200Response:
+ """Test AdsAcbMcpCloneGet200Response
+ include_optional is a boolean, when False only required
+ params are included, when True both required and
+ optional params are included"""
+ # uncomment below to create an instance of `AdsAcbMcpCloneGet200Response`
+ """
+ model = AdsAcbMcpCloneGet200Response()
+ if include_optional:
+ return AdsAcbMcpCloneGet200Response(
+ clone_url = '',
+ log_group_name = ''
+ )
+ else:
+ return AdsAcbMcpCloneGet200Response(
+ )
+ """
+
+ def testAdsAcbMcpCloneGet200Response(self):
+ """Test AdsAcbMcpCloneGet200Response"""
+ # inst_req_only = self.make_instance(include_optional=False)
+ # inst_req_and_optional = self.make_instance(include_optional=True)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/libs/app-package-build-client/test/test_default_api.py b/libs/app-package-build-client/test/test_default_api.py
new file mode 100644
index 0000000..330c17f
--- /dev/null
+++ b/libs/app-package-build-client/test/test_default_api.py
@@ -0,0 +1,38 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+import unittest
+
+from unity_sds_apgs_client.api.default_api import DefaultApi
+
+
+class TestDefaultApi(unittest.TestCase):
+ """DefaultApi unit test stubs"""
+
+ def setUp(self) -> None:
+ self.api = DefaultApi()
+
+ def tearDown(self) -> None:
+ pass
+
+ def test_ads_acb_mcp_clone_get(self) -> None:
+ """Test case for ads_acb_mcp_clone_get
+
+ Begins the MCP Clone process
+ """
+ pass
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/libs/app-package-build-client/tox.ini b/libs/app-package-build-client/tox.ini
new file mode 100644
index 0000000..09ae02a
--- /dev/null
+++ b/libs/app-package-build-client/tox.ini
@@ -0,0 +1,9 @@
+[tox]
+envlist = py3
+
+[testenv]
+deps=-r{toxinidir}/requirements.txt
+ -r{toxinidir}/test-requirements.txt
+
+commands=
+ pytest --cov=unity_sds_apgs_client
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/__init__.py
new file mode 100644
index 0000000..4f46ff9
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/__init__.py
@@ -0,0 +1,38 @@
+# coding: utf-8
+
+# flake8: noqa
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+__version__ = "1.0.0"
+
+# import apis into sdk package
+from unity_sds_apgs_client.api.default_api import DefaultApi
+from unity_sds_apgs_client.api_client import ApiClient
+
+# import ApiClient
+from unity_sds_apgs_client.api_response import ApiResponse
+from unity_sds_apgs_client.configuration import Configuration
+from unity_sds_apgs_client.exceptions import (
+ ApiAttributeError,
+ ApiException,
+ ApiKeyError,
+ ApiTypeError,
+ ApiValueError,
+ OpenApiException,
+)
+
+# import models into sdk package
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import (
+ AdsAcbMcpCloneGet200Response,
+)
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py
new file mode 100644
index 0000000..a14f630
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py
@@ -0,0 +1,4 @@
+# flake8: noqa
+
+# import apis into api package
+from unity_sds_apgs_client.api.default_api import DefaultApi
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py b/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py
new file mode 100644
index 0000000..04267b0
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py
@@ -0,0 +1,274 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+from typing import Any, Dict, List, Optional, Tuple, Union
+
+from pydantic import Field, StrictFloat, StrictInt, StrictStr, validate_call
+from typing_extensions import Annotated
+
+from unity_sds_apgs_client.api_client import ApiClient, RequestSerialized
+from unity_sds_apgs_client.api_response import ApiResponse
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import (
+ AdsAcbMcpCloneGet200Response,
+)
+from unity_sds_apgs_client.rest import RESTResponseType
+
+
+class DefaultApi:
+ """NOTE: This class is auto generated by OpenAPI Generator
+ Ref: https://openapi-generator.tech
+
+ Do not edit the class manually.
+ """
+
+ def __init__(self, api_client=None) -> None:
+ if api_client is None:
+ api_client = ApiClient.get_default()
+ self.api_client = api_client
+
+ @validate_call
+ def ads_acb_mcp_clone_get(
+ self,
+ clone_url: StrictStr,
+ _request_timeout: Union[
+ None,
+ Annotated[StrictFloat, Field(gt=0)],
+ Tuple[
+ Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
+ ],
+ ] = None,
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
+ _content_type: Optional[StrictStr] = None,
+ _headers: Optional[Dict[StrictStr, Any]] = None,
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
+ ) -> AdsAcbMcpCloneGet200Response:
+ """Begins the MCP Clone process
+
+
+ :param clone_url: (required)
+ :type clone_url: str
+ :param _request_timeout: timeout setting for this request. If one
+ number provided, it will be total request
+ timeout. It can also be a pair (tuple) of
+ (connection, read) timeouts.
+ :type _request_timeout: int, tuple(int, int), optional
+ :param _request_auth: set to override the auth_settings for an a single
+ request; this effectively ignores the
+ authentication in the spec for a single request.
+ :type _request_auth: dict, optional
+ :param _content_type: force content-type for the request.
+ :type _content_type: str, Optional
+ :param _headers: set to override the headers for a single
+ request; this effectively ignores the headers
+ in the spec for a single request.
+ :type _headers: dict, optional
+ :param _host_index: set to override the host_index for a single
+ request; this effectively ignores the host_index
+ in the spec for a single request.
+ :type _host_index: int, optional
+ :return: Returns the result object.
+ """ # noqa: E501
+
+ _param = self._ads_acb_mcp_clone_get_serialize(
+ clone_url=clone_url,
+ _request_auth=_request_auth,
+ _content_type=_content_type,
+ _headers=_headers,
+ _host_index=_host_index,
+ )
+
+ _response_types_map: Dict[str, Optional[str]] = {
+ "200": "AdsAcbMcpCloneGet200Response",
+ }
+ response_data = self.api_client.call_api(
+ *_param, _request_timeout=_request_timeout
+ )
+ response_data.read()
+ return self.api_client.response_deserialize(
+ response_data=response_data,
+ response_types_map=_response_types_map,
+ ).data
+
+ @validate_call
+ def ads_acb_mcp_clone_get_with_http_info(
+ self,
+ clone_url: StrictStr,
+ _request_timeout: Union[
+ None,
+ Annotated[StrictFloat, Field(gt=0)],
+ Tuple[
+ Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
+ ],
+ ] = None,
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
+ _content_type: Optional[StrictStr] = None,
+ _headers: Optional[Dict[StrictStr, Any]] = None,
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
+ ) -> ApiResponse[AdsAcbMcpCloneGet200Response]:
+ """Begins the MCP Clone process
+
+
+ :param clone_url: (required)
+ :type clone_url: str
+ :param _request_timeout: timeout setting for this request. If one
+ number provided, it will be total request
+ timeout. It can also be a pair (tuple) of
+ (connection, read) timeouts.
+ :type _request_timeout: int, tuple(int, int), optional
+ :param _request_auth: set to override the auth_settings for an a single
+ request; this effectively ignores the
+ authentication in the spec for a single request.
+ :type _request_auth: dict, optional
+ :param _content_type: force content-type for the request.
+ :type _content_type: str, Optional
+ :param _headers: set to override the headers for a single
+ request; this effectively ignores the headers
+ in the spec for a single request.
+ :type _headers: dict, optional
+ :param _host_index: set to override the host_index for a single
+ request; this effectively ignores the host_index
+ in the spec for a single request.
+ :type _host_index: int, optional
+ :return: Returns the result object.
+ """ # noqa: E501
+
+ _param = self._ads_acb_mcp_clone_get_serialize(
+ clone_url=clone_url,
+ _request_auth=_request_auth,
+ _content_type=_content_type,
+ _headers=_headers,
+ _host_index=_host_index,
+ )
+
+ _response_types_map: Dict[str, Optional[str]] = {
+ "200": "AdsAcbMcpCloneGet200Response",
+ }
+ response_data = self.api_client.call_api(
+ *_param, _request_timeout=_request_timeout
+ )
+ response_data.read()
+ return self.api_client.response_deserialize(
+ response_data=response_data,
+ response_types_map=_response_types_map,
+ )
+
+ @validate_call
+ def ads_acb_mcp_clone_get_without_preload_content(
+ self,
+ clone_url: StrictStr,
+ _request_timeout: Union[
+ None,
+ Annotated[StrictFloat, Field(gt=0)],
+ Tuple[
+ Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
+ ],
+ ] = None,
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
+ _content_type: Optional[StrictStr] = None,
+ _headers: Optional[Dict[StrictStr, Any]] = None,
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
+ ) -> RESTResponseType:
+ """Begins the MCP Clone process
+
+
+ :param clone_url: (required)
+ :type clone_url: str
+ :param _request_timeout: timeout setting for this request. If one
+ number provided, it will be total request
+ timeout. It can also be a pair (tuple) of
+ (connection, read) timeouts.
+ :type _request_timeout: int, tuple(int, int), optional
+ :param _request_auth: set to override the auth_settings for an a single
+ request; this effectively ignores the
+ authentication in the spec for a single request.
+ :type _request_auth: dict, optional
+ :param _content_type: force content-type for the request.
+ :type _content_type: str, Optional
+ :param _headers: set to override the headers for a single
+ request; this effectively ignores the headers
+ in the spec for a single request.
+ :type _headers: dict, optional
+ :param _host_index: set to override the host_index for a single
+ request; this effectively ignores the host_index
+ in the spec for a single request.
+ :type _host_index: int, optional
+ :return: Returns the result object.
+ """ # noqa: E501
+
+ _param = self._ads_acb_mcp_clone_get_serialize(
+ clone_url=clone_url,
+ _request_auth=_request_auth,
+ _content_type=_content_type,
+ _headers=_headers,
+ _host_index=_host_index,
+ )
+
+ _response_types_map: Dict[str, Optional[str]] = {
+ "200": "AdsAcbMcpCloneGet200Response",
+ }
+ response_data = self.api_client.call_api(
+ *_param, _request_timeout=_request_timeout
+ )
+ return response_data.response
+
+ def _ads_acb_mcp_clone_get_serialize(
+ self,
+ clone_url,
+ _request_auth,
+ _content_type,
+ _headers,
+ _host_index,
+ ) -> RequestSerialized:
+
+ _host = None
+
+ _collection_formats: Dict[str, str] = {}
+
+ _path_params: Dict[str, str] = {}
+ _query_params: List[Tuple[str, str]] = []
+ _header_params: Dict[str, Optional[str]] = _headers or {}
+ _form_params: List[Tuple[str, str]] = []
+ _files: Dict[str, Union[str, bytes]] = {}
+ _body_params: Optional[bytes] = None
+
+ # process the path parameters
+ # process the query parameters
+ # process the header parameters
+ if clone_url is not None:
+ _header_params["clone_url"] = clone_url
+ # process the form parameters
+ # process the body parameter
+
+ # set the HTTP header `Accept`
+ if "Accept" not in _header_params:
+ _header_params["Accept"] = self.api_client.select_header_accept(
+ ["application/json"]
+ )
+
+ # authentication setting
+ _auth_settings: List[str] = ["bearerAuth"]
+
+ return self.api_client.param_serialize(
+ method="GET",
+ resource_path="/ads-acb/mcp-clone",
+ path_params=_path_params,
+ query_params=_query_params,
+ header_params=_header_params,
+ body=_body_params,
+ post_params=_form_params,
+ files=_files,
+ auth_settings=_auth_settings,
+ collection_formats=_collection_formats,
+ _host=_host,
+ _request_auth=_request_auth,
+ )
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api_client.py b/libs/app-package-build-client/unity_sds_apgs_client/api_client.py
new file mode 100644
index 0000000..da82cf3
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/api_client.py
@@ -0,0 +1,728 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+import datetime
+import json
+import mimetypes
+import os
+import re
+import tempfile
+from enum import Enum
+from typing import Dict, List, Optional, Tuple, Union
+from urllib.parse import quote
+
+from dateutil.parser import parse
+from pydantic import SecretStr
+
+import unity_sds_apgs_client.models
+from unity_sds_apgs_client import rest
+from unity_sds_apgs_client.api_response import ApiResponse
+from unity_sds_apgs_client.api_response import T as ApiResponseT
+from unity_sds_apgs_client.configuration import Configuration
+from unity_sds_apgs_client.exceptions import ApiException, ApiValueError
+
+RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]]
+
+
+class ApiClient:
+ """Generic API client for OpenAPI client library builds.
+
+ OpenAPI generic API client. This client handles the client-
+ server communication, and is invariant across implementations. Specifics of
+ the methods and models for each application are generated from the OpenAPI
+ templates.
+
+ :param configuration: .Configuration object for this client
+ :param header_name: a header to pass when making calls to the API.
+ :param header_value: a header value to pass when making calls to
+ the API.
+ :param cookie: a cookie to include in the header when making calls
+ to the API
+ """
+
+ PRIMITIVE_TYPES = (float, bool, bytes, str, int)
+ NATIVE_TYPES_MAPPING = {
+ "int": int,
+ "long": int, # TODO remove as only py3 is supported?
+ "float": float,
+ "str": str,
+ "bool": bool,
+ "date": datetime.date,
+ "datetime": datetime.datetime,
+ "object": object,
+ }
+ _pool = None
+
+ def __init__(
+ self, configuration=None, header_name=None, header_value=None, cookie=None
+ ) -> None:
+ # use default configuration if none is provided
+ if configuration is None:
+ configuration = Configuration.get_default()
+ self.configuration = configuration
+
+ self.rest_client = rest.RESTClientObject(configuration)
+ self.default_headers = {}
+ if header_name is not None:
+ self.default_headers[header_name] = header_value
+ self.cookie = cookie
+ # Set default User-Agent.
+ self.user_agent = "OpenAPI-Generator/1.0.0/python"
+ self.client_side_validation = configuration.client_side_validation
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ pass
+
+ @property
+ def user_agent(self):
+ """User agent for this API client"""
+ return self.default_headers["User-Agent"]
+
+ @user_agent.setter
+ def user_agent(self, value):
+ self.default_headers["User-Agent"] = value
+
+ def set_default_header(self, header_name, header_value):
+ self.default_headers[header_name] = header_value
+
+ _default = None
+
+ @classmethod
+ def get_default(cls):
+ """Return new instance of ApiClient.
+
+ This method returns newly created, based on default constructor,
+ object of ApiClient class or returns a copy of default
+ ApiClient.
+
+ :return: The ApiClient object.
+ """
+ if cls._default is None:
+ cls._default = ApiClient()
+ return cls._default
+
+ @classmethod
+ def set_default(cls, default):
+ """Set default instance of ApiClient.
+
+ It stores default ApiClient.
+
+ :param default: object of ApiClient.
+ """
+ cls._default = default
+
+ def param_serialize(
+ self,
+ method,
+ resource_path,
+ path_params=None,
+ query_params=None,
+ header_params=None,
+ body=None,
+ post_params=None,
+ files=None,
+ auth_settings=None,
+ collection_formats=None,
+ _host=None,
+ _request_auth=None,
+ ) -> RequestSerialized:
+ """Builds the HTTP request params needed by the request.
+ :param method: Method to call.
+ :param resource_path: Path to method endpoint.
+ :param path_params: Path parameters in the url.
+ :param query_params: Query parameters in the url.
+ :param header_params: Header parameters to be
+ placed in the request header.
+ :param body: Request body.
+ :param post_params dict: Request post form parameters,
+ for `application/x-www-form-urlencoded`, `multipart/form-data`.
+ :param auth_settings list: Auth Settings names for the request.
+ :param files dict: key -> filename, value -> filepath,
+ for `multipart/form-data`.
+ :param collection_formats: dict of collection formats for path, query,
+ header, and post parameters.
+ :param _request_auth: set to override the auth_settings for an a single
+ request; this effectively ignores the authentication
+ in the spec for a single request.
+ :return: tuple of form (path, http_method, query_params, header_params,
+ body, post_params, files)
+ """
+
+ config = self.configuration
+
+ # header parameters
+ header_params = header_params or {}
+ header_params.update(self.default_headers)
+ if self.cookie:
+ header_params["Cookie"] = self.cookie
+ if header_params:
+ header_params = self.sanitize_for_serialization(header_params)
+ header_params = dict(
+ self.parameters_to_tuples(header_params, collection_formats)
+ )
+
+ # path parameters
+ if path_params:
+ path_params = self.sanitize_for_serialization(path_params)
+ path_params = self.parameters_to_tuples(path_params, collection_formats)
+ for k, v in path_params:
+ # specified safe chars, encode everything
+ resource_path = resource_path.replace(
+ "{%s}" % k, quote(str(v), safe=config.safe_chars_for_path_param)
+ )
+
+ # post parameters
+ if post_params or files:
+ post_params = post_params if post_params else []
+ post_params = self.sanitize_for_serialization(post_params)
+ post_params = self.parameters_to_tuples(post_params, collection_formats)
+ if files:
+ post_params.extend(self.files_parameters(files))
+
+ # auth setting
+ self.update_params_for_auth(
+ header_params,
+ query_params,
+ auth_settings,
+ resource_path,
+ method,
+ body,
+ request_auth=_request_auth,
+ )
+
+ # body
+ if body:
+ body = self.sanitize_for_serialization(body)
+
+ # request url
+ if _host is None or self.configuration.ignore_operation_servers:
+ url = self.configuration.host + resource_path
+ else:
+ # use server/host defined in path or operation instead
+ url = _host + resource_path
+
+ # query parameters
+ if query_params:
+ query_params = self.sanitize_for_serialization(query_params)
+ url_query = self.parameters_to_url_query(query_params, collection_formats)
+ url += "?" + url_query
+
+ return method, url, header_params, body, post_params
+
+ def call_api(
+ self,
+ method,
+ url,
+ header_params=None,
+ body=None,
+ post_params=None,
+ _request_timeout=None,
+ ) -> rest.RESTResponse:
+ """Makes the HTTP request (synchronous)
+ :param method: Method to call.
+ :param url: Path to method endpoint.
+ :param header_params: Header parameters to be
+ placed in the request header.
+ :param body: Request body.
+ :param post_params dict: Request post form parameters,
+ for `application/x-www-form-urlencoded`, `multipart/form-data`.
+ :param _request_timeout: timeout setting for this request.
+ :return: RESTResponse
+ """
+
+ try:
+ # perform request and return response
+ response_data = self.rest_client.request(
+ method,
+ url,
+ headers=header_params,
+ body=body,
+ post_params=post_params,
+ _request_timeout=_request_timeout,
+ )
+
+ except ApiException as e:
+ raise e
+
+ return response_data
+
+ def response_deserialize(
+ self,
+ response_data: rest.RESTResponse,
+ response_types_map: Optional[Dict[str, ApiResponseT]] = None,
+ ) -> ApiResponse[ApiResponseT]:
+ """Deserializes response into an object.
+ :param response_data: RESTResponse object to be deserialized.
+ :param response_types_map: dict of response types.
+ :return: ApiResponse
+ """
+
+ msg = "RESTResponse.read() must be called before passing it to response_deserialize()"
+ assert response_data.data is not None, msg
+
+ response_type = response_types_map.get(str(response_data.status), None)
+ if (
+ not response_type
+ and isinstance(response_data.status, int)
+ and 100 <= response_data.status <= 599
+ ):
+ # if not found, look for '1XX', '2XX', etc.
+ response_type = response_types_map.get(
+ str(response_data.status)[0] + "XX", None
+ )
+
+ # deserialize response data
+ response_text = None
+ return_data = None
+ try:
+ if response_type == "bytearray":
+ return_data = response_data.data
+ elif response_type == "file":
+ return_data = self.__deserialize_file(response_data)
+ elif response_type is not None:
+ match = None
+ content_type = response_data.getheader("content-type")
+ if content_type is not None:
+ match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type)
+ encoding = match.group(1) if match else "utf-8"
+ response_text = response_data.data.decode(encoding)
+ return_data = self.deserialize(
+ response_text, response_type, content_type
+ )
+ finally:
+ if not 200 <= response_data.status <= 299:
+ raise ApiException.from_response(
+ http_resp=response_data,
+ body=response_text,
+ data=return_data,
+ )
+
+ return ApiResponse(
+ status_code=response_data.status,
+ data=return_data,
+ headers=response_data.getheaders(),
+ raw_data=response_data.data,
+ )
+
+ def sanitize_for_serialization(self, obj):
+ """Builds a JSON POST object.
+
+ If obj is None, return None.
+ If obj is SecretStr, return obj.get_secret_value()
+ If obj is str, int, long, float, bool, return directly.
+ If obj is datetime.datetime, datetime.date
+ convert to string in iso8601 format.
+ If obj is list, sanitize each element in the list.
+ If obj is dict, return the dict.
+ If obj is OpenAPI model, return the properties dict.
+
+ :param obj: The data to serialize.
+ :return: The serialized form of data.
+ """
+ if obj is None:
+ return None
+ elif isinstance(obj, Enum):
+ return obj.value
+ elif isinstance(obj, SecretStr):
+ return obj.get_secret_value()
+ elif isinstance(obj, self.PRIMITIVE_TYPES):
+ return obj
+ elif isinstance(obj, list):
+ return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj]
+ elif isinstance(obj, tuple):
+ return tuple(self.sanitize_for_serialization(sub_obj) for sub_obj in obj)
+ elif isinstance(obj, (datetime.datetime, datetime.date)):
+ return obj.isoformat()
+
+ elif isinstance(obj, dict):
+ obj_dict = obj
+ else:
+ # Convert model obj to dict except
+ # attributes `openapi_types`, `attribute_map`
+ # and attributes which value is not None.
+ # Convert attribute name to json key in
+ # model definition for request.
+ if hasattr(obj, "to_dict") and callable(getattr(obj, "to_dict")):
+ obj_dict = obj.to_dict()
+ else:
+ obj_dict = obj.__dict__
+
+ return {
+ key: self.sanitize_for_serialization(val) for key, val in obj_dict.items()
+ }
+
+ def deserialize(
+ self, response_text: str, response_type: str, content_type: Optional[str]
+ ):
+ """Deserializes response into an object.
+
+ :param response: RESTResponse object to be deserialized.
+ :param response_type: class literal for
+ deserialized object, or string of class name.
+ :param content_type: content type of response.
+
+ :return: deserialized object.
+ """
+
+ # fetch data from response object
+ if content_type is None:
+ try:
+ data = json.loads(response_text)
+ except ValueError:
+ data = response_text
+ elif content_type.startswith("application/json"):
+ if response_text == "":
+ data = ""
+ else:
+ data = json.loads(response_text)
+ elif content_type.startswith("text/plain"):
+ data = response_text
+ else:
+ raise ApiException(
+ status=0, reason="Unsupported content type: {0}".format(content_type)
+ )
+
+ return self.__deserialize(data, response_type)
+
+ def __deserialize(self, data, klass):
+ """Deserializes dict, list, str into an object.
+
+ :param data: dict, list or str.
+ :param klass: class literal, or string of class name.
+
+ :return: object.
+ """
+ if data is None:
+ return None
+
+ if isinstance(klass, str):
+ if klass.startswith("List["):
+ m = re.match(r"List\[(.*)]", klass)
+ assert m is not None, "Malformed List type definition"
+ sub_kls = m.group(1)
+ return [self.__deserialize(sub_data, sub_kls) for sub_data in data]
+
+ if klass.startswith("Dict["):
+ m = re.match(r"Dict\[([^,]*), (.*)]", klass)
+ assert m is not None, "Malformed Dict type definition"
+ sub_kls = m.group(2)
+ return {k: self.__deserialize(v, sub_kls) for k, v in data.items()}
+
+ # convert str to class
+ if klass in self.NATIVE_TYPES_MAPPING:
+ klass = self.NATIVE_TYPES_MAPPING[klass]
+ else:
+ klass = getattr(unity_sds_apgs_client.models, klass)
+
+ if klass in self.PRIMITIVE_TYPES:
+ return self.__deserialize_primitive(data, klass)
+ elif klass == object:
+ return self.__deserialize_object(data)
+ elif klass == datetime.date:
+ return self.__deserialize_date(data)
+ elif klass == datetime.datetime:
+ return self.__deserialize_datetime(data)
+ elif issubclass(klass, Enum):
+ return self.__deserialize_enum(data, klass)
+ else:
+ return self.__deserialize_model(data, klass)
+
+ def parameters_to_tuples(self, params, collection_formats):
+ """Get parameters as list of tuples, formatting collections.
+
+ :param params: Parameters as dict or list of two-tuples
+ :param dict collection_formats: Parameter collection formats
+ :return: Parameters as list of tuples, collections formatted
+ """
+ new_params: List[Tuple[str, str]] = []
+ if collection_formats is None:
+ collection_formats = {}
+ for k, v in params.items() if isinstance(params, dict) else params:
+ if k in collection_formats:
+ collection_format = collection_formats[k]
+ if collection_format == "multi":
+ new_params.extend((k, value) for value in v)
+ else:
+ if collection_format == "ssv":
+ delimiter = " "
+ elif collection_format == "tsv":
+ delimiter = "\t"
+ elif collection_format == "pipes":
+ delimiter = "|"
+ else: # csv is the default
+ delimiter = ","
+ new_params.append((k, delimiter.join(str(value) for value in v)))
+ else:
+ new_params.append((k, v))
+ return new_params
+
+ def parameters_to_url_query(self, params, collection_formats):
+ """Get parameters as list of tuples, formatting collections.
+
+ :param params: Parameters as dict or list of two-tuples
+ :param dict collection_formats: Parameter collection formats
+ :return: URL query string (e.g. a=Hello%20World&b=123)
+ """
+ new_params: List[Tuple[str, str]] = []
+ if collection_formats is None:
+ collection_formats = {}
+ for k, v in params.items() if isinstance(params, dict) else params:
+ if isinstance(v, bool):
+ v = str(v).lower()
+ if isinstance(v, (int, float)):
+ v = str(v)
+ if isinstance(v, dict):
+ v = json.dumps(v)
+
+ if k in collection_formats:
+ collection_format = collection_formats[k]
+ if collection_format == "multi":
+ new_params.extend((k, str(value)) for value in v)
+ else:
+ if collection_format == "ssv":
+ delimiter = " "
+ elif collection_format == "tsv":
+ delimiter = "\t"
+ elif collection_format == "pipes":
+ delimiter = "|"
+ else: # csv is the default
+ delimiter = ","
+ new_params.append(
+ (k, delimiter.join(quote(str(value)) for value in v))
+ )
+ else:
+ new_params.append((k, quote(str(v))))
+
+ return "&".join(["=".join(map(str, item)) for item in new_params])
+
+ def files_parameters(self, files: Dict[str, Union[str, bytes]]):
+ """Builds form parameters.
+
+ :param files: File parameters.
+ :return: Form parameters with files.
+ """
+ params = []
+ for k, v in files.items():
+ if isinstance(v, str):
+ with open(v, "rb") as f:
+ filename = os.path.basename(f.name)
+ filedata = f.read()
+ elif isinstance(v, bytes):
+ filename = k
+ filedata = v
+ else:
+ raise ValueError("Unsupported file value")
+ mimetype = mimetypes.guess_type(filename)[0] or "application/octet-stream"
+ params.append(tuple([k, tuple([filename, filedata, mimetype])]))
+ return params
+
+ def select_header_accept(self, accepts: List[str]) -> Optional[str]:
+ """Returns `Accept` based on an array of accepts provided.
+
+ :param accepts: List of headers.
+ :return: Accept (e.g. application/json).
+ """
+ if not accepts:
+ return None
+
+ for accept in accepts:
+ if re.search("json", accept, re.IGNORECASE):
+ return accept
+
+ return accepts[0]
+
+ def select_header_content_type(self, content_types):
+ """Returns `Content-Type` based on an array of content_types provided.
+
+ :param content_types: List of content-types.
+ :return: Content-Type (e.g. application/json).
+ """
+ if not content_types:
+ return None
+
+ for content_type in content_types:
+ if re.search("json", content_type, re.IGNORECASE):
+ return content_type
+
+ return content_types[0]
+
+ def update_params_for_auth(
+ self,
+ headers,
+ queries,
+ auth_settings,
+ resource_path,
+ method,
+ body,
+ request_auth=None,
+ ) -> None:
+ """Updates header and query params based on authentication setting.
+
+ :param headers: Header parameters dict to be updated.
+ :param queries: Query parameters tuple list to be updated.
+ :param auth_settings: Authentication setting identifiers list.
+ :resource_path: A string representation of the HTTP request resource path.
+ :method: A string representation of the HTTP request method.
+ :body: A object representing the body of the HTTP request.
+ The object type is the return value of sanitize_for_serialization().
+ :param request_auth: if set, the provided settings will
+ override the token in the configuration.
+ """
+ if not auth_settings:
+ return
+
+ if request_auth:
+ self._apply_auth_params(
+ headers, queries, resource_path, method, body, request_auth
+ )
+ else:
+ for auth in auth_settings:
+ auth_setting = self.configuration.auth_settings().get(auth)
+ if auth_setting:
+ self._apply_auth_params(
+ headers, queries, resource_path, method, body, auth_setting
+ )
+
+ def _apply_auth_params(
+ self, headers, queries, resource_path, method, body, auth_setting
+ ) -> None:
+ """Updates the request parameters based on a single auth_setting
+
+ :param headers: Header parameters dict to be updated.
+ :param queries: Query parameters tuple list to be updated.
+ :resource_path: A string representation of the HTTP request resource path.
+ :method: A string representation of the HTTP request method.
+ :body: A object representing the body of the HTTP request.
+ The object type is the return value of sanitize_for_serialization().
+ :param auth_setting: auth settings for the endpoint
+ """
+ if auth_setting["in"] == "cookie":
+ headers["Cookie"] = auth_setting["value"]
+ elif auth_setting["in"] == "header":
+ if auth_setting["type"] != "http-signature":
+ headers[auth_setting["key"]] = auth_setting["value"]
+ elif auth_setting["in"] == "query":
+ queries.append((auth_setting["key"], auth_setting["value"]))
+ else:
+ raise ApiValueError("Authentication token must be in `query` or `header`")
+
+ def __deserialize_file(self, response):
+ """Deserializes body to file
+
+ Saves response body into a file in a temporary folder,
+ using the filename from the `Content-Disposition` header if provided.
+
+ handle file downloading
+ save response body into a tmp file and return the instance
+
+ :param response: RESTResponse.
+ :return: file path.
+ """
+ fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path)
+ os.close(fd)
+ os.remove(path)
+
+ content_disposition = response.getheader("Content-Disposition")
+ if content_disposition:
+ m = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition)
+ assert m is not None, "Unexpected 'content-disposition' header value"
+ filename = m.group(1)
+ path = os.path.join(os.path.dirname(path), filename)
+
+ with open(path, "wb") as f:
+ f.write(response.data)
+
+ return path
+
+ def __deserialize_primitive(self, data, klass):
+ """Deserializes string to primitive type.
+
+ :param data: str.
+ :param klass: class literal.
+
+ :return: int, long, float, str, bool.
+ """
+ try:
+ return klass(data)
+ except UnicodeEncodeError:
+ return str(data)
+ except TypeError:
+ return data
+
+ def __deserialize_object(self, value):
+ """Return an original value.
+
+ :return: object.
+ """
+ return value
+
+ def __deserialize_date(self, string):
+ """Deserializes string to date.
+
+ :param string: str.
+ :return: date.
+ """
+ try:
+ return parse(string).date()
+ except ImportError:
+ return string
+ except ValueError:
+ raise rest.ApiException(
+ status=0, reason="Failed to parse `{0}` as date object".format(string)
+ )
+
+ def __deserialize_datetime(self, string):
+ """Deserializes string to datetime.
+
+ The string should be in iso8601 datetime format.
+
+ :param string: str.
+ :return: datetime.
+ """
+ try:
+ return parse(string)
+ except ImportError:
+ return string
+ except ValueError:
+ raise rest.ApiException(
+ status=0,
+ reason=("Failed to parse `{0}` as datetime object".format(string)),
+ )
+
+ def __deserialize_enum(self, data, klass):
+ """Deserializes primitive type to enum.
+
+ :param data: primitive type.
+ :param klass: class literal.
+ :return: enum value.
+ """
+ try:
+ return klass(data)
+ except ValueError:
+ raise rest.ApiException(
+ status=0, reason=("Failed to parse `{0}` as `{1}`".format(data, klass))
+ )
+
+ def __deserialize_model(self, data, klass):
+ """Deserializes list or dict to model.
+
+ :param data: dict, list.
+ :param klass: class literal.
+ :return: model object.
+ """
+
+ return klass.from_dict(data)
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api_response.py b/libs/app-package-build-client/unity_sds_apgs_client/api_response.py
new file mode 100644
index 0000000..ca801da
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/api_response.py
@@ -0,0 +1,22 @@
+"""API response object."""
+
+from __future__ import annotations
+
+from typing import Generic, Mapping, Optional, TypeVar
+
+from pydantic import BaseModel, Field, StrictBytes, StrictInt
+
+T = TypeVar("T")
+
+
+class ApiResponse(BaseModel, Generic[T]):
+ """
+ API response object
+ """
+
+ status_code: StrictInt = Field(description="HTTP status code")
+ headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers")
+ data: T = Field(description="Deserialized data given the data type")
+ raw_data: StrictBytes = Field(description="Raw data (HTTP response body)")
+
+ model_config = {"arbitrary_types_allowed": True}
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/configuration.py b/libs/app-package-build-client/unity_sds_apgs_client/configuration.py
new file mode 100644
index 0000000..36dd0ed
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/configuration.py
@@ -0,0 +1,476 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+import copy
+import http.client as httplib
+import logging
+import multiprocessing
+import sys
+from logging import FileHandler
+from typing import Optional
+
+import urllib3
+
+JSON_SCHEMA_VALIDATION_KEYWORDS = {
+ "multipleOf",
+ "maximum",
+ "exclusiveMaximum",
+ "minimum",
+ "exclusiveMinimum",
+ "maxLength",
+ "minLength",
+ "pattern",
+ "maxItems",
+ "minItems",
+}
+
+
+class Configuration:
+ """This class contains various settings of the API client.
+
+ :param host: Base url.
+ :param ignore_operation_servers
+ Boolean to ignore operation servers for the API client.
+ Config will use `host` as the base url regardless of the operation servers.
+ :param api_key: Dict to store API key(s).
+ Each entry in the dict specifies an API key.
+ The dict key is the name of the security scheme in the OAS specification.
+ The dict value is the API key secret.
+ :param api_key_prefix: Dict to store API prefix (e.g. Bearer).
+ The dict key is the name of the security scheme in the OAS specification.
+ The dict value is an API key prefix when generating the auth data.
+ :param username: Username for HTTP basic authentication.
+ :param password: Password for HTTP basic authentication.
+ :param access_token: Access token.
+ :param server_index: Index to servers configuration.
+ :param server_variables: Mapping with string values to replace variables in
+ templated server configuration. The validation of enums is performed for
+ variables with defined enum values before.
+ :param server_operation_index: Mapping from operation ID to an index to server
+ configuration.
+ :param server_operation_variables: Mapping from operation ID to a mapping with
+ string values to replace variables in templated server configuration.
+ The validation of enums is performed for variables with defined enum
+ values before.
+ :param ssl_ca_cert: str - the path to a file of concatenated CA certificates
+ in PEM format.
+ :param retries: Number of retries for API requests.
+
+ :Example:
+ """
+
+ _default = None
+
+ def __init__(
+ self,
+ host=None,
+ api_key=None,
+ api_key_prefix=None,
+ username=None,
+ password=None,
+ access_token=None,
+ server_index=None,
+ server_variables=None,
+ server_operation_index=None,
+ server_operation_variables=None,
+ ignore_operation_servers=False,
+ ssl_ca_cert=None,
+ retries=None,
+ *,
+ debug: Optional[bool] = None
+ ) -> None:
+ """Constructor"""
+ self._base_path = "http://api.dev.mdps.mcp.nasa.gov" if host is None else host
+ """Default Base url
+ """
+ self.server_index = 0 if server_index is None and host is None else server_index
+ self.server_operation_index = server_operation_index or {}
+ """Default server index
+ """
+ self.server_variables = server_variables or {}
+ self.server_operation_variables = server_operation_variables or {}
+ """Default server variables
+ """
+ self.ignore_operation_servers = ignore_operation_servers
+ """Ignore operation servers
+ """
+ self.temp_folder_path = None
+ """Temp file folder for downloading files
+ """
+ # Authentication Settings
+ self.api_key = {}
+ if api_key:
+ self.api_key = api_key
+ """dict to store API key(s)
+ """
+ self.api_key_prefix = {}
+ if api_key_prefix:
+ self.api_key_prefix = api_key_prefix
+ """dict to store API prefix (e.g. Bearer)
+ """
+ self.refresh_api_key_hook = None
+ """function hook to refresh API key if expired
+ """
+ self.username = username
+ """Username for HTTP basic authentication
+ """
+ self.password = password
+ """Password for HTTP basic authentication
+ """
+ self.access_token = access_token
+ """Access token
+ """
+ self.logger = {}
+ """Logging Settings
+ """
+ self.logger["package_logger"] = logging.getLogger("unity_sds_apgs_client")
+ self.logger["urllib3_logger"] = logging.getLogger("urllib3")
+ self.logger_format = "%(asctime)s %(levelname)s %(message)s"
+ """Log format
+ """
+ self.logger_stream_handler = None
+ """Log stream handler
+ """
+ self.logger_file_handler: Optional[FileHandler] = None
+ """Log file handler
+ """
+ self.logger_file = None
+ """Debug file location
+ """
+ if debug is not None:
+ self.debug = debug
+ else:
+ self.__debug = False
+ """Debug switch
+ """
+
+ self.verify_ssl = True
+ """SSL/TLS verification
+ Set this to false to skip verifying SSL certificate when calling API
+ from https server.
+ """
+ self.ssl_ca_cert = ssl_ca_cert
+ """Set this to customize the certificate file to verify the peer.
+ """
+ self.cert_file = None
+ """client certificate file
+ """
+ self.key_file = None
+ """client key file
+ """
+ self.assert_hostname = None
+ """Set this to True/False to enable/disable SSL hostname verification.
+ """
+ self.tls_server_name = None
+ """SSL/TLS Server Name Indication (SNI)
+ Set this to the SNI value expected by the server.
+ """
+
+ self.connection_pool_maxsize = multiprocessing.cpu_count() * 5
+ """urllib3 connection pool's maximum number of connections saved
+ per pool. urllib3 uses 1 connection as default value, but this is
+ not the best value when you are making a lot of possibly parallel
+ requests to the same host, which is often the case here.
+ cpu_count * 5 is used as default value to increase performance.
+ """
+
+ self.proxy: Optional[str] = None
+ """Proxy URL
+ """
+ self.proxy_headers = None
+ """Proxy headers
+ """
+ self.safe_chars_for_path_param = ""
+ """Safe chars for path_param
+ """
+ self.retries = retries
+ """Adding retries to override urllib3 default value 3
+ """
+ # Enable client side validation
+ self.client_side_validation = True
+
+ self.socket_options = None
+ """Options to pass down to the underlying urllib3 socket
+ """
+
+ self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z"
+ """datetime format
+ """
+
+ self.date_format = "%Y-%m-%d"
+ """date format
+ """
+
+ def __deepcopy__(self, memo):
+ cls = self.__class__
+ result = cls.__new__(cls)
+ memo[id(self)] = result
+ for k, v in self.__dict__.items():
+ if k not in ("logger", "logger_file_handler"):
+ setattr(result, k, copy.deepcopy(v, memo))
+ # shallow copy of loggers
+ result.logger = copy.copy(self.logger)
+ # use setters to configure loggers
+ result.logger_file = self.logger_file
+ result.debug = self.debug
+ return result
+
+ def __setattr__(self, name, value):
+ object.__setattr__(self, name, value)
+
+ @classmethod
+ def set_default(cls, default):
+ """Set default instance of configuration.
+
+ It stores default configuration, which can be
+ returned by get_default_copy method.
+
+ :param default: object of Configuration
+ """
+ cls._default = default
+
+ @classmethod
+ def get_default_copy(cls):
+ """Deprecated. Please use `get_default` instead.
+
+ Deprecated. Please use `get_default` instead.
+
+ :return: The configuration object.
+ """
+ return cls.get_default()
+
+ @classmethod
+ def get_default(cls):
+ """Return the default configuration.
+
+ This method returns newly created, based on default constructor,
+ object of Configuration class or returns a copy of default
+ configuration.
+
+ :return: The configuration object.
+ """
+ if cls._default is None:
+ cls._default = Configuration()
+ return cls._default
+
+ @property
+ def logger_file(self):
+ """The logger file.
+
+ If the logger_file is None, then add stream handler and remove file
+ handler. Otherwise, add file handler and remove stream handler.
+
+ :param value: The logger_file path.
+ :type: str
+ """
+ return self.__logger_file
+
+ @logger_file.setter
+ def logger_file(self, value):
+ """The logger file.
+
+ If the logger_file is None, then add stream handler and remove file
+ handler. Otherwise, add file handler and remove stream handler.
+
+ :param value: The logger_file path.
+ :type: str
+ """
+ self.__logger_file = value
+ if self.__logger_file:
+ # If set logging file,
+ # then add file handler and remove stream handler.
+ self.logger_file_handler = logging.FileHandler(self.__logger_file)
+ self.logger_file_handler.setFormatter(self.logger_formatter)
+ for _, logger in self.logger.items():
+ logger.addHandler(self.logger_file_handler)
+
+ @property
+ def debug(self):
+ """Debug status
+
+ :param value: The debug status, True or False.
+ :type: bool
+ """
+ return self.__debug
+
+ @debug.setter
+ def debug(self, value):
+ """Debug status
+
+ :param value: The debug status, True or False.
+ :type: bool
+ """
+ self.__debug = value
+ if self.__debug:
+ # if debug status is True, turn on debug logging
+ for _, logger in self.logger.items():
+ logger.setLevel(logging.DEBUG)
+ # turn on httplib debug
+ httplib.HTTPConnection.debuglevel = 1
+ else:
+ # if debug status is False, turn off debug logging,
+ # setting log level to default `logging.WARNING`
+ for _, logger in self.logger.items():
+ logger.setLevel(logging.WARNING)
+ # turn off httplib debug
+ httplib.HTTPConnection.debuglevel = 0
+
+ @property
+ def logger_format(self):
+ """The logger format.
+
+ The logger_formatter will be updated when sets logger_format.
+
+ :param value: The format string.
+ :type: str
+ """
+ return self.__logger_format
+
+ @logger_format.setter
+ def logger_format(self, value):
+ """The logger format.
+
+ The logger_formatter will be updated when sets logger_format.
+
+ :param value: The format string.
+ :type: str
+ """
+ self.__logger_format = value
+ self.logger_formatter = logging.Formatter(self.__logger_format)
+
+ def get_api_key_with_prefix(self, identifier, alias=None):
+ """Gets API key (with prefix if set).
+
+ :param identifier: The identifier of apiKey.
+ :param alias: The alternative identifier of apiKey.
+ :return: The token for api key authentication.
+ """
+ if self.refresh_api_key_hook is not None:
+ self.refresh_api_key_hook(self)
+ key = self.api_key.get(
+ identifier, self.api_key.get(alias) if alias is not None else None
+ )
+ if key:
+ prefix = self.api_key_prefix.get(identifier)
+ if prefix:
+ return "%s %s" % (prefix, key)
+ else:
+ return key
+
+ def get_basic_auth_token(self):
+ """Gets HTTP basic authentication header (string).
+
+ :return: The token for basic HTTP authentication.
+ """
+ username = ""
+ if self.username is not None:
+ username = self.username
+ password = ""
+ if self.password is not None:
+ password = self.password
+ return urllib3.util.make_headers(basic_auth=username + ":" + password).get(
+ "authorization"
+ )
+
+ def auth_settings(self):
+ """Gets Auth Settings dict for api client.
+
+ :return: The Auth Settings information dict.
+ """
+ auth = {}
+ if self.access_token is not None:
+ auth["bearerAuth"] = {
+ "type": "bearer",
+ "in": "header",
+ "key": "Authorization",
+ "value": "Bearer " + self.access_token,
+ }
+ return auth
+
+ def to_debug_report(self):
+ """Gets the essential information for debugging.
+
+ :return: The report for debugging.
+ """
+ return (
+ "Python SDK Debug Report:\n"
+ "OS: {env}\n"
+ "Python Version: {pyversion}\n"
+ "Version of the API: 1.0.0\n"
+ "SDK Package Version: 1.0.0".format(env=sys.platform, pyversion=sys.version)
+ )
+
+ def get_host_settings(self):
+ """Gets an array of host settings
+
+ :return: An array of host settings
+ """
+ return [
+ {
+ "url": "api.dev.mdps.mcp.nasa.gov",
+ "description": "No description provided",
+ }
+ ]
+
+ def get_host_from_settings(self, index, variables=None, servers=None):
+ """Gets host URL based on the index and variables
+ :param index: array index of the host settings
+ :param variables: hash of variable and the corresponding value
+ :param servers: an array of host settings or None
+ :return: URL based on host settings
+ """
+ if index is None:
+ return self._base_path
+
+ variables = {} if variables is None else variables
+ servers = self.get_host_settings() if servers is None else servers
+
+ try:
+ server = servers[index]
+ except IndexError:
+ raise ValueError(
+ "Invalid index {0} when selecting the host settings. "
+ "Must be less than {1}".format(index, len(servers))
+ )
+
+ url = server["url"]
+
+ # go through variables and replace placeholders
+ for variable_name, variable in server.get("variables", {}).items():
+ used_value = variables.get(variable_name, variable["default_value"])
+
+ if "enum_values" in variable and used_value not in variable["enum_values"]:
+ raise ValueError(
+ "The variable `{0}` in the host URL has invalid value "
+ "{1}. Must be {2}.".format(
+ variable_name, variables[variable_name], variable["enum_values"]
+ )
+ )
+
+ url = url.replace("{" + variable_name + "}", used_value)
+
+ return url
+
+ @property
+ def host(self):
+ """Return generated host."""
+ return self.get_host_from_settings(
+ self.server_index, variables=self.server_variables
+ )
+
+ @host.setter
+ def host(self, value):
+ """Fix base path."""
+ self._base_path = value
+ self.server_index = None
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py b/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py
new file mode 100644
index 0000000..66e65ee
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py
@@ -0,0 +1,200 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+from typing import Any, Optional
+
+from typing_extensions import Self
+
+
+class OpenApiException(Exception):
+ """The base exception class for all OpenAPIExceptions"""
+
+
+class ApiTypeError(OpenApiException, TypeError):
+ def __init__(
+ self, msg, path_to_item=None, valid_classes=None, key_type=None
+ ) -> None:
+ """Raises an exception for TypeErrors
+
+ Args:
+ msg (str): the exception message
+
+ Keyword Args:
+ path_to_item (list): a list of keys an indices to get to the
+ current_item
+ None if unset
+ valid_classes (tuple): the primitive classes that current item
+ should be an instance of
+ None if unset
+ key_type (bool): False if our value is a value in a dict
+ True if it is a key in a dict
+ False if our item is an item in a list
+ None if unset
+ """
+ self.path_to_item = path_to_item
+ self.valid_classes = valid_classes
+ self.key_type = key_type
+ full_msg = msg
+ if path_to_item:
+ full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
+ super(ApiTypeError, self).__init__(full_msg)
+
+
+class ApiValueError(OpenApiException, ValueError):
+ def __init__(self, msg, path_to_item=None) -> None:
+ """
+ Args:
+ msg (str): the exception message
+
+ Keyword Args:
+ path_to_item (list) the path to the exception in the
+ received_data dict. None if unset
+ """
+
+ self.path_to_item = path_to_item
+ full_msg = msg
+ if path_to_item:
+ full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
+ super(ApiValueError, self).__init__(full_msg)
+
+
+class ApiAttributeError(OpenApiException, AttributeError):
+ def __init__(self, msg, path_to_item=None) -> None:
+ """
+ Raised when an attribute reference or assignment fails.
+
+ Args:
+ msg (str): the exception message
+
+ Keyword Args:
+ path_to_item (None/list) the path to the exception in the
+ received_data dict
+ """
+ self.path_to_item = path_to_item
+ full_msg = msg
+ if path_to_item:
+ full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
+ super(ApiAttributeError, self).__init__(full_msg)
+
+
+class ApiKeyError(OpenApiException, KeyError):
+ def __init__(self, msg, path_to_item=None) -> None:
+ """
+ Args:
+ msg (str): the exception message
+
+ Keyword Args:
+ path_to_item (None/list) the path to the exception in the
+ received_data dict
+ """
+ self.path_to_item = path_to_item
+ full_msg = msg
+ if path_to_item:
+ full_msg = "{0} at {1}".format(msg, render_path(path_to_item))
+ super(ApiKeyError, self).__init__(full_msg)
+
+
+class ApiException(OpenApiException):
+
+ def __init__(
+ self,
+ status=None,
+ reason=None,
+ http_resp=None,
+ *,
+ body: Optional[str] = None,
+ data: Optional[Any] = None,
+ ) -> None:
+ self.status = status
+ self.reason = reason
+ self.body = body
+ self.data = data
+ self.headers = None
+
+ if http_resp:
+ if self.status is None:
+ self.status = http_resp.status
+ if self.reason is None:
+ self.reason = http_resp.reason
+ if self.body is None:
+ try:
+ self.body = http_resp.data.decode("utf-8")
+ except Exception:
+ pass
+ self.headers = http_resp.getheaders()
+
+ @classmethod
+ def from_response(
+ cls,
+ *,
+ http_resp,
+ body: Optional[str],
+ data: Optional[Any],
+ ) -> Self:
+ if http_resp.status == 400:
+ raise BadRequestException(http_resp=http_resp, body=body, data=data)
+
+ if http_resp.status == 401:
+ raise UnauthorizedException(http_resp=http_resp, body=body, data=data)
+
+ if http_resp.status == 403:
+ raise ForbiddenException(http_resp=http_resp, body=body, data=data)
+
+ if http_resp.status == 404:
+ raise NotFoundException(http_resp=http_resp, body=body, data=data)
+
+ if 500 <= http_resp.status <= 599:
+ raise ServiceException(http_resp=http_resp, body=body, data=data)
+ raise ApiException(http_resp=http_resp, body=body, data=data)
+
+ def __str__(self):
+ """Custom error messages for exception"""
+ error_message = "({0})\n" "Reason: {1}\n".format(self.status, self.reason)
+ if self.headers:
+ error_message += "HTTP response headers: {0}\n".format(self.headers)
+
+ if self.data or self.body:
+ error_message += "HTTP response body: {0}\n".format(self.data or self.body)
+
+ return error_message
+
+
+class BadRequestException(ApiException):
+ pass
+
+
+class NotFoundException(ApiException):
+ pass
+
+
+class UnauthorizedException(ApiException):
+ pass
+
+
+class ForbiddenException(ApiException):
+ pass
+
+
+class ServiceException(ApiException):
+ pass
+
+
+def render_path(path_to_item):
+ """Returns a string representation of a path"""
+ result = ""
+ for pth in path_to_item:
+ if isinstance(pth, int):
+ result += "[{0}]".format(pth)
+ else:
+ result += "['{0}']".format(pth)
+ return result
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py
new file mode 100644
index 0000000..ea680ed
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py
@@ -0,0 +1,19 @@
+# coding: utf-8
+
+# flake8: noqa
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+# import models into model package
+from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import (
+ AdsAcbMcpCloneGet200Response,
+)
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py b/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py
new file mode 100644
index 0000000..8c9749d
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py
@@ -0,0 +1,89 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+from __future__ import annotations
+
+import json
+import pprint
+import re # noqa: F401
+from typing import Any, ClassVar, Dict, List, Optional, Set
+
+from pydantic import BaseModel, ConfigDict, StrictStr
+from typing_extensions import Self
+
+
+class AdsAcbMcpCloneGet200Response(BaseModel):
+ """
+ AdsAcbMcpCloneGet200Response
+ """ # noqa: E501
+
+ clone_url: Optional[StrictStr] = None
+ log_group_name: Optional[StrictStr] = None
+ __properties: ClassVar[List[str]] = ["clone_url", "log_group_name"]
+
+ model_config = ConfigDict(
+ populate_by_name=True,
+ validate_assignment=True,
+ protected_namespaces=(),
+ )
+
+ def to_str(self) -> str:
+ """Returns the string representation of the model using alias"""
+ return pprint.pformat(self.model_dump(by_alias=True))
+
+ def to_json(self) -> str:
+ """Returns the JSON representation of the model using alias"""
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
+ return json.dumps(self.to_dict())
+
+ @classmethod
+ def from_json(cls, json_str: str) -> Optional[Self]:
+ """Create an instance of AdsAcbMcpCloneGet200Response from a JSON string"""
+ return cls.from_dict(json.loads(json_str))
+
+ def to_dict(self) -> Dict[str, Any]:
+ """Return the dictionary representation of the model using alias.
+
+ This has the following differences from calling pydantic's
+ `self.model_dump(by_alias=True)`:
+
+ * `None` is only added to the output dict for nullable fields that
+ were set at model initialization. Other fields with value `None`
+ are ignored.
+ """
+ excluded_fields: Set[str] = set([])
+
+ _dict = self.model_dump(
+ by_alias=True,
+ exclude=excluded_fields,
+ exclude_none=True,
+ )
+ return _dict
+
+ @classmethod
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
+ """Create an instance of AdsAcbMcpCloneGet200Response from a dict"""
+ if obj is None:
+ return None
+
+ if not isinstance(obj, dict):
+ return cls.model_validate(obj)
+
+ _obj = cls.model_validate(
+ {
+ "clone_url": obj.get("clone_url"),
+ "log_group_name": obj.get("log_group_name"),
+ }
+ )
+ return _obj
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/py.typed b/libs/app-package-build-client/unity_sds_apgs_client/py.typed
new file mode 100644
index 0000000..e69de29
diff --git a/libs/app-package-build-client/unity_sds_apgs_client/rest.py b/libs/app-package-build-client/unity_sds_apgs_client/rest.py
new file mode 100644
index 0000000..328b8d4
--- /dev/null
+++ b/libs/app-package-build-client/unity_sds_apgs_client/rest.py
@@ -0,0 +1,244 @@
+# coding: utf-8
+
+"""
+ App Package API
+
+ Service for application package generation
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
+
+ Do not edit the class manually.
+""" # noqa: E501
+
+
+import io
+import json
+import re
+import ssl
+
+import urllib3
+
+from unity_sds_apgs_client.exceptions import ApiException, ApiValueError
+
+SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
+RESTResponseType = urllib3.HTTPResponse
+
+
+def is_socks_proxy_url(url):
+ if url is None:
+ return False
+ split_section = url.split("://")
+ if len(split_section) < 2:
+ return False
+ else:
+ return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
+
+
+class RESTResponse(io.IOBase):
+
+ def __init__(self, resp) -> None:
+ self.response = resp
+ self.status = resp.status
+ self.reason = resp.reason
+ self.data = None
+
+ def read(self):
+ if self.data is None:
+ self.data = self.response.data
+ return self.data
+
+ def getheaders(self):
+ """Returns a dictionary of the response headers."""
+ return self.response.headers
+
+ def getheader(self, name, default=None):
+ """Returns a given response header."""
+ return self.response.headers.get(name, default)
+
+
+class RESTClientObject:
+
+ def __init__(self, configuration) -> None:
+ # urllib3.PoolManager will pass all kw parameters to connectionpool
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
+ # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
+
+ # cert_reqs
+ if configuration.verify_ssl:
+ cert_reqs = ssl.CERT_REQUIRED
+ else:
+ cert_reqs = ssl.CERT_NONE
+
+ pool_args = {
+ "cert_reqs": cert_reqs,
+ "ca_certs": configuration.ssl_ca_cert,
+ "cert_file": configuration.cert_file,
+ "key_file": configuration.key_file,
+ }
+ if configuration.assert_hostname is not None:
+ pool_args["assert_hostname"] = configuration.assert_hostname
+
+ if configuration.retries is not None:
+ pool_args["retries"] = configuration.retries
+
+ if configuration.tls_server_name:
+ pool_args["server_hostname"] = configuration.tls_server_name
+
+ if configuration.socket_options is not None:
+ pool_args["socket_options"] = configuration.socket_options
+
+ if configuration.connection_pool_maxsize is not None:
+ pool_args["maxsize"] = configuration.connection_pool_maxsize
+
+ # https pool manager
+ self.pool_manager: urllib3.PoolManager
+
+ if configuration.proxy:
+ if is_socks_proxy_url(configuration.proxy):
+ from urllib3.contrib.socks import SOCKSProxyManager
+
+ pool_args["proxy_url"] = configuration.proxy
+ pool_args["headers"] = configuration.proxy_headers
+ self.pool_manager = SOCKSProxyManager(**pool_args)
+ else:
+ pool_args["proxy_url"] = configuration.proxy
+ pool_args["proxy_headers"] = configuration.proxy_headers
+ self.pool_manager = urllib3.ProxyManager(**pool_args)
+ else:
+ self.pool_manager = urllib3.PoolManager(**pool_args)
+
+ def request(
+ self,
+ method,
+ url,
+ headers=None,
+ body=None,
+ post_params=None,
+ _request_timeout=None,
+ ):
+ """Perform requests.
+
+ :param method: http request method
+ :param url: http request url
+ :param headers: http request headers
+ :param body: request json body, for `application/json`
+ :param post_params: request post parameters,
+ `application/x-www-form-urlencoded`
+ and `multipart/form-data`
+ :param _request_timeout: timeout setting for this request. If one
+ number provided, it will be total request
+ timeout. It can also be a pair (tuple) of
+ (connection, read) timeouts.
+ """
+ method = method.upper()
+ assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"]
+
+ if post_params and body:
+ raise ApiValueError(
+ "body parameter cannot be used with post_params parameter."
+ )
+
+ post_params = post_params or {}
+ headers = headers or {}
+
+ timeout = None
+ if _request_timeout:
+ if isinstance(_request_timeout, (int, float)):
+ timeout = urllib3.Timeout(total=_request_timeout)
+ elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2:
+ timeout = urllib3.Timeout(
+ connect=_request_timeout[0], read=_request_timeout[1]
+ )
+
+ try:
+ # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
+ if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]:
+
+ # no content type provided or payload is json
+ content_type = headers.get("Content-Type")
+ if not content_type or re.search("json", content_type, re.IGNORECASE):
+ request_body = None
+ if body is not None:
+ request_body = json.dumps(body)
+ r = self.pool_manager.request(
+ method,
+ url,
+ body=request_body,
+ timeout=timeout,
+ headers=headers,
+ preload_content=False,
+ )
+ elif content_type == "application/x-www-form-urlencoded":
+ r = self.pool_manager.request(
+ method,
+ url,
+ fields=post_params,
+ encode_multipart=False,
+ timeout=timeout,
+ headers=headers,
+ preload_content=False,
+ )
+ elif content_type == "multipart/form-data":
+ # must del headers['Content-Type'], or the correct
+ # Content-Type which generated by urllib3 will be
+ # overwritten.
+ del headers["Content-Type"]
+ # Ensures that dict objects are serialized
+ post_params = [
+ (a, json.dumps(b)) if isinstance(b, dict) else (a, b)
+ for a, b in post_params
+ ]
+ r = self.pool_manager.request(
+ method,
+ url,
+ fields=post_params,
+ encode_multipart=True,
+ timeout=timeout,
+ headers=headers,
+ preload_content=False,
+ )
+ # Pass a `string` parameter directly in the body to support
+ # other content types than JSON when `body` argument is
+ # provided in serialized form.
+ elif isinstance(body, str) or isinstance(body, bytes):
+ r = self.pool_manager.request(
+ method,
+ url,
+ body=body,
+ timeout=timeout,
+ headers=headers,
+ preload_content=False,
+ )
+ elif headers["Content-Type"] == "text/plain" and isinstance(body, bool):
+ request_body = "true" if body else "false"
+ r = self.pool_manager.request(
+ method,
+ url,
+ body=request_body,
+ preload_content=False,
+ timeout=timeout,
+ headers=headers,
+ )
+ else:
+ # Cannot generate the request from given parameters
+ msg = """Cannot prepare a request message for provided
+ arguments. Please check that your arguments match
+ declared content type."""
+ raise ApiException(status=0, reason=msg)
+ # For `GET`, `HEAD`
+ else:
+ r = self.pool_manager.request(
+ method,
+ url,
+ fields={},
+ timeout=timeout,
+ headers=headers,
+ preload_content=False,
+ )
+ except urllib3.exceptions.SSLError as e:
+ msg = "\n".join([type(e).__name__, str(e)])
+ raise ApiException(status=0, reason=msg)
+
+ return RESTResponse(r)
diff --git a/schemas/app-package-service/.openapi-generator-ignore b/schemas/app-package-service/.openapi-generator-ignore
new file mode 100644
index 0000000..7484ee5
--- /dev/null
+++ b/schemas/app-package-service/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/schemas/app-package-service/.openapi-generator/FILES b/schemas/app-package-service/.openapi-generator/FILES
new file mode 100644
index 0000000..69e43c4
--- /dev/null
+++ b/schemas/app-package-service/.openapi-generator/FILES
@@ -0,0 +1,29 @@
+.github/workflows/python.yml
+.gitignore
+.gitlab-ci.yml
+.openapi-generator-ignore
+.travis.yml
+README.md
+docs/AdsAcbMcpCloneGet200Response.md
+docs/DefaultApi.md
+git_push.sh
+openapi_client/__init__.py
+openapi_client/api/__init__.py
+openapi_client/api/default_api.py
+openapi_client/api_client.py
+openapi_client/api_response.py
+openapi_client/configuration.py
+openapi_client/exceptions.py
+openapi_client/models/__init__.py
+openapi_client/models/ads_acb_mcp_clone_get200_response.py
+openapi_client/py.typed
+openapi_client/rest.py
+pyproject.toml
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+test/__init__.py
+test/test_ads_acb_mcp_clone_get200_response.py
+test/test_default_api.py
+tox.ini
diff --git a/schemas/app-package-service/.openapi-generator/VERSION b/schemas/app-package-service/.openapi-generator/VERSION
new file mode 100644
index 0000000..1985849
--- /dev/null
+++ b/schemas/app-package-service/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.7.0
diff --git a/schemas/app-package-service/README.md b/schemas/app-package-service/README.md
new file mode 100644
index 0000000..acb61ce
--- /dev/null
+++ b/schemas/app-package-service/README.md
@@ -0,0 +1,5 @@
+# Build Instructions
+```
+openapi-generator generate -i app-package.api.yaml -g python -o ../../libs/app-package-build-client --package-name unity_sds_apgs_client
+
+```
diff --git a/schemas/app-package-service/app-package.api.yaml b/schemas/app-package-service/app-package.api.yaml
new file mode 100644
index 0000000..8086b03
--- /dev/null
+++ b/schemas/app-package-service/app-package.api.yaml
@@ -0,0 +1,41 @@
+openapi: 3.0.0
+info:
+ version: 1.0.0
+ title: App Package API
+ description: Service for application package generation
+
+components:
+ securitySchemes:
+ bearerAuth: # arbitrary name for the security scheme
+ type: http
+ scheme: bearer
+
+security:
+ - bearerAuth: []
+
+servers:
+ - url: api.dev.mdps.mcp.nasa.gov
+
+paths:
+ /ads-acb/mcp-clone:
+ get:
+ summary: Begins the MCP Clone process
+ parameters:
+ - in: header
+ name: clone_url
+ schema:
+ type: string
+ required: true
+
+ responses:
+ '200':
+ description: Successfully submitted a job
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ clone_url:
+ type: string
+ log_group_name:
+ type: string