From abbaaeaa8be283b630cc160d7eb6734974c56453 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 03:53:07 +0000 Subject: [PATCH 1/2] Fix expense test imports and CI test command - Corrected `ModuleNotFoundError` in expense tests by changing `from app.main import app` to `from main import app`. This aligns with the project structure and how group tests perform their imports. - Updated the GitHub Actions workflow (`run-tests.yml`) to use `python -m pytest` instead of just `pytest`. This resolves a `pytest-asyncio` plugin discovery issue encountered during testing, ensuring CI runs the tests with the correct Python environment context. --- .coverage | Bin 0 -> 53248 bytes .github/workflows/run-tests.yml | 2 +- backend/tests/expenses/test_expense_routes.py | 38 +- .../tests/expenses/test_expense_service.py | 5 +- coverage.xml | 2712 +++++++++++++++++ 5 files changed, 2738 insertions(+), 19 deletions(-) create mode 100644 .coverage create mode 100644 coverage.xml diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..16b0d88f5e8127db8af2e35e1de4678a27d99d62 GIT binary patch literal 53248 zcmeI5dvH|M8Nkooo9t$H@4YAQ&E~PWghzrvLJCOL8iF>Z_$WnG9GSXqHaE#ib~o&9 z0x4qvbxI#nW;(TwGYGWI)IWUHQNdP0r`pom4v{h)YAI4{+aRcc%4-ZH{l2sB>~3VH z({aS_PWC(J-t&FueCKx__ny6bZ&ob7#TPO3&S1#ziRklKA(JH5s_Tp~D|}S=#5W5> z^5Q!XN-6PNQ7dcg|DMY4WQutUUZY@ms%d-)`|(y^uf~5g-CYfCzlC z32a)fSR78L^uYZQPkWCM33xuXRU3#S3h->$SjSf7~!7(`1p<<)3$C%sK0ag*C3$o}9`TU;H zfWF!om@O1yrA3T&k>~-)#PD?mP(yEsna|WiMyC-n0$w8=^`gPoG1E5l!3{QxqohRI zY=}B}LSFc@r_}}yB&)Kt6EgA!LmlXSd&m>;b{pZ@x+hUXZxH-k7m3z36!bSmf_jfH zAgUP%`y#$zKsVMI-oA*@k+p)e5n6l$c&W94yza#c-5a%xm6bv#X`IC}rXDly1m^<5 zIM$>g77fP2=Rlvo9gyGG=kLYF0gGtCkzg*%T(*&5tg@HgHd)#-S>Lqgj3dVujau~u zd~5oQMB~rala{kZH3GreI#vRDz;wIWaZQQDpjR5}!fSfqdduzUiv-2K8yer;3_^LR zsKDZ=t(7*f5gi5bxZ8b^a3W$&>okeOIl2y}=k7N+O42(Cj-s9(J=iIR3|i~a#)00P zI%b;UFgzg~XnHWF2%dhXy$ziOAN2N~V0(IB6FnwuzyN`{AgII60o2dttS#ab&CSkk&syd|?t zqwyra;R*MJ;uFbalVsc?IZMXJNGt`aGsj|fEUwB`otU1xITk6{WXZEQ%F3io(Gh|3 z5`Oa2DuG9mLtw&*;PTz?^+dY$OyBV^I9{J`c3fAM%W-tU-Hg)w;3|`Fd9zc{_rs)* zA34osJd$+zW@BJZzo!RglU|Q61Va|);OH4ZN5u{gD0|w2eG$=raaVLtJohC1jb@PC zkFy7@nL-_g_cw##un$hFc-jhI8$YVocYDG(3x(_T_F%Bb@C2gg2C!HfhBAF&UHFiB zR$7$IBRqh4boJK@pW-JMoaS$bK^Gri5b^sxfsWYu3Qxn)Tw(6V!HMNWClN5z>tRra zVTex1GoEQI6=$q?{*ArB1atL!I-)wz7iEu8RSuao44Y0M`%_wn|T!5Eyn`$MCW7aHbQ(tT_M&}uK7*6VbPu%U;t|_gP zOh`=jmt`>F!qrY{KS6dWIB+*w0#0tx7Hp4Fh-<~Jb!;0U|&IhyW2F z0z`la5CI}U1c(3;AOcq&0a-Fh7F_?E_`8gcfS`>C5CI}U1c(3;AOb{y2oM1xKm>>Y z5%_!(P)u?SkN?DDE|=sgN9;!c3mdO#Y_>tIO#C?G$NAaMX9dY?B0vO)01+SpM1Tko z0U|&IhyW2F0z@EAK#^;t__qKin_Oj$eF=c~|Lbf&WBe$8n*W%G`E7h2SGD)GH?$qv zfOdyASF@|{se9F*s6n+&tx?V>e^7QP-O60WZ2yz}al7CC6?=v4lx;s`LK_hv0z`la z5CI}U1c(3;_@4<(t&`cUO`hJ~rgo2awGrqL@eZRGqVTp2pAm+~e(R^m?2a_0h!Kvs zjdh?EHr!z&)bH~epg2R9*@{d>c+T6~?S>qC;k67A(5tJJ+0AKsT}A+25&-XR2pjN3 zFzPh9WM-u4V4>kAc+p6xNtBPVl)@WpWaj;JgAhFIEowEdT4w$%`dy&W8;%wcji(gy zr7D@NzC5EuK@F8MTbbL&?e+zH5w{!ae6>?%;Vhal(lMtpxi6@Y*_z9?OE`9wLuRWc zGfQ!;zIg5$#6f@TU`c(PmbiK^=f9+h^NY{y8 zUguo@yP9P0Wf&x`-)rW}{%rb_uK%m&$*V8ZC{a+=OnK!bHYsb9%7t<`n`UB}orAmc zYI)7&+a(;Um?f{8)GWm{M@An=TZJdru;rhkm{>EGWptLb91~uaX5dTHOYyN}hP*tz zKB$?o{x6wkOJ;$m9y^}lTrrG!t`tUigH5~K=p`;^j#7MHv@lX_zPZ`S3u%;c2ye|}bllmhZ9 z5>LJT~NCD;F^De_Wl+SD1Hpi>Y5g-CYfCvx) zB0vO)01>#N3CQs402S~5OZ*~(KiY@@5g-CYfCvx)B0vO)01+SpM1Tkofh&-JEUQ+$ z|L;;>#`pjKp1;7K;y>k&@GZQH-^HuBS^GpgrM;`Yt^HbiLEEft(7vuUz_S2b)rh)E zU7^lW&M8O0m^LCn1c(3;AOb{y2oM1xKm>@u|CfNvl_yzST!Za) z;^W)KpBU~Rd+%?%NB7qr=|9>(eth@I-5>8da-cT&VdTiAxBSCP_8i^1XGRqmeWPmZ zgOhI`7+-Siz_~?x&n`N8w}1T5(|sq$4}y5Ve|=z;#asz`TBYQ0LO9piGK0_m`*W|f ztiNa5lI``|mmPS*Spf<2D+Wi#9v>b*w*SVVao3We4b@xRu6(ltZ5`4ktvp|{K2TlW z(m!vWBsiKtz7~x#rsE;;FXk~4-E_E<8%-~aA8N&j4!d(P0{Rt>|V=jj`j*a!NX7dCg)j!TOd+vx*_St9Y#O>HQntY#QHs z(#_s_*Id9_uNfZbd+CC_l5Nx+?+u^m{T6ty6oGPO(MNknpY^|dU0EUQ%`W`T$zT3; z`}xPtKGk*o$+w42Ja6WhGnZ5i!fI{bk>MR(Lx-O)P+_-N{m4CHQy^BZ>>C^zv6R{& zewBU9X={~A*$?fd7wTKtOV`@qXuoZ2(Iv(TyW1r8pVK=INzy0B6O33ZR!lSm#x}wS zw!GHSrK%NdtE~rK_AlJ9eyu#M0CsOGFuP?y!cMI@V>WNywGdlHv<#EkMu}CJEuf`Y zUa^@WEH^(hFuH8FH6P-o`ThBhm&|#XoF|pY5H`qTd)97v_=ZL7w@|ROZ<+}X-eek+ zE?(k8M}`iM4jm4R?%)@99IhQ19oXw08QOJpT;fum)mk@pmppyZkaTAFIVax#ck#K5 zkMcA8L;i1mjQ@on>Y5g-CYfCvzQD~tfH%q5pg1T{4xsIC@4Rh0-TD@EXRilCxG z1P+G?%F9JiRwjbdQW2Dth@iMw1Vu$6C@d5K=OWNF5vZyN6h#Dfy9jLJ%L2)26?+8* zBCuFQU^a^&KVJlSc_NTy5tvMQ@Ku1g|IZ4qutuWl5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-C-1n~Ypt^d=I&<+tG0z`la5CI}U1c(3;AOb{y2oQlQjsQOYU&rsn-~XTEr}+nb znE!(xg=YW`@dNNifH(N7{8#WCz%Tfd{O9m)fNlIycotv_|1N)!5Ap%{uYo~+A2;~D zd=+Fu8xbG^M1Tko0U|&IhyW2F0z`la5P>fg0l5xdtuIeOp`)lp;X+Y^q8ddNib@nt z6cs2OD9TZkp(sUBf}$8j5sE?-9EFBLMWLXuqp+c{q9{ONL19Lbk0K9+jKYKh-~az# DKcrXu literal 0 HcmV?d00001 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 1c4f315c..ecc296e4 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -28,7 +28,7 @@ jobs: run: | cd $GITHUB_WORKSPACE export PYTHONPATH=$GITHUB_WORKSPACE:$GITHUB_WORKSPACE/backend - pytest --cov=./backend --cov-report=xml:coverage.xml backend/tests/ + python -m pytest --cov=./backend --cov-report=xml:coverage.xml backend/tests/ - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/backend/tests/expenses/test_expense_routes.py b/backend/tests/expenses/test_expense_routes.py index 329c3ae5..67610eae 100644 --- a/backend/tests/expenses/test_expense_routes.py +++ b/backend/tests/expenses/test_expense_routes.py @@ -1,10 +1,14 @@ import pytest -from fastapi.testclient import TestClient +from httpx import AsyncClient, ASGITransport +from fastapi import status from unittest.mock import AsyncMock, patch -from app.main import app +from main import app # Adjusted import from app.expenses.schemas import ExpenseCreateRequest, ExpenseSplit -client = TestClient(app) +@pytest.fixture +async def async_client(): + async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as ac: + yield ac @pytest.fixture def mock_current_user(): @@ -24,9 +28,10 @@ def sample_expense_data(): "receiptUrls": [] } +@pytest.mark.asyncio @patch("app.expenses.routes.get_current_user") @patch("app.expenses.service.expense_service.create_expense") -def test_create_expense_endpoint(mock_create_expense, mock_get_current_user, sample_expense_data, mock_current_user): +async def test_create_expense_endpoint(mock_create_expense, mock_get_current_user, sample_expense_data, mock_current_user, async_client: AsyncClient): """Test create expense endpoint""" mock_get_current_user.return_value = mock_current_user @@ -54,7 +59,7 @@ def test_create_expense_endpoint(mock_create_expense, mock_get_current_user, sam } } - response = client.post( + response = await async_client.post( "/groups/group_123/expenses", json=sample_expense_data, headers={"Authorization": "Bearer test_token"} @@ -62,11 +67,12 @@ def test_create_expense_endpoint(mock_create_expense, mock_get_current_user, sam # This test would need proper authentication mocking to work # For now, it demonstrates the structure - assert response.status_code in [201, 401, 422] # Depending on auth setup + assert response.status_code in [status.HTTP_201_CREATED, status.HTTP_401_UNAUTHORIZED, status.HTTP_422_UNPROCESSABLE_ENTITY] # Depending on auth setup +@pytest.mark.asyncio @patch("app.expenses.routes.get_current_user") @patch("app.expenses.service.expense_service.list_group_expenses") -def test_list_expenses_endpoint(mock_list_expenses, mock_get_current_user, mock_current_user): +async def test_list_expenses_endpoint(mock_list_expenses, mock_get_current_user, mock_current_user, async_client: AsyncClient): """Test list expenses endpoint""" mock_get_current_user.return_value = mock_current_user @@ -87,17 +93,18 @@ def test_list_expenses_endpoint(mock_list_expenses, mock_get_current_user, mock_ } } - response = client.get( + response = await async_client.get( "/groups/group_123/expenses", headers={"Authorization": "Bearer test_token"} ) # This test would need proper authentication mocking to work - assert response.status_code in [200, 401] + assert response.status_code in [status.HTTP_200_OK, status.HTTP_401_UNAUTHORIZED] +@pytest.mark.asyncio @patch("app.expenses.routes.get_current_user") @patch("app.expenses.service.expense_service.calculate_optimized_settlements") -def test_optimized_settlements_endpoint(mock_calculate_settlements, mock_get_current_user, mock_current_user): +async def test_optimized_settlements_endpoint(mock_calculate_settlements, mock_get_current_user, mock_current_user, async_client: AsyncClient): """Test optimized settlements calculation endpoint""" mock_get_current_user.return_value = mock_current_user @@ -112,15 +119,16 @@ def test_optimized_settlements_endpoint(mock_calculate_settlements, mock_get_cur } ] - response = client.post( + response = await async_client.post( "/groups/group_123/settlements/optimize", headers={"Authorization": "Bearer test_token"} ) # This test would need proper authentication mocking to work - assert response.status_code in [200, 401] + assert response.status_code in [status.HTTP_200_OK, status.HTTP_401_UNAUTHORIZED] -def test_expense_validation(): +@pytest.mark.asyncio +async def test_expense_validation(async_client: AsyncClient): """Test expense data validation""" # Invalid expense - splits don't sum to total @@ -134,14 +142,14 @@ def test_expense_validation(): "splitType": "equal" } - response = client.post( + response = await async_client.post( "/groups/group_123/expenses", json=invalid_data, headers={"Authorization": "Bearer test_token"} ) # Should return validation error - assert response.status_code in [422, 401] # 422 for validation error, 401 if auth fails first + assert response.status_code in [status.HTTP_422_UNPROCESSABLE_ENTITY, status.HTTP_401_UNAUTHORIZED] # 422 for validation error, 401 if auth fails first if __name__ == "__main__": pytest.main([__file__]) diff --git a/backend/tests/expenses/test_expense_service.py b/backend/tests/expenses/test_expense_service.py index 880c71a4..adfd0a74 100644 --- a/backend/tests/expenses/test_expense_service.py +++ b/backend/tests/expenses/test_expense_service.py @@ -1,11 +1,10 @@ import pytest -from fastapi.testclient import TestClient -from app.main import app +from main import app # Adjusted import - Keep app import for context if needed, but TestClient is removed from app.expenses.service import expense_service from app.expenses.schemas import ExpenseCreateRequest, ExpenseSplit, SplitType import asyncio -client = TestClient(app) +# client = TestClient(app) # Removed as it's not used @pytest.mark.asyncio async def test_settlement_algorithm_normal(): diff --git a/coverage.xml b/coverage.xml new file mode 100644 index 00000000..04a10fd6 --- /dev/null +++ b/coverage.xml @@ -0,0 +1,2712 @@ + + + + + + /app/backend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5ca17ecffaf57d32de83a618b2fb2f8c23d60694 Mon Sep 17 00:00:00 2001 From: Devasy Patel <110348311+Devasy23@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:52:51 +0530 Subject: [PATCH 2/2] Update code structure for improved readability and maintainability --- .coverage | Bin 53248 -> 0 bytes .github/workflows/run-tests.yml | 2 +- coverage.xml | 2712 ------------------------------- 3 files changed, 1 insertion(+), 2713 deletions(-) delete mode 100644 .coverage delete mode 100644 coverage.xml diff --git a/.coverage b/.coverage deleted file mode 100644 index 16b0d88f5e8127db8af2e35e1de4678a27d99d62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 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 DKcrXu diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index ecc296e4..1c4f315c 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -28,7 +28,7 @@ jobs: run: | cd $GITHUB_WORKSPACE export PYTHONPATH=$GITHUB_WORKSPACE:$GITHUB_WORKSPACE/backend - python -m pytest --cov=./backend --cov-report=xml:coverage.xml backend/tests/ + pytest --cov=./backend --cov-report=xml:coverage.xml backend/tests/ - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/coverage.xml b/coverage.xml deleted file mode 100644 index 04a10fd6..00000000 --- a/coverage.xml +++ /dev/null @@ -1,2712 +0,0 @@ - - - - - - /app/backend - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -