@hyperlane-xyz/core 5.6.0 → 5.6.1
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.
- package/contracts/PackageVersioned.sol +1 -1
- package/contracts/token/extensions/HypERC4626.sol +66 -29
- package/dist/buildArtifact.js +1 -1
- package/dist/buildArtifact.json +1 -1
- package/dist/contracts/token/extensions/HypERC4626.d.ts +26 -11
- package/dist/contracts/token/extensions/HypERC4626.d.ts.map +1 -1
- package/dist/factories/contracts/AttributeCheckpointFraud__factory.d.ts +1 -1
- package/dist/factories/contracts/AttributeCheckpointFraud__factory.js +1 -1
- package/dist/factories/contracts/CheckpointFraudProofs__factory.d.ts +1 -1
- package/dist/factories/contracts/CheckpointFraudProofs__factory.js +1 -1
- package/dist/factories/contracts/Mailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/Mailbox__factory.js +1 -1
- package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.d.ts +1 -1
- package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.js +1 -1
- package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.d.ts +1 -1
- package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.js +1 -1
- package/dist/factories/contracts/hooks/ArbL2ToL1Hook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/ArbL2ToL1Hook__factory.js +1 -1
- package/dist/factories/contracts/hooks/MerkleTreeHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/MerkleTreeHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/OPL2ToL1Hook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/OPL2ToL1Hook__factory.js +1 -1
- package/dist/factories/contracts/hooks/OPStackHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/OPStackHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/PausableHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/PausableHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/PolygonPosHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/PolygonPosHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/ProtocolFee__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/ProtocolFee__factory.js +1 -1
- package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/aggregation/ERC5164Hook__factory.js +1 -1
- package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/aggregation/StaticAggregationHookFactory__factory.js +1 -1
- package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/aggregation/StaticAggregationHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/igp/InterchainGasPaymaster__factory.js +1 -1
- package/dist/factories/contracts/hooks/igp/StorageGasOracle__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/igp/StorageGasOracle__factory.js +1 -1
- package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/layer-zero/LayerZeroV1Hook__factory.js +1 -1
- package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/layer-zero/LayerZeroV2Hook__factory.js +1 -1
- package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/routing/DestinationRecipientRoutingHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/routing/DomainRoutingHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/routing/FallbackDomainRoutingHook__factory.js +1 -1
- package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.d.ts +1 -1
- package/dist/factories/contracts/hooks/warp-route/RateLimitedHook__factory.js +1 -1
- package/dist/factories/contracts/isms/NoopIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/NoopIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/PausableIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/PausableIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/TrustedRelayerIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/ArbL2ToL1Ism__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/ArbL2ToL1Ism__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/ERC5164Ism__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/ERC5164Ism__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/OPL2ToL1Ism__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/OPL2ToL1Ism__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/OPStackIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/OPStackIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/PolygonPosIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/PolygonPosIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/hook/layer-zero/LayerZeroV2Ism__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/hook/layer-zero/LayerZeroV2Ism__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/ValidatorAnnounce__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMerkleRootWeightedMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/WeightedMultisigIsm.sol/StaticMessageIdWeightedMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/DefaultFallbackRoutingIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory.sol/DomainRoutingIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/warp-route/RateLimitedIsm__factory.js +1 -1
- package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.js +1 -1
- package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts +1 -1
- package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js +1 -1
- package/dist/factories/contracts/mock/MockMailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/mock/MockMailbox__factory.js +1 -1
- package/dist/factories/contracts/test/TestGasRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestGasRouter__factory.js +1 -1
- package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestInterchainGasPaymaster__factory.js +1 -1
- package/dist/factories/contracts/test/TestMailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestMailbox__factory.js +1 -1
- package/dist/factories/contracts/test/TestMerkleTreeHook__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestMerkleTreeHook__factory.js +1 -1
- package/dist/factories/contracts/test/TestPostDispatchHook__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestPostDispatchHook__factory.js +1 -1
- package/dist/factories/contracts/test/TestQuerySender__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestQuerySender__factory.js +1 -1
- package/dist/factories/contracts/test/TestQuery__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestQuery__factory.js +1 -1
- package/dist/factories/contracts/test/TestRemoteChallenger__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestRemoteChallenger__factory.js +1 -1
- package/dist/factories/contracts/test/TestRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestRouter__factory.js +1 -1
- package/dist/factories/contracts/test/TestSendReceiver__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestSendReceiver__factory.js +1 -1
- package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.d.ts +1 -1
- package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.js +1 -1
- package/dist/factories/contracts/token/HypERC20Collateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/HypERC20Collateral__factory.js +1 -1
- package/dist/factories/contracts/token/HypERC20__factory.d.ts +1 -1
- package/dist/factories/contracts/token/HypERC20__factory.js +1 -1
- package/dist/factories/contracts/token/HypERC721Collateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/HypERC721Collateral__factory.js +1 -1
- package/dist/factories/contracts/token/HypERC721__factory.d.ts +1 -1
- package/dist/factories/contracts/token/HypERC721__factory.js +1 -1
- package/dist/factories/contracts/token/HypNative__factory.d.ts +1 -1
- package/dist/factories/contracts/token/HypNative__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/FastHypERC20Collateral__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/FastHypERC20__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/FastHypERC20__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626Collateral__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626OwnerCollateral__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626__factory.d.ts +13 -3
- package/dist/factories/contracts/token/extensions/HypERC4626__factory.d.ts.map +1 -1
- package/dist/factories/contracts/token/extensions/HypERC4626__factory.js +16 -3
- package/dist/factories/contracts/token/extensions/HypERC4626__factory.js.map +1 -1
- package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypERC721URICollateral__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypERC721URIStorage__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypFiatToken__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypFiatToken__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypNativeScaled__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/HypXERC20__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/HypXERC20__factory.js +1 -1
- package/dist/factories/contracts/token/extensions/WHypERC4626__factory.d.ts +1 -1
- package/dist/factories/contracts/token/extensions/WHypERC4626__factory.js +1 -1
- package/package.json +2 -2
|
@@ -22,10 +22,13 @@ import {TokenRouter} from "../libs/TokenRouter.sol";
|
|
|
22
22
|
|
|
23
23
|
// ============ External Imports ============
|
|
24
24
|
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
|
|
25
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
26
|
+
import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
|
25
27
|
|
|
26
28
|
/**
|
|
27
29
|
* @title Hyperlane ERC20 Rebasing Token
|
|
28
30
|
* @author Abacus Works
|
|
31
|
+
* @notice This contract implements a rebasing token that reflects yields from the origin chain
|
|
29
32
|
*/
|
|
30
33
|
contract HypERC4626 is HypERC20 {
|
|
31
34
|
using Math for uint256;
|
|
@@ -49,6 +52,67 @@ contract HypERC4626 is HypERC20 {
|
|
|
49
52
|
_disableInitializers();
|
|
50
53
|
}
|
|
51
54
|
|
|
55
|
+
// ============ Public Functions ============
|
|
56
|
+
|
|
57
|
+
/// Override transfer to handle underlying amounts while using shares internally
|
|
58
|
+
/// @inheritdoc ERC20Upgradeable
|
|
59
|
+
/// @dev the Transfer event emitted from ERC20Upgradeable will be in terms of shares not assets, so it may be misleading
|
|
60
|
+
function transfer(
|
|
61
|
+
address to,
|
|
62
|
+
uint256 amount
|
|
63
|
+
) public virtual override returns (bool) {
|
|
64
|
+
_transfer(_msgSender(), to, assetsToShares(amount));
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// Override transferFrom to handle underlying amounts while using shares internally
|
|
69
|
+
/// @inheritdoc ERC20Upgradeable
|
|
70
|
+
function transferFrom(
|
|
71
|
+
address sender,
|
|
72
|
+
address recipient,
|
|
73
|
+
uint256 amount
|
|
74
|
+
) public virtual override returns (bool) {
|
|
75
|
+
address spender = _msgSender();
|
|
76
|
+
uint256 shares = assetsToShares(amount);
|
|
77
|
+
_spendAllowance(sender, spender, amount);
|
|
78
|
+
_transfer(sender, recipient, shares);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Override totalSupply to return the total assets instead of shares. This reflects the actual circulating supply in terms of assets, accounting for rebasing
|
|
83
|
+
/// @inheritdoc ERC20Upgradeable
|
|
84
|
+
function totalSupply() public view virtual override returns (uint256) {
|
|
85
|
+
return sharesToAssets(totalShares());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// This returns the balance of the account in terms of assets, accounting for rebasing
|
|
89
|
+
/// @inheritdoc ERC20Upgradeable
|
|
90
|
+
function balanceOf(
|
|
91
|
+
address account
|
|
92
|
+
) public view virtual override returns (uint256) {
|
|
93
|
+
return sharesToAssets(shareBalanceOf(account));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// This function provides the total supply in terms of shares
|
|
97
|
+
function totalShares() public view returns (uint256) {
|
|
98
|
+
return super.totalSupply();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/// This returns the balance of the account in terms of shares
|
|
102
|
+
function shareBalanceOf(address account) public view returns (uint256) {
|
|
103
|
+
return super.balanceOf(account);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function assetsToShares(uint256 _amount) public view returns (uint256) {
|
|
107
|
+
return _amount.mulDiv(PRECISION, exchangeRate);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function sharesToAssets(uint256 _shares) public view returns (uint256) {
|
|
111
|
+
return _shares.mulDiv(exchangeRate, PRECISION);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ============ Internal Functions ============
|
|
115
|
+
|
|
52
116
|
/// Override to send shares instead of assets from synthetic
|
|
53
117
|
/// @inheritdoc TokenRouter
|
|
54
118
|
function _transferRemote(
|
|
@@ -78,6 +142,8 @@ contract HypERC4626 is HypERC20 {
|
|
|
78
142
|
emit SentTransferRemote(_destination, _recipient, _amountOrId);
|
|
79
143
|
}
|
|
80
144
|
|
|
145
|
+
/// override _handle to update exchange rate
|
|
146
|
+
/// @inheritdoc TokenRouter
|
|
81
147
|
function _handle(
|
|
82
148
|
uint32 _origin,
|
|
83
149
|
bytes32 _sender,
|
|
@@ -97,33 +163,4 @@ contract HypERC4626 is HypERC20 {
|
|
|
97
163
|
}
|
|
98
164
|
super._handle(_origin, _sender, _message);
|
|
99
165
|
}
|
|
100
|
-
|
|
101
|
-
// Override to send shares locally instead of assets
|
|
102
|
-
function transfer(
|
|
103
|
-
address to,
|
|
104
|
-
uint256 amount
|
|
105
|
-
) public virtual override returns (bool) {
|
|
106
|
-
address owner = _msgSender();
|
|
107
|
-
_transfer(owner, to, assetsToShares(amount));
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function shareBalanceOf(address account) public view returns (uint256) {
|
|
112
|
-
return super.balanceOf(account);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function balanceOf(
|
|
116
|
-
address account
|
|
117
|
-
) public view virtual override returns (uint256) {
|
|
118
|
-
uint256 _balance = super.balanceOf(account);
|
|
119
|
-
return sharesToAssets(_balance);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function assetsToShares(uint256 _amount) public view returns (uint256) {
|
|
123
|
-
return _amount.mulDiv(PRECISION, exchangeRate);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function sharesToAssets(uint256 _shares) public view returns (uint256) {
|
|
127
|
-
return _shares.mulDiv(exchangeRate, PRECISION);
|
|
128
|
-
}
|
|
129
166
|
}
|