From 7532356a0352efc96950cf45616a92aefb160520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Fri, 12 Jun 2026 12:41:07 -0600 Subject: [PATCH 1/6] Enhance FraudFundsTransferRequest with optional fields and validation logic - Added optional fields: clabe, bank_code, and tipo_pago. - Implemented validation to ensure either clabe or bank_code is provided, and tipo_pago is required when bank_code is used. - Updated tests to cover new validation scenarios and parameterized input for better coverage. --- cuenca_validations/types/requests.py | 12 ++++- cuenca_validations/version.py | 2 +- tests/test_types.py | 77 +++++++++++++++++++--------- 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 1357352e..6cf1cece 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -326,10 +326,20 @@ class WalletTransactionRequest(BaseRequest): class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr - clabe: Clabe + clabe: Optional[Clabe] = None + bank_code: Optional[str] = None + tipo_pago: Optional[int] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None + @model_validator(mode='after') + def validate_destination(self) -> 'FraudFundsTransferRequest': + if self.clabe is None and self.bank_code is None: + raise ValueError('clabe or bank_code required') + if self.bank_code is not None and self.tipo_pago is None: + raise ValueError('tipo_pago required when using bank_code') + return self + class FraudValidationRequest(BaseModel): amount: StrictPositiveInt diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 7c11f9ad..86a0f244 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.37' +__version__ = '2.1.38.dev0' diff --git a/tests/test_types.py b/tests/test_types.py index 26ca75de..32fac7bf 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -675,31 +675,62 @@ def test_bank_account_validation_clabe_request(): assert BankAccountValidationRequest(account_number='646180157098510917') -def test_fraud_funds_transfer_request(): - request = FraudFundsTransferRequest( - user_id='US123', - clabe='646180157098510917', - amount=10000, - concepto=' Devolución fraude ', - ) - - assert request.concepto == 'Devolución fraude' - assert request.model_dump() == { - 'user_id': 'US123', - 'clabe': '646180157098510917', - 'amount': 10000, - 'concepto': 'Devolución fraude', - } +@pytest.mark.parametrize( + 'data, expected_dump', + [ + ( + dict( + user_id='US123', + clabe='646180157098510917', + amount=10000, + concepto=' Devolución fraude ', + ), + dict( + user_id='US123', + clabe='646180157098510917', + amount=10000, + concepto='Devolución fraude', + ), + ), + ( + dict(user_id='US123', clabe='646180157098510917'), + dict(user_id='US123', clabe='646180157098510917'), + ), + ( + dict( + user_id='US123', + bank_code='40012', + tipo_pago=1, + amount=5000, + ), + dict( + user_id='US123', + bank_code='40012', + tipo_pago=1, + amount=5000, + ), + ), + ], +) +def test_fraud_funds_transfer_request(data, expected_dump): + request = FraudFundsTransferRequest(**data) + assert request.model_dump() == expected_dump - request_full_balance = FraudFundsTransferRequest( - user_id='US123', - clabe='646180157098510917', - ) - assert request_full_balance.model_dump() == { - 'user_id': 'US123', - 'clabe': '646180157098510917', - } +@pytest.mark.parametrize( + 'data, expected_error', + [ + (dict(user_id='US123'), 'clabe or bank_code required'), + ( + dict(user_id='US123', bank_code='40012'), + 'tipo_pago required when using bank_code', + ), + ], +) +def test_fraud_funds_transfer_request_invalid(data, expected_error): + with pytest.raises(ValidationError) as exc: + FraudFundsTransferRequest(**data) + assert expected_error in str(exc.value) @pytest.mark.parametrize( From c1bee88a848f9af9a0e4b6747f4912c00d526c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Fri, 12 Jun 2026 13:16:44 -0600 Subject: [PATCH 2/6] add FraudFundsTransferTipoPago enum - Bumped version to 2.1.38.dev1. - Introduced FraudFundsTransferTipoPago enum for payment types. - Updated FraudFundsTransferRequest to use FraudFundsTransferTipoPago for tipo_pago field. - Modified tests to validate new tipo_pago values. --- cuenca_validations/types/__init__.py | 2 ++ cuenca_validations/types/enums.py | 8 ++++++- cuenca_validations/types/requests.py | 3 ++- cuenca_validations/version.py | 2 +- tests/test_types.py | 35 +++++++++++++++++----------- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index b5370342..d754a318 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -45,6 +45,7 @@ 'FileRequest', 'FileUploadRequest', 'FraudFundsTransferRequest', + 'FraudFundsTransferTipoPago', 'Gender', 'IncomeType', 'IssuerNetwork', @@ -145,6 +146,7 @@ EventType, FileExtension, FileFormat, + FraudFundsTransferTipoPago, Gender, IncomeType, IssuerNetwork, diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index f64f01ad..eedd1939 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -1,4 +1,4 @@ -from enum import Enum +from enum import Enum, IntEnum class CardNetwork(str, Enum): @@ -743,3 +743,9 @@ class RequiredAction(str, Enum): level_up_required = 'level_up_required' level_up_invitation = 'level_up_invitation' fix_documents = 'fix_documents' + + +class FraudFundsTransferTipoPago(IntEnum): + participante_participante = 7 + devolucion_especial_ordenes_aceptadas_acreditadas = 23 + devolucion_extemporanea_especial_ordenes_acreditadas = 24 diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 6cf1cece..01140609 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -29,6 +29,7 @@ Country, EcommerceIndicator, FileExtension, + FraudFundsTransferTipoPago, Gender, IncomeType, IssuerNetwork, @@ -328,7 +329,7 @@ class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr clabe: Optional[Clabe] = None bank_code: Optional[str] = None - tipo_pago: Optional[int] = None + tipo_pago: Optional[FraudFundsTransferTipoPago] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 86a0f244..bba4854a 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.38.dev0' +__version__ = '2.1.38.dev1' diff --git a/tests/test_types.py b/tests/test_types.py index 32fac7bf..6149d1d7 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -696,20 +696,23 @@ def test_bank_account_validation_clabe_request(): dict(user_id='US123', clabe='646180157098510917'), dict(user_id='US123', clabe='646180157098510917'), ), - ( - dict( - user_id='US123', - bank_code='40012', - tipo_pago=1, - amount=5000, - ), - dict( - user_id='US123', - bank_code='40012', - tipo_pago=1, - amount=5000, - ), - ), + *[ + ( + dict( + user_id='US123', + bank_code='40012', + tipo_pago=tipo_pago, + amount=5000, + ), + dict( + user_id='US123', + bank_code='40012', + tipo_pago=tipo_pago, + amount=5000, + ), + ) + for tipo_pago in (7, 23, 24) + ], ], ) def test_fraud_funds_transfer_request(data, expected_dump): @@ -725,6 +728,10 @@ def test_fraud_funds_transfer_request(data, expected_dump): dict(user_id='US123', bank_code='40012'), 'tipo_pago required when using bank_code', ), + ( + dict(user_id='US123', bank_code='40012', tipo_pago=1), + 'Input should be 7, 23 or 24', + ), ], ) def test_fraud_funds_transfer_request_invalid(data, expected_error): From 4e2bedecab17d9c182e6503ce1ff376c6eeb034e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Fri, 12 Jun 2026 13:37:03 -0600 Subject: [PATCH 3/6] Add BankCode validation and update FraudFundsTransferRequest - Introduced BankCode as a validated type for bank codes. - Implemented validation logic to ensure bank codes are valid. - Updated FraudFundsTransferRequest to use BankCode for the bank_code field. - Enhanced tests to cover invalid bank code scenarios. --- cuenca_validations/types/__init__.py | 2 ++ cuenca_validations/types/general.py | 14 ++++++++++++++ cuenca_validations/types/requests.py | 3 ++- cuenca_validations/version.py | 2 +- tests/test_types.py | 4 ++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index d754a318..59ae318e 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -8,6 +8,7 @@ 'BalanceEntryQuery', 'BankAccountValidationQuery', 'BankAccountValidationRequest', + 'BankCode', 'PostalCodeQuery', 'UsersTOSQuery', 'TOSQuery', @@ -177,6 +178,7 @@ ) from .files import BatchFileMetadata from .general import ( + BankCode, JSONEncoder, LogConfig, SantizedDict, diff --git a/cuenca_validations/types/general.py b/cuenca_validations/types/general.py index 86d29d4f..edc9632f 100644 --- a/cuenca_validations/types/general.py +++ b/cuenca_validations/types/general.py @@ -2,6 +2,7 @@ from dataclasses import dataclass from typing import Annotated, Any, Optional +from clabe import BANK_NAMES from pydantic import ( AfterValidator, AnyUrl, @@ -41,6 +42,19 @@ ] +def validate_bank_code(bank_code: str) -> str: + if bank_code not in BANK_NAMES: + raise ValueError('Not a valid bank code') + return bank_code + + +BankCode = Annotated[ + str, + StringConstraints(strip_whitespace=True), + AfterValidator(validate_bank_code), +] + + class SantizedDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 01140609..22946b73 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -67,6 +67,7 @@ StrictPaymentCardNumber, ) from .general import ( + BankCode, LogConfig, NonEmptyStr, SerializableAnyUrl, @@ -328,7 +329,7 @@ class WalletTransactionRequest(BaseRequest): class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr clabe: Optional[Clabe] = None - bank_code: Optional[str] = None + bank_code: Optional[BankCode] = None tipo_pago: Optional[FraudFundsTransferTipoPago] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index bba4854a..4d3c1170 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.38.dev1' +__version__ = '2.1.38.dev2' diff --git a/tests/test_types.py b/tests/test_types.py index 6149d1d7..5954af6b 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -732,6 +732,10 @@ def test_fraud_funds_transfer_request(data, expected_dump): dict(user_id='US123', bank_code='40012', tipo_pago=1), 'Input should be 7, 23 or 24', ), + ( + dict(user_id='US123', bank_code='99999', tipo_pago=7), + 'Not a valid bank code', + ), ], ) def test_fraud_funds_transfer_request_invalid(data, expected_error): From 4cd4e5cf1a07d688e11c70ac0f732ed1b4d44f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Tue, 16 Jun 2026 18:16:26 -0600 Subject: [PATCH 4/6] Remove deprecated tipo_pago values from FraudFundsTransferTipoPago enum and update related tests to reflect the changes in valid payment types. --- cuenca_validations/types/enums.py | 2 -- tests/test_types.py | 37 ++++++++++++++++--------------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index eedd1939..ae213542 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -747,5 +747,3 @@ class RequiredAction(str, Enum): class FraudFundsTransferTipoPago(IntEnum): participante_participante = 7 - devolucion_especial_ordenes_aceptadas_acreditadas = 23 - devolucion_extemporanea_especial_ordenes_acreditadas = 24 diff --git a/tests/test_types.py b/tests/test_types.py index 5954af6b..1fc27b8f 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -696,23 +696,20 @@ def test_bank_account_validation_clabe_request(): dict(user_id='US123', clabe='646180157098510917'), dict(user_id='US123', clabe='646180157098510917'), ), - *[ - ( - dict( - user_id='US123', - bank_code='40012', - tipo_pago=tipo_pago, - amount=5000, - ), - dict( - user_id='US123', - bank_code='40012', - tipo_pago=tipo_pago, - amount=5000, - ), - ) - for tipo_pago in (7, 23, 24) - ], + ( + dict( + user_id='US123', + bank_code='40012', + tipo_pago=7, + amount=5000, + ), + dict( + user_id='US123', + bank_code='40012', + tipo_pago=7, + amount=5000, + ), + ), ], ) def test_fraud_funds_transfer_request(data, expected_dump): @@ -730,7 +727,11 @@ def test_fraud_funds_transfer_request(data, expected_dump): ), ( dict(user_id='US123', bank_code='40012', tipo_pago=1), - 'Input should be 7, 23 or 24', + 'Input should be 7', + ), + ( + dict(user_id='US123', bank_code='40012', tipo_pago=23), + 'Input should be 7', ), ( dict(user_id='US123', bank_code='99999', tipo_pago=7), From c31ff54a536a70abc0be0330b6cf2c17618ec323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Wed, 17 Jun 2026 18:21:16 -0600 Subject: [PATCH 5/6] Remove deprecated FraudFundsTransferTipoPago references - Bumped version to 2.1.38. - Removed FraudFundsTransferTipoPago enum and its references from the codebase. - Updated tests to reflect changes in the FraudFundsTransferRequest validation logic. --- cuenca_validations/types/__init__.py | 2 - cuenca_validations/types/enums.py | 6 +-- cuenca_validations/types/requests.py | 4 -- cuenca_validations/version.py | 2 +- tests/test_types.py | 75 ++++------------------------ 5 files changed, 12 insertions(+), 77 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index 59ae318e..803d4c10 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -46,7 +46,6 @@ 'FileRequest', 'FileUploadRequest', 'FraudFundsTransferRequest', - 'FraudFundsTransferTipoPago', 'Gender', 'IncomeType', 'IssuerNetwork', @@ -147,7 +146,6 @@ EventType, FileExtension, FileFormat, - FraudFundsTransferTipoPago, Gender, IncomeType, IssuerNetwork, diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index ae213542..f64f01ad 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -1,4 +1,4 @@ -from enum import Enum, IntEnum +from enum import Enum class CardNetwork(str, Enum): @@ -743,7 +743,3 @@ class RequiredAction(str, Enum): level_up_required = 'level_up_required' level_up_invitation = 'level_up_invitation' fix_documents = 'fix_documents' - - -class FraudFundsTransferTipoPago(IntEnum): - participante_participante = 7 diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 22946b73..69b64e32 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -29,7 +29,6 @@ Country, EcommerceIndicator, FileExtension, - FraudFundsTransferTipoPago, Gender, IncomeType, IssuerNetwork, @@ -330,7 +329,6 @@ class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr clabe: Optional[Clabe] = None bank_code: Optional[BankCode] = None - tipo_pago: Optional[FraudFundsTransferTipoPago] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None @@ -338,8 +336,6 @@ class FraudFundsTransferRequest(BaseRequest): def validate_destination(self) -> 'FraudFundsTransferRequest': if self.clabe is None and self.bank_code is None: raise ValueError('clabe or bank_code required') - if self.bank_code is not None and self.tipo_pago is None: - raise ValueError('tipo_pago required when using bank_code') return self diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 4d3c1170..c8942909 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.38.dev2' +__version__ = '2.1.38' diff --git a/tests/test_types.py b/tests/test_types.py index 1fc27b8f..34e7f26d 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -675,74 +675,19 @@ def test_bank_account_validation_clabe_request(): assert BankAccountValidationRequest(account_number='646180157098510917') -@pytest.mark.parametrize( - 'data, expected_dump', - [ - ( - dict( - user_id='US123', - clabe='646180157098510917', - amount=10000, - concepto=' Devolución fraude ', - ), - dict( - user_id='US123', - clabe='646180157098510917', - amount=10000, - concepto='Devolución fraude', - ), - ), - ( - dict(user_id='US123', clabe='646180157098510917'), - dict(user_id='US123', clabe='646180157098510917'), - ), - ( - dict( - user_id='US123', - bank_code='40012', - tipo_pago=7, - amount=5000, - ), - dict( - user_id='US123', - bank_code='40012', - tipo_pago=7, - amount=5000, - ), - ), - ], -) -def test_fraud_funds_transfer_request(data, expected_dump): - request = FraudFundsTransferRequest(**data) - assert request.model_dump() == expected_dump +def test_fraud_funds_transfer_request(): + assert FraudFundsTransferRequest( + user_id='US123', + bank_code='40012', + ).model_dump() == {'user_id': 'US123', 'bank_code': '40012'} + with pytest.raises(ValidationError) as exc: + FraudFundsTransferRequest(user_id='US123') + assert 'clabe or bank_code required' in str(exc.value) -@pytest.mark.parametrize( - 'data, expected_error', - [ - (dict(user_id='US123'), 'clabe or bank_code required'), - ( - dict(user_id='US123', bank_code='40012'), - 'tipo_pago required when using bank_code', - ), - ( - dict(user_id='US123', bank_code='40012', tipo_pago=1), - 'Input should be 7', - ), - ( - dict(user_id='US123', bank_code='40012', tipo_pago=23), - 'Input should be 7', - ), - ( - dict(user_id='US123', bank_code='99999', tipo_pago=7), - 'Not a valid bank code', - ), - ], -) -def test_fraud_funds_transfer_request_invalid(data, expected_error): with pytest.raises(ValidationError) as exc: - FraudFundsTransferRequest(**data) - assert expected_error in str(exc.value) + FraudFundsTransferRequest(user_id='US123', bank_code='99999') + assert 'Not a valid bank code' in str(exc.value) @pytest.mark.parametrize( From a535409d0ecf29afbe639f27c1ffd9138b0620cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Cabrera?= Date: Thu, 18 Jun 2026 15:01:46 -0600 Subject: [PATCH 6/6] Refactor bank code handling in FraudFundsTransferRequest - Removed the BankCode type and its validation logic from the codebase. - Updated FraudFundsTransferRequest to use a simple string for bank_code. - Implemented a new field validator for bank_code to ensure it matches valid bank names. - Adjusted related imports and cleaned up unused code in general.py and __init__.py. --- cuenca_validations/types/__init__.py | 2 -- cuenca_validations/types/general.py | 14 -------------- cuenca_validations/types/requests.py | 12 +++++++++--- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index 803d4c10..b5370342 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -8,7 +8,6 @@ 'BalanceEntryQuery', 'BankAccountValidationQuery', 'BankAccountValidationRequest', - 'BankCode', 'PostalCodeQuery', 'UsersTOSQuery', 'TOSQuery', @@ -176,7 +175,6 @@ ) from .files import BatchFileMetadata from .general import ( - BankCode, JSONEncoder, LogConfig, SantizedDict, diff --git a/cuenca_validations/types/general.py b/cuenca_validations/types/general.py index edc9632f..86d29d4f 100644 --- a/cuenca_validations/types/general.py +++ b/cuenca_validations/types/general.py @@ -2,7 +2,6 @@ from dataclasses import dataclass from typing import Annotated, Any, Optional -from clabe import BANK_NAMES from pydantic import ( AfterValidator, AnyUrl, @@ -42,19 +41,6 @@ ] -def validate_bank_code(bank_code: str) -> str: - if bank_code not in BANK_NAMES: - raise ValueError('Not a valid bank code') - return bank_code - - -BankCode = Annotated[ - str, - StringConstraints(strip_whitespace=True), - AfterValidator(validate_bank_code), -] - - class SantizedDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 69b64e32..661db882 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -1,7 +1,7 @@ import datetime as dt from typing import Annotated, Any, Optional, Union -from clabe import Clabe +from clabe import BANK_NAMES, Clabe from pydantic import ( BaseModel, ConfigDict, @@ -66,7 +66,6 @@ StrictPaymentCardNumber, ) from .general import ( - BankCode, LogConfig, NonEmptyStr, SerializableAnyUrl, @@ -328,10 +327,17 @@ class WalletTransactionRequest(BaseRequest): class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr clabe: Optional[Clabe] = None - bank_code: Optional[BankCode] = None + bank_code: Optional[str] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None + @field_validator('bank_code') + @classmethod + def validate_bank_code(cls, bank_code: Optional[str]) -> Optional[str]: + if bank_code is not None and bank_code not in BANK_NAMES: + raise ValueError('Not a valid bank code') + return bank_code + @model_validator(mode='after') def validate_destination(self) -> 'FraudFundsTransferRequest': if self.clabe is None and self.bank_code is None: