hestia-earth-models 0.54.3__py3-none-any.whl → 0.55.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of hestia-earth-models might be problematic. Click here for more details.
- hestia_earth/models/cycle/completeness/{other.py → seed.py} +5 -5
- hestia_earth/models/cycle/completeness/{soilAmendments.py → soilAmendment.py} +4 -4
- hestia_earth/models/cycle/product/economicValueShare.py +2 -2
- hestia_earth/models/environmentalFootprintV3/freshwaterEcotoxicityPotentialCtue.py +1 -1
- hestia_earth/models/geospatialDatabase/drainageClass.py +2 -2
- hestia_earth/models/ipcc2019/co2ToAirLimeHydrolysis.py +3 -1
- hestia_earth/models/ipcc2019/organicCarbonPerHa.py +1 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthHumanToxicityCancerogenic.py +1 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthHumanToxicityNonCancerogenic.py +1 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToMarineEcosystemsMarineEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthHumanToxicityCancerogenic.py +1 -1
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthHumanToxicityNonCancerogenic.py +1 -1
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToMarineEcosystemsMarineEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffects100Years/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthHumanToxicityCancerogenic.py +1 -1
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthHumanToxicityNonCancerogenic.py +1 -1
- hestia_earth/models/lcImpactCertainEffects100Years/damageToMarineEcosystemsMarineEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffects100Years/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthHumanToxicityCancerogenic.py +1 -1
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthHumanToxicityNonCancerogenic.py +1 -1
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToMarineEcosystemsMarineEcotoxicity.py +1 -1
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +1 -1
- hestia_earth/models/mocking/search-results.json +17 -17
- hestia_earth/models/pooreNemecek2018/excretaKgN.py +2 -2
- hestia_earth/models/pooreNemecek2018/excretaKgVs.py +2 -2
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterCropResidueDecomposition.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterExcreta.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterInorganicFertiliser.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterOrganicFertiliser.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterSoilFlux.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/ecosystemDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/humanCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/humanDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/humanNonCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/marineAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Egalitarian/terrestrialEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/ecosystemDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/humanCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/humanDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/humanNonCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/marineAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Hierarchist/terrestrialEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Individualist/ecosystemDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Individualist/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Individualist/humanCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Individualist/humanDamageOzoneFormation.py +1 -1
- hestia_earth/models/recipe2016Individualist/humanNonCarcinogenicToxicity.py +1 -1
- hestia_earth/models/recipe2016Individualist/marineAquaticEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/recipe2016Individualist/terrestrialEcotoxicityPotential14Dcbeq.py +1 -1
- hestia_earth/models/schmidt2007/utils.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirCropResidueDecompositionDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirExcretaDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirInorganicFertiliserDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirOrganicFertiliserDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirSoilFlux.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirCropResidueDecomposition.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirExcreta.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirInorganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirOrganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirSoilFlux.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirCropResidueDecomposition.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirExcreta.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirInorganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirOrganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirSoilFlux.py +1 -1
- hestia_earth/models/usetoxV2/freshwaterEcotoxicityPotentialCtue.py +1 -1
- hestia_earth/models/utils/cycle.py +3 -3
- hestia_earth/models/utils/pesticideAI.py +2 -2
- hestia_earth/models/utils/product.py +2 -0
- hestia_earth/models/version.py +1 -1
- {hestia_earth_models-0.54.3.dist-info → hestia_earth_models-0.55.0.dist-info}/METADATA +2 -2
- {hestia_earth_models-0.54.3.dist-info → hestia_earth_models-0.55.0.dist-info}/RECORD +88 -88
- tests/models/cycle/completeness/{test_other.py → test_seed.py} +1 -1
- tests/models/cycle/completeness/{test_soilAmendments.py → test_soilAmendment.py} +1 -1
- tests/models/cycle/product/test_economicValueShare.py +2 -2
- tests/models/pooreNemecek2018/test_excretaKgN.py +2 -2
- tests/models/pooreNemecek2018/test_excretaKgVs.py +2 -2
- tests/models/utils/test_source.py +1 -1
- {hestia_earth_models-0.54.3.dist-info → hestia_earth_models-0.55.0.dist-info}/LICENSE +0 -0
- {hestia_earth_models-0.54.3.dist-info → hestia_earth_models-0.55.0.dist-info}/WHEEL +0 -0
- {hestia_earth_models-0.54.3.dist-info → hestia_earth_models-0.55.0.dist-info}/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Completeness
|
|
2
|
+
Completeness Seed
|
|
3
3
|
|
|
4
4
|
This model checks if we have the requirements below and updates the
|
|
5
|
-
[Data Completeness](https://hestia.earth/schema/Completeness#
|
|
5
|
+
[Data Completeness](https://hestia.earth/schema/Completeness#seed) value.
|
|
6
6
|
"""
|
|
7
7
|
from hestia_earth.schema import SiteSiteType
|
|
8
8
|
from hestia_earth.utils.model import find_term_match, find_primary_product
|
|
@@ -13,7 +13,7 @@ from . import MODEL
|
|
|
13
13
|
|
|
14
14
|
REQUIREMENTS = {
|
|
15
15
|
"Cycle": {
|
|
16
|
-
"completeness.
|
|
16
|
+
"completeness.seed": "False",
|
|
17
17
|
"inputs": [
|
|
18
18
|
{"@type": "Input", "value": "", "term.@id": ["seed", "saplings"]}
|
|
19
19
|
],
|
|
@@ -25,13 +25,13 @@ REQUIREMENTS = {
|
|
|
25
25
|
}
|
|
26
26
|
RETURNS = {
|
|
27
27
|
"Completeness": {
|
|
28
|
-
"
|
|
28
|
+
"seed": ""
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
LOOKUPS = {
|
|
32
32
|
"crop": "isPlantation"
|
|
33
33
|
}
|
|
34
|
-
MODEL_KEY = '
|
|
34
|
+
MODEL_KEY = 'seed'
|
|
35
35
|
ALLOWED_SITE_TYPES = [
|
|
36
36
|
SiteSiteType.CROPLAND.value,
|
|
37
37
|
SiteSiteType.GLASS_OR_HIGH_ACCESSIBLE_COVER.value
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Completeness Soil Amendments
|
|
3
3
|
|
|
4
4
|
This model checks if we have the requirements below and updates the
|
|
5
|
-
[Data Completeness](https://hestia.earth/schema/Completeness#
|
|
5
|
+
[Data Completeness](https://hestia.earth/schema/Completeness#soilAmendment) value.
|
|
6
6
|
"""
|
|
7
7
|
from hestia_earth.models.log import logRequirements
|
|
8
8
|
from hestia_earth.models.utils import is_from_model
|
|
@@ -11,7 +11,7 @@ from . import MODEL
|
|
|
11
11
|
|
|
12
12
|
REQUIREMENTS = {
|
|
13
13
|
"Cycle": {
|
|
14
|
-
"completeness.
|
|
14
|
+
"completeness.soilAmendment": "False",
|
|
15
15
|
"endDate": "",
|
|
16
16
|
"site": {
|
|
17
17
|
"@type": "Site",
|
|
@@ -21,10 +21,10 @@ REQUIREMENTS = {
|
|
|
21
21
|
}
|
|
22
22
|
RETURNS = {
|
|
23
23
|
"Completeness": {
|
|
24
|
-
"
|
|
24
|
+
"soilAmendment": ""
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
MODEL_KEY = '
|
|
27
|
+
MODEL_KEY = 'soilAmendment'
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
def run(cycle: dict):
|
|
@@ -30,7 +30,7 @@ REQUIREMENTS = {
|
|
|
30
30
|
"currency": ""
|
|
31
31
|
}],
|
|
32
32
|
"optional": {
|
|
33
|
-
"completeness.
|
|
33
|
+
"completeness.product": ""
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -54,7 +54,7 @@ def _product(product: dict, value: float):
|
|
|
54
54
|
return {**product, MODEL_KEY: value}
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
def _is_complete(cycle: dict): return cycle.get('completeness', {}).get('
|
|
57
|
+
def _is_complete(cycle: dict): return cycle.get('completeness', {}).get('product', False)
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
def _no_yield(product): return list_sum(product.get('value', [-1]), -1) == 0
|
|
@@ -24,11 +24,11 @@ RETURNS = {
|
|
|
24
24
|
}
|
|
25
25
|
TERM_ID = 'drainageClass'
|
|
26
26
|
EE_PARAMS = {
|
|
27
|
-
'collection': '
|
|
27
|
+
'collection': 'DRAINAGE_v2',
|
|
28
28
|
'ee_type': 'raster',
|
|
29
29
|
'reducer': 'mode'
|
|
30
30
|
}
|
|
31
|
-
BIBLIO_TITLE = 'Harmonized World Soil Database Version
|
|
31
|
+
BIBLIO_TITLE = 'Harmonized World Soil Database Version 2.0.'
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def _measurement(site: dict, value: float):
|
|
@@ -40,7 +40,9 @@ def _emission(value: float):
|
|
|
40
40
|
def _get_lime_values(cycle: dict, inputs: list):
|
|
41
41
|
# TODO: use lookup table
|
|
42
42
|
values = [convert_to_unit(i, Units.KG_CO2) for i in inputs if len(i.get('value', [])) > 0]
|
|
43
|
-
return [0] if
|
|
43
|
+
return [0] if (
|
|
44
|
+
len(values) == 0 and _is_term_type_complete(cycle, {'termType': TermTermType.SOILAMENDMENT.value})
|
|
45
|
+
) else values
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
def _run(CaCO3_values: list, MgCO3_values: list):
|
|
@@ -861,19 +861,19 @@
|
|
|
861
861
|
},
|
|
862
862
|
{
|
|
863
863
|
"@type": "Term",
|
|
864
|
-
"@id": "
|
|
864
|
+
"@id": "discardedCropLeftOnField"
|
|
865
865
|
},
|
|
866
866
|
{
|
|
867
867
|
"@type": "Term",
|
|
868
|
-
"@id": "
|
|
868
|
+
"@id": "discardedCropTotal"
|
|
869
869
|
},
|
|
870
870
|
{
|
|
871
871
|
"@type": "Term",
|
|
872
|
-
"@id": "
|
|
872
|
+
"@id": "discardedCropIncorporated"
|
|
873
873
|
},
|
|
874
874
|
{
|
|
875
875
|
"@type": "Term",
|
|
876
|
-
"@id": "
|
|
876
|
+
"@id": "aboveGroundCropResidueRemoved"
|
|
877
877
|
},
|
|
878
878
|
{
|
|
879
879
|
"@type": "Term",
|
|
@@ -999,11 +999,11 @@
|
|
|
999
999
|
},
|
|
1000
1000
|
{
|
|
1001
1001
|
"@type": "Term",
|
|
1002
|
-
"@id": "
|
|
1002
|
+
"@id": "energyDigestibilityPigs"
|
|
1003
1003
|
},
|
|
1004
1004
|
{
|
|
1005
1005
|
"@type": "Term",
|
|
1006
|
-
"@id": "
|
|
1006
|
+
"@id": "energyDigestibilityRabbits"
|
|
1007
1007
|
},
|
|
1008
1008
|
{
|
|
1009
1009
|
"@type": "Term",
|
|
@@ -1048,27 +1048,27 @@
|
|
|
1048
1048
|
},
|
|
1049
1049
|
{
|
|
1050
1050
|
"@type": "Term",
|
|
1051
|
-
"@id": "
|
|
1051
|
+
"@id": "excretaSolidAndLiquidFishCrustaceansKgN"
|
|
1052
1052
|
},
|
|
1053
1053
|
{
|
|
1054
1054
|
"@type": "Term",
|
|
1055
|
-
"@id": "
|
|
1055
|
+
"@id": "excretaBuffaloKgN"
|
|
1056
1056
|
},
|
|
1057
1057
|
{
|
|
1058
1058
|
"@type": "Term",
|
|
1059
|
-
"@id": "
|
|
1059
|
+
"@id": "excretaInsectsKgN"
|
|
1060
1060
|
},
|
|
1061
1061
|
{
|
|
1062
1062
|
"@type": "Term",
|
|
1063
|
-
"@id": "
|
|
1063
|
+
"@id": "excretaBeefCattleFeedlotFedKgN"
|
|
1064
1064
|
},
|
|
1065
1065
|
{
|
|
1066
1066
|
"@type": "Term",
|
|
1067
|
-
"@id": "
|
|
1067
|
+
"@id": "excretaGeeseKgN"
|
|
1068
1068
|
},
|
|
1069
1069
|
{
|
|
1070
1070
|
"@type": "Term",
|
|
1071
|
-
"@id": "
|
|
1071
|
+
"@id": "excretaKgN"
|
|
1072
1072
|
},
|
|
1073
1073
|
{
|
|
1074
1074
|
"@type": "Term",
|
|
@@ -1212,7 +1212,7 @@
|
|
|
1212
1212
|
"@type": "Term",
|
|
1213
1213
|
"name": "Generic crop, seed",
|
|
1214
1214
|
"@id": "genericCropSeed",
|
|
1215
|
-
"_score":
|
|
1215
|
+
"_score": 22.756205
|
|
1216
1216
|
}
|
|
1217
1217
|
]
|
|
1218
1218
|
},
|
|
@@ -1396,19 +1396,19 @@
|
|
|
1396
1396
|
},
|
|
1397
1397
|
{
|
|
1398
1398
|
"@type": "Term",
|
|
1399
|
-
"@id": "
|
|
1399
|
+
"@id": "milkYieldPerSheepFpcm"
|
|
1400
1400
|
},
|
|
1401
1401
|
{
|
|
1402
1402
|
"@type": "Term",
|
|
1403
|
-
"@id": "
|
|
1403
|
+
"@id": "milkYieldPerCowFpcm"
|
|
1404
1404
|
},
|
|
1405
1405
|
{
|
|
1406
1406
|
"@type": "Term",
|
|
1407
|
-
"@id": "
|
|
1407
|
+
"@id": "milkYieldPerCamelRaw"
|
|
1408
1408
|
},
|
|
1409
1409
|
{
|
|
1410
1410
|
"@type": "Term",
|
|
1411
|
-
"@id": "
|
|
1411
|
+
"@id": "milkYieldPerBuffaloRaw"
|
|
1412
1412
|
}
|
|
1413
1413
|
]
|
|
1414
1414
|
},
|
|
@@ -27,7 +27,7 @@ from . import MODEL
|
|
|
27
27
|
REQUIREMENTS = {
|
|
28
28
|
"Cycle": {
|
|
29
29
|
"completeness.animalFeed": "",
|
|
30
|
-
"completeness.
|
|
30
|
+
"completeness.product": "",
|
|
31
31
|
"inputs": [{
|
|
32
32
|
"@type": "Input",
|
|
33
33
|
"term.termType": ["crop", "animalProduct", "feedFoodAdditive"],
|
|
@@ -92,7 +92,7 @@ def _should_run(cycle: dict):
|
|
|
92
92
|
primary_prod = find_primary_product(cycle) or {}
|
|
93
93
|
excreta_term_id = _get_excreta_n_term(primary_prod)
|
|
94
94
|
dc = cycle.get('completeness', {})
|
|
95
|
-
is_complete = dc.get('animalFeed', False) and dc.get('
|
|
95
|
+
is_complete = dc.get('animalFeed', False) and dc.get('product', False)
|
|
96
96
|
|
|
97
97
|
inputs = cycle.get('inputs', [])
|
|
98
98
|
inputs_n = get_feed_nitrogen(cycle, MODEL_LOG, excreta_term_id, inputs)
|
|
@@ -28,7 +28,7 @@ REQUIREMENTS = {
|
|
|
28
28
|
"or": [
|
|
29
29
|
{
|
|
30
30
|
"completeness.animalFeed": "",
|
|
31
|
-
"completeness.
|
|
31
|
+
"completeness.product": "",
|
|
32
32
|
"inputs": [{
|
|
33
33
|
"@type": "Input",
|
|
34
34
|
"term.termType": ["crop", "animalProduct", "feedFoodAdditive"],
|
|
@@ -127,7 +127,7 @@ def _should_run(cycle: dict):
|
|
|
127
127
|
excreta_term_id = _get_excreta_vs_term(primary_prod)
|
|
128
128
|
|
|
129
129
|
dc = cycle.get('completeness', {})
|
|
130
|
-
is_complete = dc.get('animalFeed', False) and dc.get('
|
|
130
|
+
is_complete = dc.get('animalFeed', False) and dc.get('product', False)
|
|
131
131
|
carbonContent = _get_carbonContent(cycle)
|
|
132
132
|
|
|
133
133
|
products = cycle.get('products', [])
|
|
@@ -10,7 +10,7 @@ REQUIREMENTS = {
|
|
|
10
10
|
"emissionsResourceUse": [{"@type": "Indicator", "value": "", "term.termType": "emission"}],
|
|
11
11
|
"cycle": {
|
|
12
12
|
"@type": "Cycle",
|
|
13
|
-
"completeness.
|
|
13
|
+
"completeness.pesticideVeterinaryDrug": "True",
|
|
14
14
|
"inputs": [{"@type": "Input", "value": "", "term.termType": "pesticideAI"}]
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -10,7 +10,7 @@ REQUIREMENTS = {
|
|
|
10
10
|
"emissionsResourceUse": [{"@type": "Indicator", "value": "", "term.termType": "emission"}],
|
|
11
11
|
"cycle": {
|
|
12
12
|
"@type": "Cycle",
|
|
13
|
-
"completeness.
|
|
13
|
+
"completeness.pesticideVeterinaryDrug": "True",
|
|
14
14
|
"inputs": [{"@type": "Input", "value": "", "term.termType": "pesticideAI"}]
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -10,7 +10,7 @@ REQUIREMENTS = {
|
|
|
10
10
|
"emissionsResourceUse": [{"@type": "Indicator", "value": "", "term.termType": "emission"}],
|
|
11
11
|
"cycle": {
|
|
12
12
|
"@type": "Cycle",
|
|
13
|
-
"completeness.
|
|
13
|
+
"completeness.pesticideVeterinaryDrug": "True",
|
|
14
14
|
"inputs": [{"@type": "Input", "value": "", "term.termType": "pesticideAI"}]
|
|
15
15
|
}
|
|
16
16
|
}
|