{"file_path":"contracts/MaplePoolManager.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.25;\n\nimport { ERC20Helper }           from \"../modules/erc20-helper/src/ERC20Helper.sol\";\nimport { IMapleProxyFactory }    from \"../modules/maple-proxy-factory/contracts/interfaces/IMapleProxyFactory.sol\";\nimport { IMapleProxied }         from \"../modules/maple-proxy-factory/contracts/interfaces/IMapleProxied.sol\";\nimport { MapleProxiedInternals } from \"../modules/maple-proxy-factory/contracts/MapleProxiedInternals.sol\";\n\nimport { MaplePoolManagerStorage } from \"./proxy/MaplePoolManagerStorage.sol\";\n\nimport {\n    IERC20Like,\n    IGlobalsLike,\n    ILoanLike,\n    ILoanManagerLike,\n    IPoolDelegateCoverLike,\n    IPoolLike,\n    IPoolPermissionManagerLike,\n    IStrategyLike,\n    IWithdrawalManagerLike\n} from \"./interfaces/Interfaces.sol\";\n\nimport { IMaplePoolManager } from \"./interfaces/IMaplePoolManager.sol\";\n\n/*\n\n   ███╗   ███╗ █████╗ ██████╗ ██╗     ███████╗\n   ████╗ ████║██╔══██╗██╔══██╗██║     ██╔════╝\n   ██╔████╔██║███████║██████╔╝██║     █████╗\n   ██║╚██╔╝██║██╔══██║██╔═══╝ ██║     ██╔══╝\n   ██║ ╚═╝ ██║██║  ██║██║     ███████╗███████╗\n   ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚══════╝╚══════╝\n\n\n   ██████╗  ██████╗  ██████╗ ██╗         ███╗   ███╗ █████╗ ███╗   ██╗ █████╗  ██████╗ ███████╗██████╗\n   ██╔══██╗██╔═══██╗██╔═══██╗██║         ████╗ ████║██╔══██╗████╗  ██║██╔══██╗██╔════╝ ██╔════╝██╔══██╗\n   ██████╔╝██║   ██║██║   ██║██║         ██╔████╔██║███████║██╔██╗ ██║███████║██║  ███╗█████╗  ██████╔╝\n   ██╔═══╝ ██║   ██║██║   ██║██║         ██║╚██╔╝██║██╔══██║██║╚██╗██║██╔══██║██║   ██║██╔══╝  ██╔══██╗\n   ██║     ╚██████╔╝╚██████╔╝███████╗    ██║ ╚═╝ ██║██║  ██║██║ ╚████║██║  ██║╚██████╔╝███████╗██║  ██║\n   ╚═╝      ╚═════╝  ╚═════╝ ╚══════╝    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝\n\n*/\n\ncontract MaplePoolManager is IMaplePoolManager, MapleProxiedInternals, MaplePoolManagerStorage {\n\n    uint256 public constant HUNDRED_PERCENT = 100_0000;  // Four decimal precision.\n\n    /**************************************************************************************************************************************/\n    /*** Modifiers                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    modifier nonReentrant() {\n        require(_locked == 1, \"PM:LOCKED\");\n\n        _locked = 2;\n\n        _;\n\n        _locked = 1;\n    }\n\n    modifier onlyIfNotConfigured() {\n        _revertIfConfigured();\n        _;\n    }\n\n    modifier onlyProtocolAdminsOrNotConfigured() {\n        _revertIfConfiguredAndNotProtocolAdmins();\n        _;\n    }\n\n    modifier onlyPool() {\n        _revertIfNotPool();\n        _;\n    }\n\n    modifier onlyPoolDelegate() {\n        _revertIfNotPoolDelegate();\n        _;\n    }\n\n    modifier onlyPoolDelegateOrProtocolAdmins() {\n        _revertIfNeitherPoolDelegateNorProtocolAdmins();\n        _;\n    }\n\n    modifier whenNotPaused() {\n        _revertIfPaused();\n        _;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Migration Functions                                                                                                            ***/\n    /**************************************************************************************************************************************/\n\n    // NOTE: Can't add whenProtocolNotPaused modifier here, as globals won't be set until\n    //       initializer.initialize() is called, and this function is what triggers that initialization.\n    function migrate(address migrator_, bytes calldata arguments_) external override whenNotPaused {\n        require(msg.sender == _factory(),        \"PM:M:NOT_FACTORY\");\n        require(_migrate(migrator_, arguments_), \"PM:M:FAILED\");\n        require(poolDelegateCover != address(0), \"PM:M:DELEGATE_NOT_SET\");\n    }\n\n    function setImplementation(address implementation_) external override whenNotPaused {\n        require(msg.sender == _factory(), \"PM:SI:NOT_FACTORY\");\n        _setImplementation(implementation_);\n    }\n\n    function upgrade(uint256 version_, bytes calldata arguments_) external override whenNotPaused {\n        IGlobalsLike globals_ = IGlobalsLike(globals());\n\n        if (msg.sender == poolDelegate) {\n            require(globals_.isValidScheduledCall(msg.sender, address(this), \"PM:UPGRADE\", msg.data), \"PM:U:INVALID_SCHED_CALL\");\n\n            globals_.unscheduleCall(msg.sender, \"PM:UPGRADE\", msg.data);\n        } else {\n            require(msg.sender == globals_.securityAdmin(), \"PM:U:NO_AUTH\");\n        }\n\n        emit Upgraded(version_, arguments_);\n\n        IMapleProxyFactory(_factory()).upgradeInstance(version_, arguments_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Initial Configuration Function                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    // NOTE: This function is always called atomically during the deployment process so a DoS attack is not possible.\n    function completeConfiguration() external override whenNotPaused onlyIfNotConfigured {\n        configured = true;\n\n        emit PoolConfigurationComplete();\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Ownership Transfer Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    function acceptPoolDelegate() external override whenNotPaused {\n        require(msg.sender == pendingPoolDelegate, \"PM:APD:NOT_PENDING_PD\");\n\n        IGlobalsLike(globals()).transferOwnedPoolManager(poolDelegate, msg.sender);\n\n        emit PendingDelegateAccepted(poolDelegate, pendingPoolDelegate);\n\n        poolDelegate        = pendingPoolDelegate;\n        pendingPoolDelegate = address(0);\n    }\n\n    function setPendingPoolDelegate(address pendingPoolDelegate_) external override whenNotPaused onlyPoolDelegateOrProtocolAdmins {\n        pendingPoolDelegate = pendingPoolDelegate_;\n\n        emit PendingDelegateSet(poolDelegate, pendingPoolDelegate_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Globals Admin Functions                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    function setActive(bool active_) external override whenNotPaused {\n        require(msg.sender == globals(), \"PM:SA:NOT_GLOBALS\");\n        emit SetAsActive(active = active_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Pool Delegate Admin Functions                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    function addStrategy(address strategyFactory_, bytes calldata extraDeploymentData_)\n        external override whenNotPaused onlyProtocolAdminsOrNotConfigured returns (address strategy_)\n    {\n        require(IGlobalsLike(globals()).isInstanceOf(\"STRATEGY_FACTORY\", strategyFactory_), \"PM:AS:INVALID_FACTORY\");\n\n        // NOTE: If removing strategies is allowed in the future, there will be a need to rethink salts here due to collisions.\n        strategy_ = IMapleProxyFactory(strategyFactory_).createInstance(\n            bytes.concat(abi.encode(address(this)), extraDeploymentData_),\n            keccak256(abi.encode(address(this), strategyList.length))\n        );\n\n        isStrategy[strategy_] = true;\n\n        strategyList.push(strategy_);\n\n        emit StrategyAdded(strategy_);\n    }\n\n    function setDelegateManagementFeeRate(uint256 delegateManagementFeeRate_)\n        external override whenNotPaused onlyProtocolAdminsOrNotConfigured\n    {\n        require(delegateManagementFeeRate_ <= HUNDRED_PERCENT, \"PM:SDMFR:OOB\");\n\n        emit DelegateManagementFeeRateSet(delegateManagementFeeRate = delegateManagementFeeRate_);\n    }\n\n    function setIsStrategy(address strategy_, bool isStrategy_) external override whenNotPaused onlyPoolDelegateOrProtocolAdmins {\n        emit IsStrategySet(strategy_, isStrategy[strategy_] = isStrategy_);\n\n        // Check Strategy is in the list.\n        // NOTE: The factory and instance check are not required as the mapping is being updated for a Strategy that is in the list.\n        for (uint256 i_; i_ < strategyList.length; ++i_) {\n            if (strategyList[i_] == strategy_) return;\n        }\n\n        revert(\"PM:SIS:INVALID_STRATEGY\");\n    }\n\n    function setLiquidityCap(uint256 liquidityCap_) external override whenNotPaused onlyProtocolAdminsOrNotConfigured {\n        emit LiquidityCapSet(liquidityCap = liquidityCap_);\n    }\n\n    function setWithdrawalManager(address withdrawalManager_) external override whenNotPaused onlyIfNotConfigured {\n        address factory_ = IMapleProxied(withdrawalManager_).factory();\n\n        require(IGlobalsLike(globals()).isInstanceOf(\"WITHDRAWAL_MANAGER_FACTORY\", factory_), \"PM:SWM:INVALID_FACTORY\");\n        require(IMapleProxyFactory(factory_).isInstance(withdrawalManager_),                  \"PM:SWM:INVALID_INSTANCE\");\n\n        emit WithdrawalManagerSet(withdrawalManager = withdrawalManager_);\n    }\n\n    function setPoolPermissionManager(address poolPermissionManager_) external override whenNotPaused onlyProtocolAdminsOrNotConfigured {\n        require(IGlobalsLike(globals()).isInstanceOf(\"POOL_PERMISSION_MANAGER\", poolPermissionManager_), \"PM:SPPM:INVALID_INSTANCE\");\n\n        emit PoolPermissionManagerSet(poolPermissionManager = poolPermissionManager_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Funding Functions                                                                                                              ***/\n    /**************************************************************************************************************************************/\n\n    function requestFunds(address destination_, uint256 principal_) external override whenNotPaused nonReentrant {\n        address asset_   = asset;\n        address pool_    = pool;\n        address factory_ = IMapleProxied(msg.sender).factory();\n\n        IGlobalsLike globals_ = IGlobalsLike(globals());\n\n        // NOTE: Do not need to check isInstance() as the Strategy is added to the list on `addStrategy()` or `configure()`.\n        require(principal_ != 0,                                     \"PM:RF:INVALID_PRINCIPAL\");\n        require(globals_.isInstanceOf(\"STRATEGY_FACTORY\", factory_), \"PM:RF:INVALID_FACTORY\");\n        require(IMapleProxyFactory(factory_).isInstance(msg.sender), \"PM:RF:INVALID_INSTANCE\");\n        require(isStrategy[msg.sender],                              \"PM:RF:NOT_STRATEGY\");\n        require(IERC20Like(pool_).totalSupply() != 0,                \"PM:RF:ZERO_SUPPLY\");\n        require(_hasSufficientCover(address(globals_), asset_),      \"PM:RF:INSUFFICIENT_COVER\");\n\n        // Fetching locked liquidity needs to be done prior to transferring the tokens.\n        uint256 lockedLiquidity_ = IWithdrawalManagerLike(withdrawalManager).lockedLiquidity();\n\n        // Transfer the required principal.\n        require(destination_ != address(0),                                        \"PM:RF:INVALID_DESTINATION\");\n        require(ERC20Helper.transferFrom(asset_, pool_, destination_, principal_), \"PM:RF:TRANSFER_FAIL\");\n\n        // The remaining liquidity in the pool must be greater or equal to the locked liquidity.\n        require(IERC20Like(asset_).balanceOf(pool_) >= lockedLiquidity_, \"PM:RF:LOCKED_LIQUIDITY\");\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Loan Default Functions                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    function finishCollateralLiquidation(address loan_) external override whenNotPaused nonReentrant onlyPoolDelegateOrProtocolAdmins {\n        ( uint256 losses_, uint256 platformFees_ ) = ILoanManagerLike(_getLoanManager(loan_)).finishCollateralLiquidation(loan_);\n\n        _handleCover(losses_, platformFees_);\n\n        emit CollateralLiquidationFinished(loan_, losses_);\n    }\n\n    function triggerDefault(address loan_, address liquidatorFactory_)\n        external override whenNotPaused nonReentrant onlyPoolDelegateOrProtocolAdmins\n    {\n        require(IGlobalsLike(globals()).isInstanceOf(\"LIQUIDATOR_FACTORY\", liquidatorFactory_), \"PM:TD:NOT_FACTORY\");\n\n        (\n            bool    liquidationComplete_,\n            uint256 losses_,\n            uint256 platformFees_\n        ) = ILoanManagerLike(_getLoanManager(loan_)).triggerDefault(loan_, liquidatorFactory_);\n\n        if (!liquidationComplete_) {\n            emit CollateralLiquidationTriggered(loan_);\n            return;\n        }\n\n        _handleCover(losses_, platformFees_);\n\n        emit CollateralLiquidationFinished(loan_, losses_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Pool Exit Functions                                                                                                            ***/\n    /**************************************************************************************************************************************/\n\n    function processRedeem(uint256 shares_, address owner_, address sender_)\n        external override whenNotPaused nonReentrant onlyPool returns (uint256 redeemableShares_, uint256 resultingAssets_)\n    {\n        require(owner_ == sender_ || IPoolLike(pool).allowance(owner_, sender_) > 0, \"PM:PR:NO_ALLOWANCE\");\n\n        ( redeemableShares_, resultingAssets_ ) = IWithdrawalManagerLike(withdrawalManager).processExit(shares_, owner_);\n        emit RedeemProcessed(owner_, redeemableShares_, resultingAssets_);\n    }\n\n    function processWithdraw(uint256 assets_, address owner_, address sender_)\n        external override whenNotPaused nonReentrant returns (uint256 redeemableShares_, uint256 resultingAssets_)\n    {\n        assets_; owner_; sender_; redeemableShares_; resultingAssets_;  // Silence compiler warnings\n        require(false, \"PM:PW:NOT_ENABLED\");\n    }\n\n    function removeShares(uint256 shares_, address owner_)\n        external override whenNotPaused nonReentrant onlyPool returns (uint256 sharesReturned_)\n    {\n        emit SharesRemoved(\n            owner_,\n            sharesReturned_ = IWithdrawalManagerLike(withdrawalManager).removeShares(shares_, owner_)\n        );\n    }\n\n    function requestRedeem(uint256 shares_, address owner_, address sender_) external override whenNotPaused nonReentrant onlyPool {\n        address pool_ = pool;\n\n        require(ERC20Helper.approve(pool_, withdrawalManager, shares_), \"PM:RR:APPROVE_FAIL\");\n\n        if (sender_ != owner_ && shares_ == 0) {\n            require(IPoolLike(pool_).allowance(owner_, sender_) > 0, \"PM:RR:NO_ALLOWANCE\");\n        }\n\n        IWithdrawalManagerLike(withdrawalManager).addShares(shares_, owner_);\n\n        emit RedeemRequested(owner_, shares_);\n    }\n\n    function requestWithdraw(uint256 shares_, uint256 assets_, address owner_, address sender_)\n        external override whenNotPaused nonReentrant\n    {\n        shares_; assets_; owner_; sender_;  // Silence compiler warnings\n        require(false, \"PM:RW:NOT_ENABLED\");\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Pool Delegate Cover Functions                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    function depositCover(uint256 amount_) external override whenNotPaused {\n        require(ERC20Helper.transferFrom(asset, msg.sender, poolDelegateCover, amount_), \"PM:DC:TRANSFER_FAIL\");\n        emit CoverDeposited(amount_);\n    }\n\n    function withdrawCover(uint256 amount_, address recipient_) external override whenNotPaused onlyPoolDelegate {\n        recipient_ = recipient_ == address(0) ? msg.sender : recipient_;\n\n        IPoolDelegateCoverLike(poolDelegateCover).moveFunds(amount_, recipient_);\n\n        require(\n            IERC20Like(asset).balanceOf(poolDelegateCover) >= IGlobalsLike(globals()).minCoverAmount(address(this)),\n            \"PM:WC:BELOW_MIN\"\n        );\n\n        emit CoverWithdrawn(amount_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    function canCall(bytes32 functionId_, address caller_, bytes calldata data_)\n        external view override returns (bool canCall_, string memory errorMessage_)\n    {\n        if (IGlobalsLike(globals()).isFunctionPaused(msg.sig)) return (false, \"PM:CC:PAUSED\");\n\n        uint256[3] memory params_ = _decodeParameters(data_);\n\n        uint256 assets_ = params_[0];\n        address lender_ = _address(params_[1]);\n\n        // For mint functions there's a need to convert shares into assets.\n        if (functionId_ == \"P:mint\" || functionId_ == \"P:mintWithPermit\") assets_ = IPoolLike(pool).previewMint(params_[0]);\n\n        // Redeem and withdraw require getting the third word from the calldata.\n        if ( functionId_ == \"P:redeem\" || functionId_ == \"P:withdraw\") lender_ = _address(params_[2]);\n\n        // Transfers need to check both the sender and the recipient.\n        if (functionId_ == \"P:transfer\" || functionId_ == \"P:transferFrom\") {\n            address[] memory lenders_ = new address[](2);\n\n            ( lenders_[0], lenders_[1] ) = functionId_ == \"P:transfer\" ?\n                (caller_,              _address(params_[0])) :\n                (_address(params_[0]), _address(params_[1]));\n\n            // Check both lenders in a single call.\n            if (!IPoolPermissionManagerLike(poolPermissionManager).hasPermission(address(this), lenders_, functionId_)) {\n                return (false, \"PM:CC:NOT_ALLOWED\");\n            }\n\n        } else {\n            if (!IPoolPermissionManagerLike(poolPermissionManager).hasPermission(address(this), lender_, functionId_)) {\n                return (false, \"PM:CC:NOT_ALLOWED\");\n            }\n        }\n\n        if (\n            functionId_ == \"P:redeem\"          ||\n            functionId_ == \"P:withdraw\"        ||\n            functionId_ == \"P:removeShares\"    ||\n            functionId_ == \"P:requestRedeem\"   ||\n            functionId_ == \"P:requestWithdraw\" ||\n            functionId_ == \"P:transfer\"        ||\n            functionId_ == \"P:transferFrom\"\n        ) return (true, \"\");\n\n        if (\n            functionId_ == \"P:deposit\"           ||\n            functionId_ == \"P:depositWithPermit\" ||\n            functionId_ == \"P:mint\"              ||\n            functionId_ == \"P:mintWithPermit\"\n        ) return _canDeposit(assets_);\n\n        return (false, \"PM:CC:INVALID_FUNCTION_ID\");\n    }\n\n    function factory() external view override returns (address factory_) {\n        factory_ = _factory();\n    }\n\n    function globals() public view override returns (address globals_) {\n        globals_ = IMapleProxyFactory(_factory()).mapleGlobals();\n    }\n\n    function governor() public view override returns (address governor_) {\n        governor_ = IGlobalsLike(globals()).governor();\n    }\n\n    function hasSufficientCover() public view override returns (bool hasSufficientCover_) {\n        hasSufficientCover_ = _hasSufficientCover(globals(), asset);\n    }\n\n    function implementation() external view override returns (address implementation_) {\n        implementation_ = _implementation();\n    }\n\n    function strategyListLength() external view override returns (uint256 strategyListLength_) {\n        strategyListLength_ = strategyList.length;\n    }\n\n    function totalAssets() public view override returns (uint256 totalAssets_) {\n        totalAssets_ = IERC20Like(asset).balanceOf(pool);\n\n        uint256 length_ = strategyList.length;\n\n        for (uint256 i_; i_ < length_;) {\n            totalAssets_ += IStrategyLike(strategyList[i_]).assetsUnderManagement();\n            unchecked { ++i_; }\n        }\n    }\n\n    /**************************************************************************************************************************************/\n    /*** LP Token View Functions                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    function convertToExitShares(uint256 assets_) public view override returns (uint256 shares_) {\n        shares_ = IPoolLike(pool).convertToExitShares(assets_);\n    }\n\n    function getEscrowParams(address, uint256 shares_) external view override returns (uint256 escrowShares_, address destination_) {\n        // NOTE: `owner_` param not named to avoid compiler warning.\n        ( escrowShares_, destination_) = (shares_, address(this));\n    }\n\n    function maxDeposit(address receiver_) external view virtual override returns (uint256 maxAssets_) {\n        maxAssets_ = _getMaxAssets(receiver_, totalAssets(), \"P:deposit\");\n    }\n\n    function maxMint(address receiver_) external view virtual override returns (uint256 maxShares_) {\n        uint256 totalAssets_ = totalAssets();\n        uint256 maxAssets_   = _getMaxAssets(receiver_, totalAssets_, \"P:mint\");\n\n        maxShares_ = IPoolLike(pool).previewDeposit(maxAssets_);\n    }\n\n    function maxRedeem(address owner_) external view virtual override returns (uint256 maxShares_) {\n        uint256 lockedShares_ = IWithdrawalManagerLike(withdrawalManager).lockedShares(owner_);\n        maxShares_            = IWithdrawalManagerLike(withdrawalManager).isInExitWindow(owner_) ? lockedShares_ : 0;\n    }\n\n    function maxWithdraw(address owner_) external view virtual override returns (uint256 maxAssets_) {\n        owner_;          // Silence compiler warning\n        maxAssets_ = 0;  // NOTE: always returns 0 as withdraw is not implemented\n    }\n\n    function previewRedeem(address owner_, uint256 shares_) external view virtual override returns (uint256 assets_) {\n        ( , assets_ ) = IWithdrawalManagerLike(withdrawalManager).previewRedeem(owner_, shares_);\n    }\n\n    function previewWithdraw(address owner_, uint256 assets_) external view virtual override returns (uint256 shares_) {\n        ( , shares_ ) = IWithdrawalManagerLike(withdrawalManager).previewWithdraw(owner_, assets_);\n    }\n\n    function unrealizedLosses() public view override returns (uint256 unrealizedLosses_) {\n        uint256 length_ = strategyList.length;\n\n        for (uint256 i_; i_ < length_;) {\n            unrealizedLosses_ += IStrategyLike(strategyList[i_]).unrealizedLosses();\n            unchecked { ++i_; }\n        }\n\n        // NOTE: Use minimum to prevent underflows in the case that `unrealizedLosses` includes late interest and `totalAssets` does not.\n        unrealizedLosses_ = _min(unrealizedLosses_, totalAssets());\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Internal Helper Functions                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    function _getLoanManager(address loan_) internal view returns (address loanManager_) {\n        loanManager_ = ILoanLike(loan_).lender();\n\n        require(isStrategy[loanManager_], \"PM:GLM:INVALID_LOAN_MANAGER\");\n    }\n\n    function _handleCover(uint256 losses_, uint256 platformFees_) internal {\n        address globals_ = globals();\n\n        uint256 availableCover_ =\n            IERC20Like(asset).balanceOf(poolDelegateCover) * IGlobalsLike(globals_).maxCoverLiquidationPercent(address(this)) /\n            HUNDRED_PERCENT;\n\n        uint256 toTreasury_ = _min(availableCover_,               platformFees_);\n        uint256 toPool_     = _min(availableCover_ - toTreasury_, losses_);\n\n        if (toTreasury_ != 0) {\n            IPoolDelegateCoverLike(poolDelegateCover).moveFunds(toTreasury_, IGlobalsLike(globals_).mapleTreasury());\n        }\n\n        if (toPool_ != 0) {\n            IPoolDelegateCoverLike(poolDelegateCover).moveFunds(toPool_, pool);\n        }\n\n        emit CoverLiquidated(toTreasury_, toPool_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Internal Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function _address(uint256 word_) internal pure returns (address address_) {\n        address_ = address(uint160(word_));\n    }\n\n    function _canDeposit(uint256 assets_) internal view returns (bool canDeposit_, string memory errorMessage_) {\n        if (!active)                                return (false, \"P:NOT_ACTIVE\");\n        if (assets_ + totalAssets() > liquidityCap) return (false, \"P:DEPOSIT_GT_LIQ_CAP\");\n\n        return (true, \"\");\n    }\n\n    function _decodeParameters(bytes calldata data_) internal pure returns (uint256[3] memory words) {\n        if (data_.length > 64)  {\n            ( words[0], words[1], words[2] ) = abi.decode(data_, (uint256, uint256, uint256));\n        } else {\n            ( words[0], words[1] ) = abi.decode(data_, (uint256, uint256));\n        }\n    }\n\n    function _getMaxAssets(address receiver_, uint256 totalAssets_, bytes32 functionId_) internal view returns (uint256 maxAssets_) {\n        bool    depositAllowed_ = IPoolPermissionManagerLike(poolPermissionManager).hasPermission(address(this),  receiver_, functionId_);\n        uint256 liquidityCap_   = liquidityCap;\n        maxAssets_              = liquidityCap_ > totalAssets_ && depositAllowed_ ? liquidityCap_ - totalAssets_ : 0;\n    }\n\n    function _hasSufficientCover(address globals_, address asset_) internal view returns (bool hasSufficientCover_) {\n        hasSufficientCover_ = IERC20Like(asset_).balanceOf(poolDelegateCover) >= IGlobalsLike(globals_).minCoverAmount(address(this));\n    }\n\n    function _min(uint256 a_, uint256 b_) internal pure returns (uint256 minimum_) {\n        minimum_ = a_ < b_ ? a_ : b_;\n    }\n\n    function _revertIfConfigured() internal view {\n        require(!configured, \"PM:ALREADY_CONFIGURED\");\n    }\n\n    function _revertIfConfiguredAndNotProtocolAdmins() internal view {\n        require(\n            !configured ||\n            msg.sender == poolDelegate ||\n            msg.sender == governor()   ||\n            msg.sender == IGlobalsLike(globals()).operationalAdmin(),\n            \"PM:NOT_PA_OR_NOT_CONFIGURED\"\n        );\n    }\n\n    function _revertIfNotPool() internal view {\n        require(msg.sender == pool, \"PM:NOT_POOL\");\n    }\n\n    function _revertIfNotPoolDelegate() internal view {\n        require(msg.sender == poolDelegate, \"PM:NOT_PD\");\n    }\n\n    function _revertIfNeitherPoolDelegateNorProtocolAdmins() internal view {\n        require(\n            msg.sender == poolDelegate ||\n            msg.sender == governor()   ||\n            msg.sender == IGlobalsLike(globals()).operationalAdmin(),\n            \"PM:NOT_PD_OR_GOV_OR_OA\"\n        );\n    }\n\n    function _revertIfPaused() internal view {\n        require(!IGlobalsLike(globals()).isFunctionPaused(msg.sig), \"PM:PAUSED\");\n    }\n\n}\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b5060043610610333575f3560e01c80637bec9b18116101af578063c3124525116100fe578063d4dd04381161009e578063d905777e11610079578063d905777e146106f1578063e15e990a14610704578063e345f4b614610717578063fc72ed5b1461072a575f80fd5b8063d4dd0438146106b8578063d784d426146106cb578063d7c0ca48146106de575f80fd5b8063c63d75b6116100d9578063c63d75b614610677578063caf901dd1461068a578063cbe52ae314610692578063ce96cb77146106a5575f80fd5b8063c312452514610654578063c3fbb6fd1461065c578063c45a01551461066f575f80fd5b80639e5df6c211610169578063ab42685c11610144578063ab42685c14610608578063acec338a1461061b578063b14b56be1461062e578063bbc6f1dc14610641575f80fd5b80639e5df6c2146105cf578063a267526b146105e2578063a58c3eff146105f5575f80fd5b80637bec9b18146105675780637d41c86e1461056f57806382fe535a146105825780638772a23a1461059557806387c2f4ae146105a95780638b1c4990146105bc575f80fd5b8063402d267d1161028557806360af6ad31161022557806376687d3d1161020057806376687d3d146105175780637aeedf2a146105205780637b99adb1146105335780637bd243de14610546575f80fd5b806360af6ad3146104dd57806367e2ba23146105055780636ed93dd01461050d575f80fd5b8063494666b611610260578063494666b6146104885780635c60da1b1461049b5780635cf2ed57146104a35780635dd28449146104d4575f80fd5b8063402d267d1461044f5780634046af2b1461046257806340504ba014610475575f80fd5b80631b8f1830116102f05780632ebada04116102cb5780632ebada041461040e5780633291f0121461042157806338d52e0f146104295780633b99bcee1461043c575f80fd5b80631b8f1830146103c657806326af24b7146103d95780632e8ebaae146103ec575f80fd5b806301e1d1141461033757806302db6cd31461035257806302fb0c5e1461037d5780630c340a24146103a157806316f0115b146103a957806319e9cd7b146103bc575b5f80fd5b61033f61073d565b6040519081526020015b60405180910390f35b600254610365906001600160a01b031681565b6040516001600160a01b039091168152602001610349565b60065461039190600160a01b900460ff1681565b6040519015158152602001610349565b61036561085a565b600454610365906001600160a01b031681565b6103c46108c7565b005b61033f6103d4366004613d87565b6109f1565b6103c46103e7366004613d87565b610add565b6103916103fa366004613db5565b60096020525f908152604090205460ff1681565b6103c461041c366004613db5565b610cbc565b6103c4610df9565b600354610365906001600160a01b031681565b6103c461044a366004613e15565b610e46565b61033f61045d366004613db5565b6110df565b600154610365906001600160a01b031681565b6103c4610483366004613e5d565b611104565b6103c4610496366004613e89565b611324565b610365611898565b6104b76104b1366004613e89565b91309150565b604080519283526001600160a01b03909116602083015201610349565b61033f60085481565b6104f06104eb366004613eb3565b6118a1565b60408051928352602083019190915201610349565b61033f611a7a565b61033f620f424081565b61033f60075481565b61036561052e366004613ef2565b611b37565b6103c4610541366004613f2a565b611d66565b610559610554366004613f41565b611db2565b604051610349929190613fc7565b600b5461033f565b6103c461057d366004613eb3565b612315565b600654610365906001600160a01b031681565b60065461039190600160a81b900460ff1681565b6103c46105b7366004613f2a565b612532565b6103c46105ca366004613f2a565b6125b9565b6103c46105dd366004613db5565b612652565b6103656105f0366004613f2a565b612756565b61033f610603366004613f2a565b61277e565b600554610365906001600160a01b031681565b6103c4610629366004613fee565b6127eb565b6103c461063c366004614009565b61289c565b61033f61064f366004613e89565b61299e565b610365612a19565b6103c461066a366004613ef2565b612a5d565b610365612b5a565b61033f610685366004613db5565b612b63565b610391612bf7565b61033f6106a0366004613e89565b612c14565b61033f6106b3366004613db5565b505f90565b6103c46106c6366004614035565b612c4d565b6103c46106d9366004613db5565b612cb6565b6103c46106ec366004613db5565b612d47565b61033f6106ff366004613db5565b612da8565b600c54610365906001600160a01b031681565b6104f0610725366004613eb3565b612e98565b6103c4610738366004613db5565b612f03565b600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f9216906370a0823190602401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061407c565b600b549091505f5b8181101561085557600b81815481106107d2576107d2614093565b5f918252602091829020015460408051637b6f05e960e11b815290516001600160a01b039092169263f6de0bd2926004808401938290030181865afa15801561081d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610841919061407c565b61084b90846140bb565b92506001016107b7565b505090565b5f610863612a19565b6001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c291906140ce565b905090565b6108cf613151565b6002546001600160a01b031633146109265760405162461bcd60e51b815260206004820152601560248201527414134e9054110e9393d517d4115391125391d7d411605a1b60448201526064015b60405180910390fd5b61092e612a19565b600154604051632f97305960e01b81526001600160a01b039182166004820152336024820152911690632f973059906044015f604051808303815f87803b158015610977575f80fd5b505af1158015610989573d5f803e3d5ffd5b50506002546001546040516001600160a01b039283169450911691507fff9949a1e16bc5d8386effb58bc7d620cff72179b0ad2bf1fcc1f58b09522a6d905f90a360028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b5f6109fa613151565b5f54600114610a1b5760405162461bcd60e51b815260040161091d906140e9565b60025f55610a27613207565b6006546040516301b8f18360e41b8152600481018590526001600160a01b0384811660248301819052927f4b171f7fc0550bd6b41ba56e9b2b88100206431510ba9427518f3485198db36d92911690631b8f1830906044016020604051808303815f875af1158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061407c565b60405181815290935060200160405180910390a260015f5592915050565b610ae5613151565b610aed61324f565b6001600160a01b03811615610b025780610b04565b335b6005546040516339bc590360e11b8152600481018590526001600160a01b038084166024830152929350911690637378b206906044015f604051808303815f87803b158015610b51575f80fd5b505af1158015610b63573d5f803e3d5ffd5b50505050610b6f612a19565b6040516323396b5360e11b81523060048201526001600160a01b039190911690634672d6a690602401602060405180830381865afa158015610bb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061407c565b6003546005546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c45919061407c565b1015610c855760405162461bcd60e51b815260206004820152600f60248201526e28269d2ba19d2122a627abafa6a4a760891b604482015260640161091d565b6040518281527f197c9d0c5e4013c0533a69753717932d354db643259ac08a83f71c835729ad769060200160405180910390a15050565b610cc4613151565b610ccc613295565b610cd4612a19565b60405163305c9e0560e01b81527f504f4f4c5f5045524d495353494f4e5f4d414e4147455200000000000000000060048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa158015610d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d64919061410c565b610db05760405162461bcd60e51b815260206004820152601860248201527f504d3a5350504d3a494e56414c49445f494e5354414e43450000000000000000604482015260640161091d565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f269618c20ead34aabc3811b327fd482daf7368845178bdf8f1a7022dfff3a43f905f90a250565b610e01613151565b610e096133a9565b6006805460ff60a81b1916600160a81b1790556040517f88f39e22620812dfcec36b8475764a7450bda154d389facf6d2708fbea7d6407905f90a1565b610e4e613151565b5f610e57612a19565b6001549091506001600160a01b03163303610f8b5760405163fd4c5b3760e01b81526001600160a01b0382169063fd4c5b3790610e9e90339030905f90369060040161414f565b602060405180830381865afa158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd919061410c565b610f295760405162461bcd60e51b815260206004820152601760248201527f504d3a553a494e56414c49445f53434845445f43414c4c000000000000000000604482015260640161091d565b604051635ad5b6f760e11b81526001600160a01b0382169063b5ab6dee90610f599033905f90369060040161418e565b5f604051808303815f87803b158015610f70575f80fd5b505af1158015610f82573d5f803e3d5ffd5b5050505061103a565b806001600160a01b031663be7c13f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610feb91906140ce565b6001600160a01b0316336001600160a01b03161461103a5760405162461bcd60e51b815260206004820152600c60248201526b0a09a74aa749c9ebe82aaa8960a31b604482015260640161091d565b7faaaa7ee6b0c2f4ee1fa7312c7d5b3623a434da5a1a9ce3cb6e629caa23454ab684848460405161106d939291906141c5565b60405180910390a161107d6133fb565b6001600160a01b031663fe69f7088585856040518463ffffffff1660e01b81526004016110ac939291906141c5565b5f604051808303815f87803b1580156110c3575f80fd5b505af11580156110d5573d5f803e3d5ffd5b5050505050505050565b5f6110fe826110ec61073d565b68140e99195c1bdcda5d60ba1b613429565b92915050565b61110c613151565b5f5460011461112d5760405162461bcd60e51b815260040161091d906140e9565b60025f556111396134d5565b611141612a19565b60405163305c9e0560e01b8152714c495155494441544f525f464143544f525960701b60048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa1580156111a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c6919061410c565b6112065760405162461bcd60e51b8152602060048201526011602482015270504d3a54443a4e4f545f464143544f525960781b604482015260640161091d565b5f805f611212856135cd565b604051630202825d60e51b81526001600160a01b038781166004830152868116602483015291909116906340504ba0906044016060604051808303815f875af1158015611261573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128591906141de565b925092509250826112cb576040516001600160a01b038616907f371cc890361cf16190aac5797dcbc15218efceb8445aac6f43ff106481d5ca33905f90a250505061131c565b6112d58282613698565b846001600160a01b03167ff753ba3c7c9e5d6813c50ab20dfd8e33f496ce2bc7e72e08e547e0d2aff151338360405161131091815260200190565b60405180910390a25050505b505060015f55565b61132c613151565b5f5460011461134d5760405162461bcd60e51b815260040161091d906140e9565b60025f908155600354600480546040805163c45a015560e01b815290516001600160a01b0394851695949092169392339263c45a01559280830192602092918290030181865afa1580156113a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c791906140ce565b90505f6113d2612a19565b9050845f036114235760405162461bcd60e51b815260206004820152601760248201527f504d3a52463a494e56414c49445f5052494e434950414c000000000000000000604482015260640161091d565b60405163305c9e0560e01b81526001600160a01b0382169063305c9e059061144f908590600401614212565b602060405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148e919061410c565b6114d25760405162461bcd60e51b8152602060048201526015602482015274504d3a52463a494e56414c49445f464143544f525960581b604482015260640161091d565b6040516335a2735f60e11b81523360048201526001600160a01b03831690636b44e6be90602401602060405180830381865afa158015611514573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611538919061410c565b61157d5760405162461bcd60e51b8152602060048201526016602482015275504d3a52463a494e56414c49445f494e5354414e434560501b604482015260640161091d565b335f9081526009602052604090205460ff166115d05760405162461bcd60e51b8152602060048201526012602482015271504d3a52463a4e4f545f535452415445475960701b604482015260640161091d565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561160c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611630919061407c565b5f036116725760405162461bcd60e51b8152602060048201526011602482015270504d3a52463a5a45524f5f535550504c5960781b604482015260640161091d565b61167c8185613949565b6116c85760405162461bcd60e51b815260206004820152601860248201527f504d3a52463a494e53554646494349454e545f434f5645520000000000000000604482015260640161091d565b60065460408051632d0e609160e21b815290515f926001600160a01b03169163b43982449160048083019260209291908290030181865afa15801561170f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611733919061407c565b90506001600160a01b03871661178b5760405162461bcd60e51b815260206004820152601960248201527f504d3a52463a494e56414c49445f44455354494e4154494f4e00000000000000604482015260640161091d565b61179785858989613a26565b6117d95760405162461bcd60e51b815260206004820152601360248201527214134e94918e9514905394d1915497d1905253606a1b604482015260640161091d565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908716906370a0823190602401602060405180830381865afa158015611820573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611844919061407c565b101561188b5760405162461bcd60e51b8152602060048201526016602482015275504d3a52463a4c4f434b45445f4c495155494449545960501b604482015260640161091d565b505060015f555050505050565b5f6108c2613a9c565b5f806118ab613151565b5f546001146118cc5760405162461bcd60e51b815260040161091d906140e9565b60025f556118d8613207565b826001600160a01b0316846001600160a01b0316148061196e575060048054604051636eb1769f60e11b81526001600160a01b038781169382019390935285831660248201525f929091169063dd62ed3e90604401602060405180830381865afa158015611948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196c919061407c565b115b6119af5760405162461bcd60e51b8152602060048201526012602482015271504d3a50523a4e4f5f414c4c4f57414e434560701b604482015260640161091d565b600654604051634f721ddb60e11b8152600481018790526001600160a01b03868116602483015290911690639ee43bb69060440160408051808303815f875af11580156119fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a22919061423f565b60408051838152602081018390529294509092506001600160a01b038616917f7ad3c51fdfaa55fae7fe0d0cf9efb279d8a3aa02914048280d3d1bdbe560d67a910160405180910390a260015f559094909350915050565b600b545f90815b81811015611b1f57600b8181548110611a9c57611a9c614093565b5f9182526020918290200154604080516367e2ba2360e01b815290516001600160a01b03909216926367e2ba23926004808401938290030181865afa158015611ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b919061407c565b611b1590846140bb565b9250600101611a81565b50611b3182611b2c61073d565b613ac5565b91505090565b5f611b40613151565b611b48613295565b611b50612a19565b6001600160a01b031663305c9e05856040518263ffffffff1660e01b8152600401611b7b9190614212565b602060405180830381865afa158015611b96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bba919061410c565b611bfe5760405162461bcd60e51b8152602060048201526015602482015274504d3a41533a494e56414c49445f464143544f525960581b604482015260640161091d565b604080513060208201526001600160a01b0386169163517b657f910160408051601f1981840301815290829052611c3b9187908790602001614278565b60408051808303601f19018152828252600b543060208501529183019190915290606001604051602081830303815290604052805190602001206040518363ffffffff1660e01b8152600401611c92929190614296565b6020604051808303815f875af1158015611cae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd291906140ce565b6001600160a01b0381165f81815260096020526040808220805460ff19166001908117909155600b8054918201815583527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916841790555192935090917f3f008fd510eae7a9e7bee13513d7b83bef8003d488b5a3d0b0da4de71d6846f19190a29392505050565b611d6e613151565b611d76613295565b60078190556040518181527f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab906020015b60405180910390a150565b5f6060611dbd612a19565b604051634c532de160e01b81526001600160e01b03195f351660048201526001600160a01b039190911690634c532de190602401602060405180830381865afa158015611e0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e30919061410c565b15611e6157505060408051808201909152600c81526b14134e90d0ce94105554d15160a21b60208201525f9061230c565b5f611e6c8585613ada565b80519091505f611e818360015b602002015190565b90508865140e9b5a5b9d60d21b1480611eac5750886f140e9b5a5b9d15da5d1a14195c9b5a5d60821b145b15611f1d5760048054845160405163b3d7f6b960e01b8152928301526001600160a01b03169063b3d7f6b990602401602060405180830381865afa158015611ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1a919061407c565b91505b8867503a72656465656d60c01b1480611f4257508869503a776974686472617760b01b145b15611f5557611f52836002611e79565b90505b8869281d3a3930b739b332b960b11b1480611f805750886d503a7472616e7366657246726f6d60901b145b156120d2576040805160028082526060820183525f926020830190803683370190505090508969281d3a3930b739b332b960b11b14611fd357611fc3845f611e79565b611fce856001611e79565b611fde565b88611fde855f611e79565b825f81518110611ff057611ff0614093565b602002602001018360018151811061200a5761200a614093565b6001600160a01b039384166020918202929092010152918116909152600c546040516334dd0fbb60e01b81529116906334dd0fbb9061205190309085908f906004016142b7565b602060405180830381865afa15801561206c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612090919061410c565b6120cc575f6040518060400160405280601181526020017014134e90d0ce9393d517d0531313d5d151607a1b815250955095505050505061230c565b50612186565b600c54604051630dace25b60e31b81523060048201526001600160a01b038381166024830152604482018c905290911690636d6712d890606401602060405180830381865afa158015612127573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214b919061410c565b612186575f6040518060400160405280601181526020017014134e90d0ce9393d517d0531313d5d151607a1b8152509450945050505061230c565b8867503a72656465656d60c01b14806121ab57508869503a776974686472617760b01b145b806121c65750886d503a72656d6f766553686172657360901b145b806121e25750886e503a7265717565737452656465656d60881b145b8061220057508870503a72657175657374576974686472617760781b145b8061221757508869281d3a3930b739b332b960b11b145b806122325750886d503a7472616e7366657246726f6d60901b145b1561225457600160405180602001604052805f8152509450945050505061230c565b8868140e99195c1bdcda5d60ba1b148061228357508872140e99195c1bdcda5d15da5d1a14195c9b5a5d606a1b145b8061229657508865140e9b5a5b9d60d21b145b806122b35750886f140e9b5a5b9d15da5d1a14195c9b5a5d60821b145b156122cd576122c182613b21565b9450945050505061230c565b5f6040518060400160405280601981526020017f504d3a43433a494e56414c49445f46554e4354494f4e5f494400000000000000815250945094505050505b94509492505050565b61231d613151565b5f5460011461233e5760405162461bcd60e51b815260040161091d906140e9565b60025f5561234a613207565b6004546006546001600160a01b03918216916123699183911686613bca565b6123aa5760405162461bcd60e51b815260206004820152601260248201527114134e94948e9054141493d59157d190525360721b604482015260640161091d565b826001600160a01b0316826001600160a01b0316141580156123ca575083155b1561248457604051636eb1769f60e11b81526001600160a01b03848116600483015283811660248301525f919083169063dd62ed3e90604401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612442919061407c565b116124845760405162461bcd60e51b8152602060048201526012602482015271504d3a52523a4e4f5f414c4c4f57414e434560701b604482015260640161091d565b6006546040516334c9ac8f60e21b8152600481018690526001600160a01b0385811660248301529091169063d326b23c906044015f604051808303815f87803b1580156124cf575f80fd5b505af11580156124e1573d5f803e3d5ffd5b50505050826001600160a01b03167fa1a009bfa4d4ebaf046d2b27cbc657074cb3b637a247a3dbdf767eda4955efc28560405161252091815260200190565b60405180910390a2505060015f555050565b61253a613151565b612542613295565b620f42408111156125845760405162461bcd60e51b815260206004820152600c60248201526b28269d29a226a3291d27a7a160a11b604482015260640161091d565b60088190556040518181527f147f457c314a84eed0e31b87c73270d1696cf771a8219a779400326319d6c77690602001611da7565b6125c1613151565b6003546005546125e0916001600160a01b039081169133911684613a26565b6126225760405162461bcd60e51b815260206004820152601360248201527214134e9110ce9514905394d1915497d1905253606a1b604482015260640161091d565b6040518181527f11cdeb47a11cb4a94ffa87f7d2337ac3695b610f52fb5d80923effc9e0c56e9990602001611da7565b61265a613151565b5f5460011461267b5760405162461bcd60e51b815260040161091d906140e9565b60025f556126876134d5565b5f80612692836135cd565b604051634f2efb6160e11b81526001600160a01b0385811660048301529190911690639e5df6c29060240160408051808303815f875af11580156126d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126fc919061423f565b9150915061270a8282613698565b826001600160a01b03167ff753ba3c7c9e5d6813c50ab20dfd8e33f496ce2bc7e72e08e547e0d2aff151338360405161274591815260200190565b60405180910390a2505060015f5550565b600b8181548110612765575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004805460405163a58c3eff60e01b81529182018390525f916001600160a01b039091169063a58c3eff90602401602060405180830381865afa1580156127c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fe919061407c565b6127f3613151565b6127fb612a19565b6001600160a01b0316336001600160a01b03161461284f5760405162461bcd60e51b8152602060048201526011602482015270504d3a53413a4e4f545f474c4f42414c5360781b604482015260640161091d565b60068054821515600160a01b0260ff60a01b199091161790556040517f3d5d61d217e7fecd922d11f2a46d0e10cc789ec3f1e4e2c2fa41c4c2f92489bb90611da790831515815260200190565b6128a4613151565b6128ac6134d5565b6001600160a01b0382165f81815260096020908152604091829020805460ff191685151590811790915591519182527fcc29d2c12a24792a32895bc07b719e3287d2af41d7dd3cc0cc299dae17e80f38910160405180910390a25f5b600b5481101561295557826001600160a01b0316600b828154811061292f5761292f614093565b5f918252602090912001546001600160a01b03160361294d57505050565b600101612908565b5060405162461bcd60e51b815260206004820152601760248201527f504d3a5349533a494e56414c49445f5354524154454759000000000000000000604482015260640161091d565b600654604051632ef1bc7760e21b81526001600160a01b038481166004830152602482018490525f92169063bbc6f1dc906044015b6040805180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a11919061423f565b949350505050565b5f612a226133fb565b6001600160a01b0316633a60339a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089e573d5f803e3d5ffd5b612a65613151565b612a6d6133fb565b6001600160a01b0316336001600160a01b031614612ac05760405162461bcd60e51b815260206004820152601060248201526f504d3a4d3a4e4f545f464143544f525960801b604482015260640161091d565b612acb838383613c44565b612b055760405162461bcd60e51b815260206004820152600b60248201526a14134e934e91905253115160aa1b604482015260640161091d565b6005546001600160a01b0316612b555760405162461bcd60e51b815260206004820152601560248201527414134e934e9111531151d0551157d393d517d4d155605a1b604482015260640161091d565b505050565b5f6108c26133fb565b5f80612b6d61073d565b90505f612b84848365140e9b5a5b9d60d21b613429565b6004805460405163ef8b30f760e01b81529293506001600160a01b03169163ef8b30f791612bb89185910190815260200190565b602060405180830381865afa158015612bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a11919061407c565b5f6108c2612c03612a19565b6003546001600160a01b0316613949565b60065460405163cbe52ae360e01b81526001600160a01b038481166004830152602482018490525f92169063cbe52ae3906044016129d3565b612c55613151565b5f54600114612c765760405162461bcd60e51b815260040161091d906140e9565b60025f5560405162461bcd60e51b815260206004820152601160248201527014134e9495ce9393d517d1539050931151607a1b604482015260640161091d565b612cbe613151565b612cc66133fb565b6001600160a01b0316336001600160a01b031614612d1a5760405162461bcd60e51b8152602060048201526011602482015270504d3a53493a4e4f545f464143544f525960781b604482015260640161091d565b6001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b612d4f613151565b612d576134d5565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907fc7c986185853ebd33d70a7570381a3a2d859b493edc7286bc07f74882930421f905f90a350565b6006546040516338cdab1160e21b81526001600160a01b0383811660048301525f92839291169063e336ac4490602401602060405180830381865afa158015612df3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e17919061407c565b60065460405163a1cfc18760e01b81526001600160a01b03868116600483015292935091169063a1cfc18790602401602060405180830381865afa158015612e61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e85919061410c565b612e8f575f612e91565b805b9392505050565b5f80612ea2613151565b5f54600114612ec35760405162461bcd60e51b815260040161091d906140e9565b60025f5560405162461bcd60e51b815260206004820152601160248201527014134e9415ce9393d517d1539050931151607a1b604482015260640161091d565b612f0b613151565b612f136133a9565b5f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7491906140ce565b9050612f7e612a19565b60405163305c9e0560e01b81527f5749544844524157414c5f4d414e414745525f464143544f525900000000000060048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa158015612fea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061300e919061410c565b6130535760405162461bcd60e51b8152602060048201526016602482015275504d3a53574d3a494e56414c49445f464143544f525960501b604482015260640161091d565b6040516335a2735f60e11b81526001600160a01b038381166004830152821690636b44e6be90602401602060405180830381865afa158015613097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130bb919061410c565b6131075760405162461bcd60e51b815260206004820152601760248201527f504d3a53574d3a494e56414c49445f494e5354414e4345000000000000000000604482015260640161091d565b600680546001600160a01b0319166001600160a01b0384169081179091556040517f0c2851fb58aab3ab4bd3cec7c6162727dcda72195b7119dec5e04f812618c51a905f90a25050565b613159612a19565b604051634c532de160e01b81526001600160e01b03195f351660048201526001600160a01b039190911690634c532de190602401602060405180830381865afa1580156131a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131cc919061410c565b156132055760405162461bcd60e51b815260206004820152600960248201526814134e94105554d15160ba1b604482015260640161091d565b565b6004546001600160a01b031633146132055760405162461bcd60e51b815260206004820152600b60248201526a14134e9393d517d413d3d360aa1b604482015260640161091d565b6001546001600160a01b031633146132055760405162461bcd60e51b815260206004820152600960248201526814134e9393d517d41160ba1b604482015260640161091d565b600654600160a81b900460ff1615806132b857506001546001600160a01b031633145b806132db57506132c661085a565b6001600160a01b0316336001600160a01b0316145b8061335d57506132e9612a19565b6001600160a01b0316630b52d12d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334891906140ce565b6001600160a01b0316336001600160a01b0316145b6132055760405162461bcd60e51b815260206004820152601b60248201527f504d3a4e4f545f50415f4f525f4e4f545f434f4e464947555245440000000000604482015260640161091d565b600654600160a81b900460ff16156132055760405162461bcd60e51b815260206004820152601560248201527414134e9053149150511657d0d3d3919251d5549151605a1b604482015260640161091d565b5f6134247f7a45a402e4cb6e08ebc196f20f66d5d30e67285a2a8aa80503fa409e727a4af15490565b919050565b600c54604051630dace25b60e31b81523060048201526001600160a01b038581166024830152604482018490525f928392911690636d6712d890606401602060405180830381865afa158015613481573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a5919061410c565b60075490915084811180156134b75750815b6134c1575f6134cb565b6134cb858261431b565b9695505050505050565b6001546001600160a01b031633148061350657506134f161085a565b6001600160a01b0316336001600160a01b0316145b806135885750613514612a19565b6001600160a01b0316630b52d12d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561354f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357391906140ce565b6001600160a01b0316336001600160a01b0316145b6132055760405162461bcd60e51b8152602060048201526016602482015275504d3a4e4f545f50445f4f525f474f565f4f525f4f4160501b604482015260640161091d565b5f816001600160a01b031663bcead63e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e91906140ce565b6001600160a01b0381165f9081526009602052604090205490915060ff166134245760405162461bcd60e51b815260206004820152601b60248201527f504d3a474c4d3a494e56414c49445f4c4f414e5f4d414e414745520000000000604482015260640161091d565b5f6136a1612a19565b604051638d16e42b60e01b81523060048201529091505f90620f4240906001600160a01b03841690638d16e42b90602401602060405180830381865afa1580156136ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613711919061407c565b6003546005546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561375b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061377f919061407c565b613789919061432e565b6137939190614345565b90505f6137a08285613ac5565b90505f6137b66137b0838561431b565b87613ac5565b9050811561389d5760055f9054906101000a90046001600160a01b03166001600160a01b0316637378b20683866001600160a01b031663a5a276056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061384291906140ce565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015613886575f80fd5b505af1158015613898573d5f803e3d5ffd5b505050505b801561390857600554600480546040516339bc590360e11b81529182018490526001600160a01b03908116602483015290911690637378b206906044015f604051808303815f87803b1580156138f1575f80fd5b505af1158015613903573d5f803e3d5ffd5b505050505b60408051838152602081018390527f94b781636ba0868cca92a6b4702ed1bb1c01587bf498019c1b1e69737f91deb8910160405180910390a1505050505050565b6040516323396b5360e11b81523060048201525f906001600160a01b03841690634672d6a690602401602060405180830381865afa15801561398d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b1919061407c565b6005546040516370a0823160e01b81526001600160a01b039182166004820152908416906370a0823190602401602060405180830381865afa1580156139f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1d919061407c565b10159392505050565b6040516001600160a01b03808516602483015283166044820152606481018290525f90613a939086906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613cb8565b95945050505050565b5f6134247f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b5f818310613ad35781612e91565b5090919050565b613ae2613d52565b6040821115613b0857613af782840184614364565b6040840152602083015281526110fe565b613b148284018461438d565b6020830152815292915050565b6006545f90606090600160a01b900460ff16613b6357505060408051808201909152600c81526b503a4e4f545f41435449564560a01b60208201525f92909150565b600754613b6e61073d565b613b7890856140bb565b1115613bb25750506040805180820190915260148152730503a4445504f5349545f47545f4c49515f4341560641b60208201525f92909150565b505060408051602081019091525f8152600192909150565b6040516001600160a01b03831660248201525f6044820181905290613bfc90859063095ea7b360e01b90606401613a5c565b613c0757505f612e91565b81613c1457506001612e91565b6040516001600160a01b038416602482015260448101839052612a1190859063095ea7b360e01b90606401613a5c565b5f833b80613c55575f915050612e91565b846001600160a01b03168484604051613c6f9291906143ad565b5f60405180830381855af49150503d805f8114613ca7576040519150601f19603f3d011682016040523d82523d5f602084013e613cac565b606091505b50909695505050505050565b5f6001600160a01b0383163b613ccf57505f6110fe565b6060836001600160a01b031683604051613ce991906143bc565b5f604051808303815f865af19150503d805f8114613d22576040519150601f19603f3d011682016040523d82523d5f602084013e613d27565b606091505b509092509050818015612a11575080511580612a11575080806020019051810190612a11919061410c565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b0381168114613d84575f80fd5b50565b5f8060408385031215613d98575f80fd5b823591506020830135613daa81613d70565b809150509250929050565b5f60208284031215613dc5575f80fd5b8135612e9181613d70565b5f8083601f840112613de0575f80fd5b50813567ffffffffffffffff811115613df7575f80fd5b602083019150836020828501011115613e0e575f80fd5b9250929050565b5f805f60408486031215613e27575f80fd5b83359250602084013567ffffffffffffffff811115613e44575f80fd5b613e5086828701613dd0565b9497909650939450505050565b5f8060408385031215613e6e575f80fd5b8235613e7981613d70565b91506020830135613daa81613d70565b5f8060408385031215613e9a575f80fd5b8235613ea581613d70565b946020939093013593505050565b5f805f60608486031215613ec5575f80fd5b833592506020840135613ed781613d70565b91506040840135613ee781613d70565b809150509250925092565b5f805f60408486031215613f04575f80fd5b8335613f0f81613d70565b9250602084013567ffffffffffffffff811115613e44575f80fd5b5f60208284031215613f3a575f80fd5b5035919050565b5f805f8060608587031215613f54575f80fd5b843593506020850135613f6681613d70565b9250604085013567ffffffffffffffff811115613f81575f80fd5b613f8d87828801613dd0565b95989497509550505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f612a116040830184613f99565b8015158114613d84575f80fd5b5f60208284031215613ffe575f80fd5b8135612e9181613fe1565b5f806040838503121561401a575f80fd5b823561402581613d70565b91506020830135613daa81613fe1565b5f805f8060808587031215614048575f80fd5b8435935060208501359250604085013561406181613d70565b9150606085013561407181613d70565b939692955090935050565b5f6020828403121561408c575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156110fe576110fe6140a7565b5f602082840312156140de575f80fd5b8151612e9181613d70565b60208082526009908201526814134e9313d0d2d15160ba1b604082015260600190565b5f6020828403121561411c575f80fd5b8151612e9181613fe1565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015269504d3a5550475241444560b01b60408201526080606082018190525f906134cb9083018486614127565b6001600160a01b038416815269504d3a5550475241444560b01b60208201526060604082018190525f90613a939083018486614127565b838152604060208201525f613a93604083018486614127565b5f805f606084860312156141f0575f80fd5b83516141fb81613fe1565b602085015160409095015190969495509392505050565b6f53545241544547595f464143544f525960801b81526001600160a01b0391909116602082015260400190565b5f8060408385031215614250575f80fd5b505080516020909101519092909150565b5f81518060208401855e5f93019283525090919050565b5f6142838286614261565b838582375f930192835250909392505050565b604081525f6142a86040830185613f99565b90508260208301529392505050565b6001600160a01b0384811682526060602080840182905285519184018290525f92868201929091906080860190855b818110156143045785518516835294830194918301916001016142e6565b505080945050505050826040830152949350505050565b818103818111156110fe576110fe6140a7565b80820281158282048414176110fe576110fe6140a7565b5f8261435f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f60608486031215614376575f80fd5b505081359360208301359350604090920135919050565b5f806040838503121561439e575f80fd5b50508035926020909101359150565b818382375f9101908152919050565b5f612e91828461426156fea2646970667358221220d84f82e343260ae12ad709fc5e974eabdb95f3f91eb26733c537132d386c712d64736f6c63430008190033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":contract-test-utils/=modules/erc20/modules/contract-test-utils/contracts/",":ds-test/=modules/forge-std/lib/ds-test/src/",":erc20-helper/=modules/erc20-helper/src/",":erc20/=modules/erc20/contracts/",":forge-std/=modules/forge-std/src/",":maple-proxy-factory/=modules/maple-proxy-factory/",":proxy-factory/=modules/maple-proxy-factory/modules/proxy-factory/"]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/1/0xfE02Be1aD28EdFd8e3dD6F29C402B244C2A258B8/","decoded_constructor_args":null,"compiler_version":"0.8.25+commit.b61c2a91","is_verified_via_verifier_alliance":false,"verified_at":"2025-05-01T19:59:53.538854Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6080604052348015600e575f80fd5b506143fd8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610333575f3560e01c80637bec9b18116101af578063c3124525116100fe578063d4dd04381161009e578063d905777e11610079578063d905777e146106f1578063e15e990a14610704578063e345f4b614610717578063fc72ed5b1461072a575f80fd5b8063d4dd0438146106b8578063d784d426146106cb578063d7c0ca48146106de575f80fd5b8063c63d75b6116100d9578063c63d75b614610677578063caf901dd1461068a578063cbe52ae314610692578063ce96cb77146106a5575f80fd5b8063c312452514610654578063c3fbb6fd1461065c578063c45a01551461066f575f80fd5b80639e5df6c211610169578063ab42685c11610144578063ab42685c14610608578063acec338a1461061b578063b14b56be1461062e578063bbc6f1dc14610641575f80fd5b80639e5df6c2146105cf578063a267526b146105e2578063a58c3eff146105f5575f80fd5b80637bec9b18146105675780637d41c86e1461056f57806382fe535a146105825780638772a23a1461059557806387c2f4ae146105a95780638b1c4990146105bc575f80fd5b8063402d267d1161028557806360af6ad31161022557806376687d3d1161020057806376687d3d146105175780637aeedf2a146105205780637b99adb1146105335780637bd243de14610546575f80fd5b806360af6ad3146104dd57806367e2ba23146105055780636ed93dd01461050d575f80fd5b8063494666b611610260578063494666b6146104885780635c60da1b1461049b5780635cf2ed57146104a35780635dd28449146104d4575f80fd5b8063402d267d1461044f5780634046af2b1461046257806340504ba014610475575f80fd5b80631b8f1830116102f05780632ebada04116102cb5780632ebada041461040e5780633291f0121461042157806338d52e0f146104295780633b99bcee1461043c575f80fd5b80631b8f1830146103c657806326af24b7146103d95780632e8ebaae146103ec575f80fd5b806301e1d1141461033757806302db6cd31461035257806302fb0c5e1461037d5780630c340a24146103a157806316f0115b146103a957806319e9cd7b146103bc575b5f80fd5b61033f61073d565b6040519081526020015b60405180910390f35b600254610365906001600160a01b031681565b6040516001600160a01b039091168152602001610349565b60065461039190600160a01b900460ff1681565b6040519015158152602001610349565b61036561085a565b600454610365906001600160a01b031681565b6103c46108c7565b005b61033f6103d4366004613d87565b6109f1565b6103c46103e7366004613d87565b610add565b6103916103fa366004613db5565b60096020525f908152604090205460ff1681565b6103c461041c366004613db5565b610cbc565b6103c4610df9565b600354610365906001600160a01b031681565b6103c461044a366004613e15565b610e46565b61033f61045d366004613db5565b6110df565b600154610365906001600160a01b031681565b6103c4610483366004613e5d565b611104565b6103c4610496366004613e89565b611324565b610365611898565b6104b76104b1366004613e89565b91309150565b604080519283526001600160a01b03909116602083015201610349565b61033f60085481565b6104f06104eb366004613eb3565b6118a1565b60408051928352602083019190915201610349565b61033f611a7a565b61033f620f424081565b61033f60075481565b61036561052e366004613ef2565b611b37565b6103c4610541366004613f2a565b611d66565b610559610554366004613f41565b611db2565b604051610349929190613fc7565b600b5461033f565b6103c461057d366004613eb3565b612315565b600654610365906001600160a01b031681565b60065461039190600160a81b900460ff1681565b6103c46105b7366004613f2a565b612532565b6103c46105ca366004613f2a565b6125b9565b6103c46105dd366004613db5565b612652565b6103656105f0366004613f2a565b612756565b61033f610603366004613f2a565b61277e565b600554610365906001600160a01b031681565b6103c4610629366004613fee565b6127eb565b6103c461063c366004614009565b61289c565b61033f61064f366004613e89565b61299e565b610365612a19565b6103c461066a366004613ef2565b612a5d565b610365612b5a565b61033f610685366004613db5565b612b63565b610391612bf7565b61033f6106a0366004613e89565b612c14565b61033f6106b3366004613db5565b505f90565b6103c46106c6366004614035565b612c4d565b6103c46106d9366004613db5565b612cb6565b6103c46106ec366004613db5565b612d47565b61033f6106ff366004613db5565b612da8565b600c54610365906001600160a01b031681565b6104f0610725366004613eb3565b612e98565b6103c4610738366004613db5565b612f03565b600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f9216906370a0823190602401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061407c565b600b549091505f5b8181101561085557600b81815481106107d2576107d2614093565b5f918252602091829020015460408051637b6f05e960e11b815290516001600160a01b039092169263f6de0bd2926004808401938290030181865afa15801561081d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610841919061407c565b61084b90846140bb565b92506001016107b7565b505090565b5f610863612a19565b6001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c291906140ce565b905090565b6108cf613151565b6002546001600160a01b031633146109265760405162461bcd60e51b815260206004820152601560248201527414134e9054110e9393d517d4115391125391d7d411605a1b60448201526064015b60405180910390fd5b61092e612a19565b600154604051632f97305960e01b81526001600160a01b039182166004820152336024820152911690632f973059906044015f604051808303815f87803b158015610977575f80fd5b505af1158015610989573d5f803e3d5ffd5b50506002546001546040516001600160a01b039283169450911691507fff9949a1e16bc5d8386effb58bc7d620cff72179b0ad2bf1fcc1f58b09522a6d905f90a360028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b5f6109fa613151565b5f54600114610a1b5760405162461bcd60e51b815260040161091d906140e9565b60025f55610a27613207565b6006546040516301b8f18360e41b8152600481018590526001600160a01b0384811660248301819052927f4b171f7fc0550bd6b41ba56e9b2b88100206431510ba9427518f3485198db36d92911690631b8f1830906044016020604051808303815f875af1158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061407c565b60405181815290935060200160405180910390a260015f5592915050565b610ae5613151565b610aed61324f565b6001600160a01b03811615610b025780610b04565b335b6005546040516339bc590360e11b8152600481018590526001600160a01b038084166024830152929350911690637378b206906044015f604051808303815f87803b158015610b51575f80fd5b505af1158015610b63573d5f803e3d5ffd5b50505050610b6f612a19565b6040516323396b5360e11b81523060048201526001600160a01b039190911690634672d6a690602401602060405180830381865afa158015610bb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061407c565b6003546005546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c45919061407c565b1015610c855760405162461bcd60e51b815260206004820152600f60248201526e28269d2ba19d2122a627abafa6a4a760891b604482015260640161091d565b6040518281527f197c9d0c5e4013c0533a69753717932d354db643259ac08a83f71c835729ad769060200160405180910390a15050565b610cc4613151565b610ccc613295565b610cd4612a19565b60405163305c9e0560e01b81527f504f4f4c5f5045524d495353494f4e5f4d414e4147455200000000000000000060048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa158015610d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d64919061410c565b610db05760405162461bcd60e51b815260206004820152601860248201527f504d3a5350504d3a494e56414c49445f494e5354414e43450000000000000000604482015260640161091d565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f269618c20ead34aabc3811b327fd482daf7368845178bdf8f1a7022dfff3a43f905f90a250565b610e01613151565b610e096133a9565b6006805460ff60a81b1916600160a81b1790556040517f88f39e22620812dfcec36b8475764a7450bda154d389facf6d2708fbea7d6407905f90a1565b610e4e613151565b5f610e57612a19565b6001549091506001600160a01b03163303610f8b5760405163fd4c5b3760e01b81526001600160a01b0382169063fd4c5b3790610e9e90339030905f90369060040161414f565b602060405180830381865afa158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd919061410c565b610f295760405162461bcd60e51b815260206004820152601760248201527f504d3a553a494e56414c49445f53434845445f43414c4c000000000000000000604482015260640161091d565b604051635ad5b6f760e11b81526001600160a01b0382169063b5ab6dee90610f599033905f90369060040161418e565b5f604051808303815f87803b158015610f70575f80fd5b505af1158015610f82573d5f803e3d5ffd5b5050505061103a565b806001600160a01b031663be7c13f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610feb91906140ce565b6001600160a01b0316336001600160a01b03161461103a5760405162461bcd60e51b815260206004820152600c60248201526b0a09a74aa749c9ebe82aaa8960a31b604482015260640161091d565b7faaaa7ee6b0c2f4ee1fa7312c7d5b3623a434da5a1a9ce3cb6e629caa23454ab684848460405161106d939291906141c5565b60405180910390a161107d6133fb565b6001600160a01b031663fe69f7088585856040518463ffffffff1660e01b81526004016110ac939291906141c5565b5f604051808303815f87803b1580156110c3575f80fd5b505af11580156110d5573d5f803e3d5ffd5b5050505050505050565b5f6110fe826110ec61073d565b68140e99195c1bdcda5d60ba1b613429565b92915050565b61110c613151565b5f5460011461112d5760405162461bcd60e51b815260040161091d906140e9565b60025f556111396134d5565b611141612a19565b60405163305c9e0560e01b8152714c495155494441544f525f464143544f525960701b60048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa1580156111a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c6919061410c565b6112065760405162461bcd60e51b8152602060048201526011602482015270504d3a54443a4e4f545f464143544f525960781b604482015260640161091d565b5f805f611212856135cd565b604051630202825d60e51b81526001600160a01b038781166004830152868116602483015291909116906340504ba0906044016060604051808303815f875af1158015611261573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128591906141de565b925092509250826112cb576040516001600160a01b038616907f371cc890361cf16190aac5797dcbc15218efceb8445aac6f43ff106481d5ca33905f90a250505061131c565b6112d58282613698565b846001600160a01b03167ff753ba3c7c9e5d6813c50ab20dfd8e33f496ce2bc7e72e08e547e0d2aff151338360405161131091815260200190565b60405180910390a25050505b505060015f55565b61132c613151565b5f5460011461134d5760405162461bcd60e51b815260040161091d906140e9565b60025f908155600354600480546040805163c45a015560e01b815290516001600160a01b0394851695949092169392339263c45a01559280830192602092918290030181865afa1580156113a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c791906140ce565b90505f6113d2612a19565b9050845f036114235760405162461bcd60e51b815260206004820152601760248201527f504d3a52463a494e56414c49445f5052494e434950414c000000000000000000604482015260640161091d565b60405163305c9e0560e01b81526001600160a01b0382169063305c9e059061144f908590600401614212565b602060405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148e919061410c565b6114d25760405162461bcd60e51b8152602060048201526015602482015274504d3a52463a494e56414c49445f464143544f525960581b604482015260640161091d565b6040516335a2735f60e11b81523360048201526001600160a01b03831690636b44e6be90602401602060405180830381865afa158015611514573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611538919061410c565b61157d5760405162461bcd60e51b8152602060048201526016602482015275504d3a52463a494e56414c49445f494e5354414e434560501b604482015260640161091d565b335f9081526009602052604090205460ff166115d05760405162461bcd60e51b8152602060048201526012602482015271504d3a52463a4e4f545f535452415445475960701b604482015260640161091d565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561160c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611630919061407c565b5f036116725760405162461bcd60e51b8152602060048201526011602482015270504d3a52463a5a45524f5f535550504c5960781b604482015260640161091d565b61167c8185613949565b6116c85760405162461bcd60e51b815260206004820152601860248201527f504d3a52463a494e53554646494349454e545f434f5645520000000000000000604482015260640161091d565b60065460408051632d0e609160e21b815290515f926001600160a01b03169163b43982449160048083019260209291908290030181865afa15801561170f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611733919061407c565b90506001600160a01b03871661178b5760405162461bcd60e51b815260206004820152601960248201527f504d3a52463a494e56414c49445f44455354494e4154494f4e00000000000000604482015260640161091d565b61179785858989613a26565b6117d95760405162461bcd60e51b815260206004820152601360248201527214134e94918e9514905394d1915497d1905253606a1b604482015260640161091d565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908716906370a0823190602401602060405180830381865afa158015611820573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611844919061407c565b101561188b5760405162461bcd60e51b8152602060048201526016602482015275504d3a52463a4c4f434b45445f4c495155494449545960501b604482015260640161091d565b505060015f555050505050565b5f6108c2613a9c565b5f806118ab613151565b5f546001146118cc5760405162461bcd60e51b815260040161091d906140e9565b60025f556118d8613207565b826001600160a01b0316846001600160a01b0316148061196e575060048054604051636eb1769f60e11b81526001600160a01b038781169382019390935285831660248201525f929091169063dd62ed3e90604401602060405180830381865afa158015611948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196c919061407c565b115b6119af5760405162461bcd60e51b8152602060048201526012602482015271504d3a50523a4e4f5f414c4c4f57414e434560701b604482015260640161091d565b600654604051634f721ddb60e11b8152600481018790526001600160a01b03868116602483015290911690639ee43bb69060440160408051808303815f875af11580156119fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a22919061423f565b60408051838152602081018390529294509092506001600160a01b038616917f7ad3c51fdfaa55fae7fe0d0cf9efb279d8a3aa02914048280d3d1bdbe560d67a910160405180910390a260015f559094909350915050565b600b545f90815b81811015611b1f57600b8181548110611a9c57611a9c614093565b5f9182526020918290200154604080516367e2ba2360e01b815290516001600160a01b03909216926367e2ba23926004808401938290030181865afa158015611ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b919061407c565b611b1590846140bb565b9250600101611a81565b50611b3182611b2c61073d565b613ac5565b91505090565b5f611b40613151565b611b48613295565b611b50612a19565b6001600160a01b031663305c9e05856040518263ffffffff1660e01b8152600401611b7b9190614212565b602060405180830381865afa158015611b96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bba919061410c565b611bfe5760405162461bcd60e51b8152602060048201526015602482015274504d3a41533a494e56414c49445f464143544f525960581b604482015260640161091d565b604080513060208201526001600160a01b0386169163517b657f910160408051601f1981840301815290829052611c3b9187908790602001614278565b60408051808303601f19018152828252600b543060208501529183019190915290606001604051602081830303815290604052805190602001206040518363ffffffff1660e01b8152600401611c92929190614296565b6020604051808303815f875af1158015611cae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd291906140ce565b6001600160a01b0381165f81815260096020526040808220805460ff19166001908117909155600b8054918201815583527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916841790555192935090917f3f008fd510eae7a9e7bee13513d7b83bef8003d488b5a3d0b0da4de71d6846f19190a29392505050565b611d6e613151565b611d76613295565b60078190556040518181527f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab906020015b60405180910390a150565b5f6060611dbd612a19565b604051634c532de160e01b81526001600160e01b03195f351660048201526001600160a01b039190911690634c532de190602401602060405180830381865afa158015611e0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e30919061410c565b15611e6157505060408051808201909152600c81526b14134e90d0ce94105554d15160a21b60208201525f9061230c565b5f611e6c8585613ada565b80519091505f611e818360015b602002015190565b90508865140e9b5a5b9d60d21b1480611eac5750886f140e9b5a5b9d15da5d1a14195c9b5a5d60821b145b15611f1d5760048054845160405163b3d7f6b960e01b8152928301526001600160a01b03169063b3d7f6b990602401602060405180830381865afa158015611ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1a919061407c565b91505b8867503a72656465656d60c01b1480611f4257508869503a776974686472617760b01b145b15611f5557611f52836002611e79565b90505b8869281d3a3930b739b332b960b11b1480611f805750886d503a7472616e7366657246726f6d60901b145b156120d2576040805160028082526060820183525f926020830190803683370190505090508969281d3a3930b739b332b960b11b14611fd357611fc3845f611e79565b611fce856001611e79565b611fde565b88611fde855f611e79565b825f81518110611ff057611ff0614093565b602002602001018360018151811061200a5761200a614093565b6001600160a01b039384166020918202929092010152918116909152600c546040516334dd0fbb60e01b81529116906334dd0fbb9061205190309085908f906004016142b7565b602060405180830381865afa15801561206c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612090919061410c565b6120cc575f6040518060400160405280601181526020017014134e90d0ce9393d517d0531313d5d151607a1b815250955095505050505061230c565b50612186565b600c54604051630dace25b60e31b81523060048201526001600160a01b038381166024830152604482018c905290911690636d6712d890606401602060405180830381865afa158015612127573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214b919061410c565b612186575f6040518060400160405280601181526020017014134e90d0ce9393d517d0531313d5d151607a1b8152509450945050505061230c565b8867503a72656465656d60c01b14806121ab57508869503a776974686472617760b01b145b806121c65750886d503a72656d6f766553686172657360901b145b806121e25750886e503a7265717565737452656465656d60881b145b8061220057508870503a72657175657374576974686472617760781b145b8061221757508869281d3a3930b739b332b960b11b145b806122325750886d503a7472616e7366657246726f6d60901b145b1561225457600160405180602001604052805f8152509450945050505061230c565b8868140e99195c1bdcda5d60ba1b148061228357508872140e99195c1bdcda5d15da5d1a14195c9b5a5d606a1b145b8061229657508865140e9b5a5b9d60d21b145b806122b35750886f140e9b5a5b9d15da5d1a14195c9b5a5d60821b145b156122cd576122c182613b21565b9450945050505061230c565b5f6040518060400160405280601981526020017f504d3a43433a494e56414c49445f46554e4354494f4e5f494400000000000000815250945094505050505b94509492505050565b61231d613151565b5f5460011461233e5760405162461bcd60e51b815260040161091d906140e9565b60025f5561234a613207565b6004546006546001600160a01b03918216916123699183911686613bca565b6123aa5760405162461bcd60e51b815260206004820152601260248201527114134e94948e9054141493d59157d190525360721b604482015260640161091d565b826001600160a01b0316826001600160a01b0316141580156123ca575083155b1561248457604051636eb1769f60e11b81526001600160a01b03848116600483015283811660248301525f919083169063dd62ed3e90604401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612442919061407c565b116124845760405162461bcd60e51b8152602060048201526012602482015271504d3a52523a4e4f5f414c4c4f57414e434560701b604482015260640161091d565b6006546040516334c9ac8f60e21b8152600481018690526001600160a01b0385811660248301529091169063d326b23c906044015f604051808303815f87803b1580156124cf575f80fd5b505af11580156124e1573d5f803e3d5ffd5b50505050826001600160a01b03167fa1a009bfa4d4ebaf046d2b27cbc657074cb3b637a247a3dbdf767eda4955efc28560405161252091815260200190565b60405180910390a2505060015f555050565b61253a613151565b612542613295565b620f42408111156125845760405162461bcd60e51b815260206004820152600c60248201526b28269d29a226a3291d27a7a160a11b604482015260640161091d565b60088190556040518181527f147f457c314a84eed0e31b87c73270d1696cf771a8219a779400326319d6c77690602001611da7565b6125c1613151565b6003546005546125e0916001600160a01b039081169133911684613a26565b6126225760405162461bcd60e51b815260206004820152601360248201527214134e9110ce9514905394d1915497d1905253606a1b604482015260640161091d565b6040518181527f11cdeb47a11cb4a94ffa87f7d2337ac3695b610f52fb5d80923effc9e0c56e9990602001611da7565b61265a613151565b5f5460011461267b5760405162461bcd60e51b815260040161091d906140e9565b60025f556126876134d5565b5f80612692836135cd565b604051634f2efb6160e11b81526001600160a01b0385811660048301529190911690639e5df6c29060240160408051808303815f875af11580156126d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126fc919061423f565b9150915061270a8282613698565b826001600160a01b03167ff753ba3c7c9e5d6813c50ab20dfd8e33f496ce2bc7e72e08e547e0d2aff151338360405161274591815260200190565b60405180910390a2505060015f5550565b600b8181548110612765575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004805460405163a58c3eff60e01b81529182018390525f916001600160a01b039091169063a58c3eff90602401602060405180830381865afa1580156127c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fe919061407c565b6127f3613151565b6127fb612a19565b6001600160a01b0316336001600160a01b03161461284f5760405162461bcd60e51b8152602060048201526011602482015270504d3a53413a4e4f545f474c4f42414c5360781b604482015260640161091d565b60068054821515600160a01b0260ff60a01b199091161790556040517f3d5d61d217e7fecd922d11f2a46d0e10cc789ec3f1e4e2c2fa41c4c2f92489bb90611da790831515815260200190565b6128a4613151565b6128ac6134d5565b6001600160a01b0382165f81815260096020908152604091829020805460ff191685151590811790915591519182527fcc29d2c12a24792a32895bc07b719e3287d2af41d7dd3cc0cc299dae17e80f38910160405180910390a25f5b600b5481101561295557826001600160a01b0316600b828154811061292f5761292f614093565b5f918252602090912001546001600160a01b03160361294d57505050565b600101612908565b5060405162461bcd60e51b815260206004820152601760248201527f504d3a5349533a494e56414c49445f5354524154454759000000000000000000604482015260640161091d565b600654604051632ef1bc7760e21b81526001600160a01b038481166004830152602482018490525f92169063bbc6f1dc906044015b6040805180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a11919061423f565b949350505050565b5f612a226133fb565b6001600160a01b0316633a60339a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089e573d5f803e3d5ffd5b612a65613151565b612a6d6133fb565b6001600160a01b0316336001600160a01b031614612ac05760405162461bcd60e51b815260206004820152601060248201526f504d3a4d3a4e4f545f464143544f525960801b604482015260640161091d565b612acb838383613c44565b612b055760405162461bcd60e51b815260206004820152600b60248201526a14134e934e91905253115160aa1b604482015260640161091d565b6005546001600160a01b0316612b555760405162461bcd60e51b815260206004820152601560248201527414134e934e9111531151d0551157d393d517d4d155605a1b604482015260640161091d565b505050565b5f6108c26133fb565b5f80612b6d61073d565b90505f612b84848365140e9b5a5b9d60d21b613429565b6004805460405163ef8b30f760e01b81529293506001600160a01b03169163ef8b30f791612bb89185910190815260200190565b602060405180830381865afa158015612bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a11919061407c565b5f6108c2612c03612a19565b6003546001600160a01b0316613949565b60065460405163cbe52ae360e01b81526001600160a01b038481166004830152602482018490525f92169063cbe52ae3906044016129d3565b612c55613151565b5f54600114612c765760405162461bcd60e51b815260040161091d906140e9565b60025f5560405162461bcd60e51b815260206004820152601160248201527014134e9495ce9393d517d1539050931151607a1b604482015260640161091d565b612cbe613151565b612cc66133fb565b6001600160a01b0316336001600160a01b031614612d1a5760405162461bcd60e51b8152602060048201526011602482015270504d3a53493a4e4f545f464143544f525960781b604482015260640161091d565b6001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b612d4f613151565b612d576134d5565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907fc7c986185853ebd33d70a7570381a3a2d859b493edc7286bc07f74882930421f905f90a350565b6006546040516338cdab1160e21b81526001600160a01b0383811660048301525f92839291169063e336ac4490602401602060405180830381865afa158015612df3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e17919061407c565b60065460405163a1cfc18760e01b81526001600160a01b03868116600483015292935091169063a1cfc18790602401602060405180830381865afa158015612e61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e85919061410c565b612e8f575f612e91565b805b9392505050565b5f80612ea2613151565b5f54600114612ec35760405162461bcd60e51b815260040161091d906140e9565b60025f5560405162461bcd60e51b815260206004820152601160248201527014134e9415ce9393d517d1539050931151607a1b604482015260640161091d565b612f0b613151565b612f136133a9565b5f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7491906140ce565b9050612f7e612a19565b60405163305c9e0560e01b81527f5749544844524157414c5f4d414e414745525f464143544f525900000000000060048201526001600160a01b038381166024830152919091169063305c9e0590604401602060405180830381865afa158015612fea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061300e919061410c565b6130535760405162461bcd60e51b8152602060048201526016602482015275504d3a53574d3a494e56414c49445f464143544f525960501b604482015260640161091d565b6040516335a2735f60e11b81526001600160a01b038381166004830152821690636b44e6be90602401602060405180830381865afa158015613097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130bb919061410c565b6131075760405162461bcd60e51b815260206004820152601760248201527f504d3a53574d3a494e56414c49445f494e5354414e4345000000000000000000604482015260640161091d565b600680546001600160a01b0319166001600160a01b0384169081179091556040517f0c2851fb58aab3ab4bd3cec7c6162727dcda72195b7119dec5e04f812618c51a905f90a25050565b613159612a19565b604051634c532de160e01b81526001600160e01b03195f351660048201526001600160a01b039190911690634c532de190602401602060405180830381865afa1580156131a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131cc919061410c565b156132055760405162461bcd60e51b815260206004820152600960248201526814134e94105554d15160ba1b604482015260640161091d565b565b6004546001600160a01b031633146132055760405162461bcd60e51b815260206004820152600b60248201526a14134e9393d517d413d3d360aa1b604482015260640161091d565b6001546001600160a01b031633146132055760405162461bcd60e51b815260206004820152600960248201526814134e9393d517d41160ba1b604482015260640161091d565b600654600160a81b900460ff1615806132b857506001546001600160a01b031633145b806132db57506132c661085a565b6001600160a01b0316336001600160a01b0316145b8061335d57506132e9612a19565b6001600160a01b0316630b52d12d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334891906140ce565b6001600160a01b0316336001600160a01b0316145b6132055760405162461bcd60e51b815260206004820152601b60248201527f504d3a4e4f545f50415f4f525f4e4f545f434f4e464947555245440000000000604482015260640161091d565b600654600160a81b900460ff16156132055760405162461bcd60e51b815260206004820152601560248201527414134e9053149150511657d0d3d3919251d5549151605a1b604482015260640161091d565b5f6134247f7a45a402e4cb6e08ebc196f20f66d5d30e67285a2a8aa80503fa409e727a4af15490565b919050565b600c54604051630dace25b60e31b81523060048201526001600160a01b038581166024830152604482018490525f928392911690636d6712d890606401602060405180830381865afa158015613481573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a5919061410c565b60075490915084811180156134b75750815b6134c1575f6134cb565b6134cb858261431b565b9695505050505050565b6001546001600160a01b031633148061350657506134f161085a565b6001600160a01b0316336001600160a01b0316145b806135885750613514612a19565b6001600160a01b0316630b52d12d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561354f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357391906140ce565b6001600160a01b0316336001600160a01b0316145b6132055760405162461bcd60e51b8152602060048201526016602482015275504d3a4e4f545f50445f4f525f474f565f4f525f4f4160501b604482015260640161091d565b5f816001600160a01b031663bcead63e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362e91906140ce565b6001600160a01b0381165f9081526009602052604090205490915060ff166134245760405162461bcd60e51b815260206004820152601b60248201527f504d3a474c4d3a494e56414c49445f4c4f414e5f4d414e414745520000000000604482015260640161091d565b5f6136a1612a19565b604051638d16e42b60e01b81523060048201529091505f90620f4240906001600160a01b03841690638d16e42b90602401602060405180830381865afa1580156136ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613711919061407c565b6003546005546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561375b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061377f919061407c565b613789919061432e565b6137939190614345565b90505f6137a08285613ac5565b90505f6137b66137b0838561431b565b87613ac5565b9050811561389d5760055f9054906101000a90046001600160a01b03166001600160a01b0316637378b20683866001600160a01b031663a5a276056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061384291906140ce565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015613886575f80fd5b505af1158015613898573d5f803e3d5ffd5b505050505b801561390857600554600480546040516339bc590360e11b81529182018490526001600160a01b03908116602483015290911690637378b206906044015f604051808303815f87803b1580156138f1575f80fd5b505af1158015613903573d5f803e3d5ffd5b505050505b60408051838152602081018390527f94b781636ba0868cca92a6b4702ed1bb1c01587bf498019c1b1e69737f91deb8910160405180910390a1505050505050565b6040516323396b5360e11b81523060048201525f906001600160a01b03841690634672d6a690602401602060405180830381865afa15801561398d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b1919061407c565b6005546040516370a0823160e01b81526001600160a01b039182166004820152908416906370a0823190602401602060405180830381865afa1580156139f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1d919061407c565b10159392505050565b6040516001600160a01b03808516602483015283166044820152606481018290525f90613a939086906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613cb8565b95945050505050565b5f6134247f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b5f818310613ad35781612e91565b5090919050565b613ae2613d52565b6040821115613b0857613af782840184614364565b6040840152602083015281526110fe565b613b148284018461438d565b6020830152815292915050565b6006545f90606090600160a01b900460ff16613b6357505060408051808201909152600c81526b503a4e4f545f41435449564560a01b60208201525f92909150565b600754613b6e61073d565b613b7890856140bb565b1115613bb25750506040805180820190915260148152730503a4445504f5349545f47545f4c49515f4341560641b60208201525f92909150565b505060408051602081019091525f8152600192909150565b6040516001600160a01b03831660248201525f6044820181905290613bfc90859063095ea7b360e01b90606401613a5c565b613c0757505f612e91565b81613c1457506001612e91565b6040516001600160a01b038416602482015260448101839052612a1190859063095ea7b360e01b90606401613a5c565b5f833b80613c55575f915050612e91565b846001600160a01b03168484604051613c6f9291906143ad565b5f60405180830381855af49150503d805f8114613ca7576040519150601f19603f3d011682016040523d82523d5f602084013e613cac565b606091505b50909695505050505050565b5f6001600160a01b0383163b613ccf57505f6110fe565b6060836001600160a01b031683604051613ce991906143bc565b5f604051808303815f865af19150503d805f8114613d22576040519150601f19603f3d011682016040523d82523d5f602084013e613d27565b606091505b509092509050818015612a11575080511580612a11575080806020019051810190612a11919061410c565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b0381168114613d84575f80fd5b50565b5f8060408385031215613d98575f80fd5b823591506020830135613daa81613d70565b809150509250929050565b5f60208284031215613dc5575f80fd5b8135612e9181613d70565b5f8083601f840112613de0575f80fd5b50813567ffffffffffffffff811115613df7575f80fd5b602083019150836020828501011115613e0e575f80fd5b9250929050565b5f805f60408486031215613e27575f80fd5b83359250602084013567ffffffffffffffff811115613e44575f80fd5b613e5086828701613dd0565b9497909650939450505050565b5f8060408385031215613e6e575f80fd5b8235613e7981613d70565b91506020830135613daa81613d70565b5f8060408385031215613e9a575f80fd5b8235613ea581613d70565b946020939093013593505050565b5f805f60608486031215613ec5575f80fd5b833592506020840135613ed781613d70565b91506040840135613ee781613d70565b809150509250925092565b5f805f60408486031215613f04575f80fd5b8335613f0f81613d70565b9250602084013567ffffffffffffffff811115613e44575f80fd5b5f60208284031215613f3a575f80fd5b5035919050565b5f805f8060608587031215613f54575f80fd5b843593506020850135613f6681613d70565b9250604085013567ffffffffffffffff811115613f81575f80fd5b613f8d87828801613dd0565b95989497509550505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f612a116040830184613f99565b8015158114613d84575f80fd5b5f60208284031215613ffe575f80fd5b8135612e9181613fe1565b5f806040838503121561401a575f80fd5b823561402581613d70565b91506020830135613daa81613fe1565b5f805f8060808587031215614048575f80fd5b8435935060208501359250604085013561406181613d70565b9150606085013561407181613d70565b939692955090935050565b5f6020828403121561408c575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156110fe576110fe6140a7565b5f602082840312156140de575f80fd5b8151612e9181613d70565b60208082526009908201526814134e9313d0d2d15160ba1b604082015260600190565b5f6020828403121561411c575f80fd5b8151612e9181613fe1565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015269504d3a5550475241444560b01b60408201526080606082018190525f906134cb9083018486614127565b6001600160a01b038416815269504d3a5550475241444560b01b60208201526060604082018190525f90613a939083018486614127565b838152604060208201525f613a93604083018486614127565b5f805f606084860312156141f0575f80fd5b83516141fb81613fe1565b602085015160409095015190969495509392505050565b6f53545241544547595f464143544f525960801b81526001600160a01b0391909116602082015260400190565b5f8060408385031215614250575f80fd5b505080516020909101519092909150565b5f81518060208401855e5f93019283525090919050565b5f6142838286614261565b838582375f930192835250909392505050565b604081525f6142a86040830185613f99565b90508260208301529392505050565b6001600160a01b0384811682526060602080840182905285519184018290525f92868201929091906080860190855b818110156143045785518516835294830194918301916001016142e6565b505080945050505050826040830152949350505050565b818103818111156110fe576110fe6140a7565b80820281158282048414176110fe576110fe6140a7565b5f8261435f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f60608486031215614376575f80fd5b505081359360208301359350604090920135919050565b5f806040838503121561439e575f80fd5b50508035926020909101359150565b818382375f9101908152919050565b5f612e91828461426156fea2646970667358221220d84f82e343260ae12ad709fc5e974eabdb95f3f91eb26733c537132d386c712d64736f6c63430008190033","name":"MaplePoolManager","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"contracts/interfaces/IMaplePoolManager.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { IMapleProxied } from \"../../modules/maple-proxy-factory/contracts/interfaces/IMapleProxied.sol\";\n\nimport { IMaplePoolManagerStorage } from \"./IMaplePoolManagerStorage.sol\";\n\ninterface IMaplePoolManager is IMapleProxied, IMaplePoolManagerStorage {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Emitted when a collateral liquidations is finished.\n     *  @param loan_             The address of the loan.\n     *  @param unrealizedLosses_ The amount of unrealized losses.\n     */\n    event CollateralLiquidationFinished(address indexed loan_, uint256 unrealizedLosses_);\n\n    /**\n     *  @dev   Emitted when a collateral liquidations is triggered.\n     *  @param loan_ The address of the loan.\n     */\n    event CollateralLiquidationTriggered(address indexed loan_);\n\n    /**\n     *  @dev   Emitted when cover is deposited.\n     *  @param amount_ The amount of cover deposited.\n     */\n    event CoverDeposited(uint256 amount_);\n\n    /**\n     *  @dev   Emitted when cover is liquidated in the case of a loan defaulting.\n     *  @param toTreasury_ The amount of cover sent to the Treasury.\n     *  @param toPool_     The amount of cover sent to the Pool.\n     */\n    event CoverLiquidated(uint256 toTreasury_, uint256 toPool_);\n\n    /**\n     *  @dev   Emitted when cover is withdrawn.\n     *  @param amount_ The amount of cover withdrawn.\n     */\n    event CoverWithdrawn(uint256 amount_);\n\n    /**\n     *  @dev   Emitted when a new management fee rate is set.\n     *  @param managementFeeRate_ The amount of management fee rate.\n     */\n    event DelegateManagementFeeRateSet(uint256 managementFeeRate_);\n\n    /**\n     *  @dev   Emitted when a strategy is set as valid.\n     *  @param strategy_   The address of the strategy.\n     *  @param isStrategy_ Whether the strategy is valid.\n     */\n    event IsStrategySet(address indexed strategy_, bool isStrategy_);\n\n    /**\n     *  @dev   Emitted when a new liquidity cap is set.\n     *  @param liquidityCap_ The value of liquidity cap.\n     */\n    event LiquidityCapSet(uint256 liquidityCap_);\n\n    /**\n     *  @dev   Emitted when a new strategy is added.\n     *  @param strategy_ The address of the new strategy.\n     */\n    event StrategyAdded(address indexed strategy_);\n\n    /**\n     *  @dev   Emitted when the pending pool delegate accepts the ownership transfer.\n     *  @param previousDelegate_ The address of the previous delegate.\n     *  @param newDelegate_      The address of the new delegate.\n     */\n    event PendingDelegateAccepted(address indexed previousDelegate_, address indexed newDelegate_);\n\n    /**\n     *  @dev   Emitted when the pending pool delegate is set.\n     *  @param previousDelegate_ The address of the previous delegate.\n     *  @param newDelegate_      The address of the new delegate.\n     */\n    event PendingDelegateSet(address indexed previousDelegate_, address indexed newDelegate_);\n\n    /**\n     *  @dev Emitted when the pool configuration is marked as complete.\n     */\n    event PoolConfigurationComplete();\n\n    /**\n     *  @dev   Emitted when the pool permission manager is set.\n     *  @param poolPermissionManager_ The address of the pool permission manager.\n     */\n    event PoolPermissionManagerSet(address indexed poolPermissionManager_);\n\n    /**\n     *  @dev   Emitted when a redemption of shares from the pool is processed.\n     *  @param owner_            The owner of the shares.\n     *  @param redeemableShares_ The amount of redeemable shares.\n     *  @param resultingAssets_  The amount of assets redeemed.\n     */\n    event RedeemProcessed(address indexed owner_, uint256 redeemableShares_, uint256 resultingAssets_);\n\n    /**\n     *  @dev   Emitted when a redemption of shares from the pool is requested.\n     *  @param owner_  The owner of the shares.\n     *  @param shares_ The amount of redeemable shares.\n     */\n    event RedeemRequested(address indexed owner_, uint256 shares_);\n\n    /**\n     *  @dev   Emitted when a pool is sets to be active or inactive.\n     *  @param active_ Whether the pool is active.\n     */\n    event SetAsActive(bool active_);\n\n    /**\n     *  @dev   Emitted when shares are removed from the pool.\n     *  @param owner_  The address of the owner of the shares.\n     *  @param shares_ The amount of shares removed.\n     */\n    event SharesRemoved(address indexed owner_, uint256 shares_);\n\n    /**\n     *  @dev   Emitted when the withdrawal manager is set.\n     *  @param withdrawalManager_ The address of the withdrawal manager.\n     */\n    event WithdrawalManagerSet(address indexed withdrawalManager_);\n\n    /**\n     *  @dev   Emitted when withdrawal of assets from the pool is processed.\n     *  @param owner_            The owner of the assets.\n     *  @param redeemableShares_ The amount of redeemable shares.\n     *  @param resultingAssets_  The amount of assets redeemed.\n     */\n    event WithdrawalProcessed(address indexed owner_, uint256 redeemableShares_, uint256 resultingAssets_);\n\n    /**************************************************************************************************************************************/\n    /*** Ownership Transfer Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev Accepts the role of pool delegate.\n     */\n    function acceptPoolDelegate() external;\n\n    /**\n     *  @dev   Sets an address as the pending pool delegate.\n     *  @param pendingPoolDelegate_ The address of the new pool delegate.\n     */\n    function setPendingPoolDelegate(address pendingPoolDelegate_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Administrative Functions                                                                                                       ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Adds a new strategy.\n     *          NOTE: The PoolManager address is encoded and prepended to the extraDeploymentData.\n     *  @param  strategyFactory_     The address of the strategy factory to use.\n     *  @param  extraDeploymentData_ The data to construct the strategy.\n     *  @return strategy_            The address of the new strategy.\n     */\n    function addStrategy(address strategyFactory_, bytes calldata extraDeploymentData_) external returns (address strategy_);\n\n    /**\n     *  @dev Complete the configuration.\n     */\n    function completeConfiguration() external;\n\n    /**\n     *  @dev   Sets a the pool to be active or inactive.\n     *  @param active_ Whether the pool is active.\n     */\n    function setActive(bool active_) external;\n\n    /**\n     *  @dev   Sets the value for the delegate management fee rate.\n     *  @param delegateManagementFeeRate_ The value for the delegate management fee rate.\n     */\n    function setDelegateManagementFeeRate(uint256 delegateManagementFeeRate_) external;\n\n    /**\n     *  @dev   Sets if the strategy is valid in the isStrategy mapping.\n     *  @param strategy_   The address of the strategy\n     *  @param isStrategy_ Whether the strategy is valid.\n     */\n    function setIsStrategy(address strategy_, bool isStrategy_) external;\n\n    /**\n     *  @dev   Sets the value for liquidity cap.\n     *  @param liquidityCap_ The value for liquidity cap.\n     */\n    function setLiquidityCap(uint256 liquidityCap_) external;\n\n    /**\n     *  @dev   Sets the address of the pool permission manager.\n     *  @param poolPermission_ The address of the pool permission manager.\n     */\n    function setPoolPermissionManager(address poolPermission_) external;\n\n    /**\n     *  @dev   Sets the address of the withdrawal manager.\n     *  @param withdrawalManager_ The address of the withdrawal manager.\n     */\n    function setWithdrawalManager(address withdrawalManager_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Funding Functions                                                                                                              ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Strategy can request funds from the pool via the poolManager.\n     *  @param destination_ The address to send the funds to.\n     *  @param principal_   The principal amount to fund the strategy with.\n     */\n    function requestFunds(address destination_, uint256 principal_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Liquidation Functions                                                                                                          ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Finishes the collateral liquidation\n     *  @param loan_ Loan that had its collateral liquidated.\n     */\n    function finishCollateralLiquidation(address loan_) external;\n\n    /**\n     *  @dev   Triggers the default of a loan.\n     *  @param loan_              Loan to trigger the default.\n     *  @param liquidatorFactory_ Factory used to deploy the liquidator.\n     */\n    function triggerDefault(address loan_, address liquidatorFactory_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Exit Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Processes a redemptions of shares for assets from the pool.\n     *  @param  shares_           The amount of shares to redeem.\n     *  @param  owner_            The address of the owner of the shares.\n     *  @param  sender_           The address of the sender of the redeem call.\n     *  @return redeemableShares_ The amount of shares redeemed.\n     *  @return resultingAssets_  The amount of assets withdrawn.\n     */\n    function processRedeem(uint256 shares_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    /**\n     *  @dev    Processes a redemptions of shares for assets from the pool.\n     *  @param  assets_           The amount of assets to withdraw.\n     *  @param  owner_            The address of the owner of the shares.\n     *  @param  sender_           The address of the sender of the withdraw call.\n     *  @return redeemableShares_ The amount of shares redeemed.\n     *  @return resultingAssets_  The amount of assets withdrawn.\n     */\n    function processWithdraw(uint256 assets_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    /**\n     *  @dev    Requests a redemption of shares from the pool.\n     *  @param  shares_         The amount of shares to redeem.\n     *  @param  owner_          The address of the owner of the shares.\n     *  @return sharesReturned_ The amount of shares withdrawn.\n     */\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n    /**\n     *  @dev   Requests a redemption of shares from the pool.\n     *  @param shares_ The amount of shares to redeem.\n     *  @param owner_  The address of the owner of the shares.\n     *  @param sender_ The address of the sender of the shares.\n     */\n    function requestRedeem(uint256 shares_, address owner_, address sender_) external;\n\n    /**\n     *  @dev   Requests a withdrawal of assets from the pool.\n     *  @param shares_ The amount of shares to redeem.\n     *  @param assets_ The amount of assets to withdraw.\n     *  @param owner_  The address of the owner of the shares.\n     *  @param sender_ The address of the sender of the shares.\n     */\n     function requestWithdraw(uint256 shares_, uint256 assets_, address owner_, address sender_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Cover Functions                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Deposits cover into the pool.\n     *  @param amount_ The amount of cover to deposit.\n     */\n    function depositCover(uint256 amount_) external;\n\n    /**\n     *  @dev   Withdraws cover from the pool.\n     *  @param amount_    The amount of cover to withdraw.\n     *  @param recipient_ The address of the recipient.\n     */\n    function withdrawCover(uint256 amount_, address recipient_) external;\n\n    /**************************************************************************************************************************************/\n    /*** LP Token View Functions                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Returns the amount of exit shares for the input amount.\n     *  @param  amount_  Address of the account.\n     *  @return shares_  Amount of shares able to be exited.\n     */\n    function convertToExitShares(uint256 amount_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Gets the information of escrowed shares.\n     *  @param  owner_        The address of the owner of the shares.\n     *  @param  shares_       The amount of shares to get the information of.\n     *  @return escrowShares_ The amount of escrowed shares.\n     *  @return destination_  The address of the destination.\n     */\n    function getEscrowParams(address owner_, uint256 shares_) external view returns (uint256 escrowShares_, address destination_);\n\n    /**\n     *  @dev   Gets the amount of assets that can be deposited.\n     *  @param receiver_  The address to check the deposit for.\n     *  @param maxAssets_ The maximum amount assets to deposit.\n     */\n    function maxDeposit(address receiver_) external view returns (uint256 maxAssets_);\n\n    /**\n     *  @dev   Gets the amount of shares that can be minted.\n     *  @param receiver_  The address to check the mint for.\n     *  @param maxShares_ The maximum amount shares to mint.\n     */\n    function maxMint(address receiver_) external view returns (uint256 maxShares_);\n\n    /**\n     *  @dev   Gets the amount of shares that can be redeemed.\n     *  @param owner_     The address to check the redemption for.\n     *  @param maxShares_ The maximum amount shares to redeem.\n     */\n    function maxRedeem(address owner_) external view returns (uint256 maxShares_);\n\n    /**\n     *  @dev   Gets the amount of assets that can be withdrawn.\n     *  @param owner_     The address to check the withdraw for.\n     *  @param maxAssets_ The maximum amount assets to withdraw.\n     */\n    function maxWithdraw(address owner_) external view returns (uint256 maxAssets_);\n\n    /**\n     *  @dev    Gets the amount of shares that can be redeemed.\n     *  @param  owner_   The address to check the redemption for.\n     *  @param  shares_  The amount of requested shares to redeem.\n     *  @return assets_  The amount of assets that will be returned for `shares_`.\n     */\n    function previewRedeem(address owner_, uint256 shares_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Gets the amount of assets that can be redeemed.\n     *  @param  owner_   The address to check the redemption for.\n     *  @param  assets_  The amount of requested shares to redeem.\n     *  @return shares_  The amount of assets that will be returned for `assets_`.\n     */\n    function previewWithdraw(address owner_, uint256 assets_) external view returns (uint256 shares_);\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Checks if a scheduled call can be executed.\n     *  @param  functionId_   The function to check.\n     *  @param  caller_       The address of the caller.\n     *  @param  data_         The data of the call.\n     *  @return canCall_      True if the call can be executed, false otherwise.\n     *  @return errorMessage_ The error message if the call cannot be executed.\n     */\n    function canCall(bytes32 functionId_, address caller_, bytes memory data_)\n        external view\n        returns (bool canCall_, string memory errorMessage_);\n\n    /**\n     *  @dev    Gets the address of the globals.\n     *  @return globals_ The address of the globals.\n     */\n    function globals() external view returns (address globals_);\n\n    /**\n     *  @dev    Gets the address of the governor.\n     *  @return governor_ The address of the governor.\n     */\n    function governor() external view returns (address governor_);\n\n    /**\n     *  @dev    Returns if pool has sufficient cover.\n     *  @return hasSufficientCover_ True if pool has sufficient cover.\n     */\n    function hasSufficientCover() external view returns (bool hasSufficientCover_);\n\n    /**\n     *  @dev    Returns the length of the `strategyList`.\n     *  @return strategyListLength_ The length of the `strategyList`.\n     */\n    function strategyListLength() external view returns (uint256 strategyListLength_);\n\n    /**\n     *  @dev    Returns the amount of total assets.\n     *  @return totalAssets_ Amount of of total assets.\n     */\n    function totalAssets() external view returns (uint256 totalAssets_);\n\n    /**\n     *  @dev    Returns the amount unrealized losses.\n     *  @return unrealizedLosses_ Amount of unrealized losses.\n     */\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n"},{"file_path":"contracts/interfaces/IMaplePoolManagerStorage.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\ninterface IMaplePoolManagerStorage {\n\n    /**\n     *  @dev    Returns whether or not a pool is active.\n     *  @return active_ True if the pool is active.\n     */\n    function active() external view returns (bool active_);\n\n    /**\n     *  @dev    Gets the address of the funds asset.\n     *  @return asset_ The address of the funds asset.\n     */\n    function asset() external view returns (address asset_);\n\n    /**\n     *  @dev    Returns whether or not a pool is configured.\n     *  @return configured_ True if the pool is configured.\n     */\n    function configured() external view returns (bool configured_);\n\n    /**\n     *  @dev    Gets the delegate management fee rate.\n     *  @return delegateManagementFeeRate_ The value for the delegate management fee rate.\n     */\n    function delegateManagementFeeRate() external view returns (uint256 delegateManagementFeeRate_);\n\n    /**\n     *  @dev    Returns whether or not the given address is a strategy.\n     *  @param  strategy_   The address of the strategy.\n     *  @return isStrategy_ True if the address is a strategy.\n     */\n    function isStrategy(address strategy_) external view returns (bool isStrategy_);\n\n    /**\n     *  @dev    Gets the liquidity cap for the pool.\n     *  @return liquidityCap_ The liquidity cap for the pool.\n     */\n    function liquidityCap() external view returns (uint256 liquidityCap_);\n\n    /**\n     *  @dev    Gets the address of the strategy in the list.\n     *  @param  index_    The index to get the address of.\n     *  @return strategy_ The address in the list.\n     */\n    function strategyList(uint256 index_) external view returns (address strategy_);\n\n    /**\n     *  @dev    Gets the address of the pending pool delegate.\n     *  @return pendingPoolDelegate_ The address of the pending pool delegate.\n     */\n    function pendingPoolDelegate() external view returns (address pendingPoolDelegate_);\n\n    /**\n     *  @dev    Gets the address of the pool.\n     *  @return pool_ The address of the pool.\n     */\n    function pool() external view returns (address pool_);\n\n    /**\n     *  @dev    Gets the address of the pool delegate.\n     *  @return poolDelegate_ The address of the pool delegate.\n     */\n    function poolDelegate() external view returns (address poolDelegate_);\n\n    /**\n     *  @dev    Gets the address of the pool delegate cover.\n     *  @return poolDelegateCover_ The address of the pool delegate cover.\n     */\n    function poolDelegateCover() external view returns (address poolDelegateCover_);\n\n    /**\n     *  @dev    Gets the address of the pool delegate cover.\n     *  @return poolPermissionManager_ The address of the pool permission manager.\n     */\n    function poolPermissionManager() external view returns (address poolPermissionManager_);\n\n    /**\n     *  @dev    Gets the address of the withdrawal manager.\n     *  @return withdrawalManager_ The address of the withdrawal manager.\n     */\n    function withdrawalManager() external view returns (address withdrawalManager_);\n\n}\n"},{"file_path":"contracts/interfaces/Interfaces.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\ninterface IERC20Like {\n\n    function allowance(address owner_, address spender_) external view returns (uint256 allowance_);\n\n    function balanceOf(address account_) external view returns (uint256 balance_);\n\n    function totalSupply() external view returns (uint256 totalSupply_);\n\n}\n\ninterface IGlobalsLike {\n\n    function bootstrapMint(address asset_) external view returns (uint256 bootstrapMint_);\n\n    function governor() external view returns (address governor_);\n\n    function isFunctionPaused(bytes4 sig_) external view returns (bool isFunctionPaused_);\n\n    function isInstanceOf(bytes32 instanceId_, address instance_) external view returns (bool isInstance_);\n\n    function isPoolAsset(address asset_) external view returns (bool isPoolAsset_);\n\n    function isPoolDelegate(address account_) external view returns (bool isPoolDelegate_);\n\n    function isPoolDeployer(address poolDeployer_) external view returns (bool isPoolDeployer_);\n\n    function isValidScheduledCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_)\n        external view\n        returns (bool isValid_);\n\n    function mapleTreasury() external view returns (address mapleTreasury_);\n\n    function maxCoverLiquidationPercent(address poolManager_) external view returns (uint256 maxCoverLiquidationPercent_);\n\n    function migrationAdmin() external view returns (address migrationAdmin_);\n\n    function minCoverAmount(address poolManager_) external view returns (uint256 minCoverAmount_);\n\n    function operationalAdmin() external view returns (address operationalAdmin_);\n\n    function ownedPoolManager(address poolDelegate_) external view returns (address poolManager_);\n\n    function securityAdmin() external view returns (address securityAdmin_);\n\n    function transferOwnedPoolManager(address fromPoolDelegate_, address toPoolDelegate_) external;\n\n    function unscheduleCall(address caller_, bytes32 functionId_, bytes calldata callData_) external;\n\n}\n\ninterface IStrategyLike {\n\n    function assetsUnderManagement() external view returns (uint256 assetsUnderManagement_);\n\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n\ninterface ILoanManagerLike {\n\n    \n    function finishCollateralLiquidation(address loan_) external returns (uint256 remainingLosses_, uint256 serviceFee_);\n\n    function triggerDefault(address loan_, address liquidatorFactory_)\n        external\n        returns (bool liquidationComplete_, uint256 remainingLosses_, uint256 platformFees_);\n\n}\n\ninterface ILoanLike {\n\n    function lender() external view returns (address lender_);\n\n}\n\ninterface IMapleProxyFactoryLike {\n\n    function isInstance(address instance_) external view returns (bool isInstance_);\n\n    function mapleGlobals() external view returns (address mapleGlobals_);\n\n}\n\ninterface IPoolDelegateCoverLike {\n\n    function moveFunds(uint256 amount_, address recipient_) external;\n\n}\n\ninterface IPoolLike is IERC20Like {\n\n    function convertToExitShares(uint256 assets_) external view returns (uint256 shares_);\n\n    function previewDeposit(uint256 assets_) external view returns (uint256 shares_);\n\n    function previewMint(uint256 shares_) external view returns (uint256 assets_);\n\n}\n\ninterface IPoolManagerLike {\n\n    function addStrategy(address strategyFactory_, bytes calldata deploymentData_) external returns (address strategy_);\n\n    function canCall(bytes32 functionId_, address caller_, bytes memory data_)\n        external view\n        returns (bool canCall_, string memory errorMessage_);\n\n    function completeConfiguration() external;\n\n    function getEscrowParams(address owner_, uint256 shares_) external view returns (uint256 escrowShares_, address escrow_);\n\n    function maxDeposit(address receiver_) external view returns (uint256 maxAssets_);\n\n    function maxMint(address receiver_) external view returns (uint256 maxShares_);\n\n    function maxRedeem(address owner_) external view returns (uint256 maxShares_);\n\n    function maxWithdraw(address owner_) external view returns (uint256 maxAssets_);\n\n    function pool() external view returns (address pool_);\n\n    function poolDelegateCover() external view returns (address poolDelegateCover_);\n\n    function previewRedeem(address owner_, uint256 shares_) external view returns (uint256 assets_);\n\n    function previewWithdraw(address owner_, uint256 assets_) external view returns (uint256 shares_);\n\n    function processRedeem(uint256 shares_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function processWithdraw(uint256 assets_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n    function requestRedeem(uint256 shares_, address owner_, address sender_) external;\n\n    function requestWithdraw(uint256 shares_, uint256 assets_, address owner_, address sender_) external;\n\n    function setDelegateManagementFeeRate(uint256 delegateManagementFeeRate_) external;\n\n    function setLiquidityCap(uint256 liquidityCap_) external;\n\n    function setPoolPermissionManager(address poolPermissionManager_) external;\n\n    function setWithdrawalManager(address withdrawalManager_) external;\n\n    function totalAssets() external view returns (uint256 totalAssets_);\n\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n\ninterface IPoolPermissionManagerLike {\n\n    function hasPermission(address poolManager, address caller, bytes32 functionId) external view returns (bool allowed);\n\n    function hasPermission(address poolManager, address[] calldata caller, bytes32 functionId) external view returns (bool allowed);\n\n}\n\ninterface IWithdrawalManagerLike {\n\n    function addShares(uint256 shares_, address owner_) external;\n\n    function factory() external view returns (address factory_);\n\n    function isInExitWindow(address owner_) external view returns (bool isInExitWindow_);\n\n    function lockedLiquidity() external view returns (uint256 lockedLiquidity_);\n\n    function lockedShares(address owner_) external view returns (uint256 lockedShares_);\n\n    function previewRedeem(address owner_, uint256 shares) external view returns (uint256 redeemableShares, uint256 resultingAssets_);\n\n    function previewWithdraw(address owner_, uint256 assets_) external view returns (uint256 redeemableAssets_, uint256 resultingShares_);\n\n    function processExit(uint256 shares_, address account_) external returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n}\n"},{"file_path":"contracts/proxy/MaplePoolManagerStorage.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.25;\n\nimport { IMaplePoolManagerStorage } from \"../interfaces/IMaplePoolManagerStorage.sol\";\n\nabstract contract MaplePoolManagerStorage is IMaplePoolManagerStorage {\n\n    uint256 internal _locked;  // Used when checking for reentrancy.\n\n    address public override poolDelegate;\n    address public override pendingPoolDelegate;\n\n    address public override asset;\n    address public override pool;\n\n    address public override poolDelegateCover;\n    address public override withdrawalManager;\n\n    bool public override active;\n    bool public override configured;\n    \n    bool __deprecated_openToPublic;\n\n    uint256 public override liquidityCap;\n    uint256 public override delegateManagementFeeRate;\n\n    mapping(address => bool) public override isStrategy;\n\n    mapping(address => bool) __deprecated_isValidLender;\n\n    address[] public override strategyList;\n\n    address public override poolPermissionManager;\n\n}\n"},{"file_path":"modules/erc20-helper/src/ERC20Helper.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\nimport { IERC20Like } from \"./interfaces/IERC20Like.sol\";\n\n/**\n * @title Small Library to standardize erc20 token interactions.\n */\nlibrary ERC20Helper {\n\n    /**************************************************************************************************************************************/\n    /*** Internal Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) {\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transfer.selector, to_, amount_));\n    }\n\n    function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) {\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transferFrom.selector, from_, to_, amount_));\n    }\n\n    function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) {\n        // If setting approval to zero fails, return false.\n        if (!_call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, uint256(0)))) return false;\n\n        // If `amount_` is zero, return true as the previous step already did this.\n        if (amount_ == uint256(0)) return true;\n\n        // Return the result of setting the approval to `amount_`.\n        return _call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, amount_));\n    }\n\n    function _call(address token_, bytes memory data_) private returns (bool success_) {\n        if (token_.code.length == uint256(0)) return false;\n\n        bytes memory returnData;\n        ( success_, returnData ) = token_.call(data_);\n\n        return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));\n    }\n\n}\n"},{"file_path":"modules/erc20-helper/src/interfaces/IERC20Like.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\n/// @title Interface of the ERC20 standard as needed by ERC20Helper.\ninterface IERC20Like {\n\n    function approve(address spender_, uint256 amount_) external returns (bool success_);\n\n    function transfer(address recipient_, uint256 amount_) external returns (bool success_);\n\n    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);\n\n}\n"},{"file_path":"modules/maple-proxy-factory/contracts/MapleProxiedInternals.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\nimport { ProxiedInternals } from \"../modules/proxy-factory/contracts/ProxiedInternals.sol\";\n\n/// @title A Maple implementation that is to be proxied, will need MapleProxiedInternals.\nabstract contract MapleProxiedInternals is ProxiedInternals { }\n"},{"file_path":"modules/maple-proxy-factory/contracts/interfaces/IMapleProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\nimport { IProxied } from \"../../modules/proxy-factory/contracts/interfaces/IProxied.sol\";\n\n/// @title A Maple implementation that is to be proxied, must implement IMapleProxied.\ninterface IMapleProxied is IProxied {\n\n    /**\n     *  @dev   The instance was upgraded.\n     *  @param toVersion_ The new version of the loan.\n     *  @param arguments_ The upgrade arguments, if any.\n     */\n    event Upgraded(uint256 toVersion_, bytes arguments_);\n\n    /**\n     *  @dev   Upgrades a contract implementation to a specific version.\n     *         Access control logic critical since caller can force a selfdestruct via a malicious `migrator_` which is delegatecalled.\n     *  @param toVersion_ The version to upgrade to.\n     *  @param arguments_ Some encoded arguments to use for the upgrade.\n     */\n    function upgrade(uint256 toVersion_, bytes calldata arguments_) external;\n\n}\n"},{"file_path":"modules/maple-proxy-factory/contracts/interfaces/IMapleProxyFactory.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\nimport { IDefaultImplementationBeacon } from \"../../modules/proxy-factory/contracts/interfaces/IDefaultImplementationBeacon.sol\";\n\n/// @title A Maple factory for Proxy contracts that proxy MapleProxied implementations.\ninterface IMapleProxyFactory is IDefaultImplementationBeacon {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   A default version was set.\n     *  @param version_ The default version.\n     */\n    event DefaultVersionSet(uint256 indexed version_);\n\n    /**\n     *  @dev   A version of an implementation, at some address, was registered, with an optional initializer.\n     *  @param version_               The version registered.\n     *  @param implementationAddress_ The address of the implementation.\n     *  @param initializer_           The address of the initializer, if any.\n     */\n    event ImplementationRegistered(uint256 indexed version_, address indexed implementationAddress_, address indexed initializer_);\n\n    /**\n     *  @dev   A proxy contract was deployed with some initialization arguments.\n     *  @param version_                 The version of the implementation being proxied by the deployed proxy contract.\n     *  @param instance_                The address of the proxy contract deployed.\n     *  @param initializationArguments_ The arguments used to initialize the proxy contract, if any.\n     */\n    event InstanceDeployed(uint256 indexed version_, address indexed instance_, bytes initializationArguments_);\n\n    /**\n     *  @dev   A instance has upgraded by proxying to a new implementation, with some migration arguments.\n     *  @param instance_           The address of the proxy contract.\n     *  @param fromVersion_        The initial implementation version being proxied.\n     *  @param toVersion_          The new implementation version being proxied.\n     *  @param migrationArguments_ The arguments used to migrate, if any.\n     */\n    event InstanceUpgraded(address indexed instance_, uint256 indexed fromVersion_, uint256 indexed toVersion_, bytes migrationArguments_);\n\n    /**\n     *  @dev   The MapleGlobals was set.\n     *  @param mapleGlobals_ The address of a Maple Globals contract.\n     */\n    event MapleGlobalsSet(address indexed mapleGlobals_);\n\n    /**\n     *  @dev   An upgrade path was disabled, with an optional migrator contract.\n     *  @param fromVersion_ The starting version of the upgrade path.\n     *  @param toVersion_   The destination version of the upgrade path.\n     */\n    event UpgradePathDisabled(uint256 indexed fromVersion_, uint256 indexed toVersion_);\n\n    /**\n     *  @dev   An upgrade path was enabled, with an optional migrator contract.\n     *  @param fromVersion_ The starting version of the upgrade path.\n     *  @param toVersion_   The destination version of the upgrade path.\n     *  @param migrator_    The address of the migrator, if any.\n     */\n    event UpgradePathEnabled(uint256 indexed fromVersion_, uint256 indexed toVersion_, address indexed migrator_);\n\n    /**************************************************************************************************************************************/\n    /*** State Variables                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev The default version.\n     */\n    function defaultVersion() external view returns (uint256 defaultVersion_);\n\n    /**\n     *  @dev The address of the MapleGlobals contract.\n     */\n    function mapleGlobals() external view returns (address mapleGlobals_);\n\n    /**\n     *  @dev    Whether the upgrade is enabled for a path from a version to another version.\n     *  @param  toVersion_   The initial version.\n     *  @param  fromVersion_ The destination version.\n     *  @return allowed_     Whether the upgrade is enabled.\n     */\n    function upgradeEnabledForPath(uint256 toVersion_, uint256 fromVersion_) external view returns (bool allowed_);\n\n    /**************************************************************************************************************************************/\n    /*** State Changing Functions                                                                                                       ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Deploys a new instance proxying the default implementation version, with some initialization arguments.\n     *          Uses a nonce and `msg.sender` as a salt for the CREATE2 opcode during instantiation to produce deterministic addresses.\n     *  @param  arguments_ The initialization arguments to use for the instance deployment, if any.\n     *  @param  salt_      The salt to use in the contract creation process.\n     *  @return instance_  The address of the deployed proxy contract.\n     */\n    function createInstance(bytes calldata arguments_, bytes32 salt_) external returns (address instance_);\n\n    /**\n     *  @dev   Enables upgrading from a version to a version of an implementation, with an optional migrator.\n     *         Only the Governor can call this function.\n     *  @param fromVersion_ The starting version of the upgrade path.\n     *  @param toVersion_   The destination version of the upgrade path.\n     *  @param migrator_    The address of the migrator, if any.\n     */\n    function enableUpgradePath(uint256 fromVersion_, uint256 toVersion_, address migrator_) external;\n\n    /**\n     *  @dev   Disables upgrading from a version to a version of a implementation.\n     *         Only the Governor can call this function.\n     *  @param fromVersion_ The starting version of the upgrade path.\n     *  @param toVersion_   The destination version of the upgrade path.\n     */\n    function disableUpgradePath(uint256 fromVersion_, uint256 toVersion_) external;\n\n    /**\n     *  @dev   Registers the address of an implementation contract as a version, with an optional initializer.\n     *         Only the Governor can call this function.\n     *  @param version_               The version to register.\n     *  @param implementationAddress_ The address of the implementation.\n     *  @param initializer_           The address of the initializer, if any.\n     */\n    function registerImplementation(uint256 version_, address implementationAddress_, address initializer_) external;\n\n    /**\n     *  @dev   Sets the default version.\n     *         Only the Governor can call this function.\n     *  @param version_ The implementation version to set as the default.\n     */\n    function setDefaultVersion(uint256 version_) external;\n\n    /**\n     *  @dev   Sets the Maple Globals contract.\n     *         Only the Governor can call this function.\n     *  @param mapleGlobals_ The address of a Maple Globals contract.\n     */\n    function setGlobals(address mapleGlobals_) external;\n\n    /**\n     *  @dev   Upgrades the calling proxy contract's implementation, with some migration arguments.\n     *  @param toVersion_ The implementation version to upgrade the proxy contract to.\n     *  @param arguments_ The migration arguments, if any.\n     */\n    function upgradeInstance(uint256 toVersion_, bytes calldata arguments_) external;\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Returns the deterministic address of a potential proxy, given some arguments and salt.\n     *  @param  arguments_       The initialization arguments to be used when deploying the proxy.\n     *  @param  salt_            The salt to be used when deploying the proxy.\n     *  @return instanceAddress_ The deterministic address of a potential proxy.\n     */\n    function getInstanceAddress(bytes calldata arguments_, bytes32 salt_) external view returns (address instanceAddress_);\n\n    /**\n     *  @dev    Returns the address of an implementation version.\n     *  @param  version_        The implementation version.\n     *  @return implementation_ The address of the implementation.\n     */\n    function implementationOf(uint256 version_) external view returns (address implementation_);\n\n    /**\n     *  @dev    Returns if a given address has been deployed by this factory/\n     *  @param  instance_   The address to check.\n     *  @return isInstance_ A boolean indication if the address has been deployed by this factory.\n     */\n    function isInstance(address instance_) external view returns (bool isInstance_);\n\n    /**\n     *  @dev    Returns the address of a migrator contract for a migration path (from version, to version).\n     *          If oldVersion_ == newVersion_, the migrator is an initializer.\n     *  @param  oldVersion_ The old version.\n     *  @param  newVersion_ The new version.\n     *  @return migrator_   The address of a migrator contract.\n     */\n    function migratorForPath(uint256 oldVersion_, uint256 newVersion_) external view returns (address migrator_);\n\n    /**\n     *  @dev    Returns the version of an implementation contract.\n     *  @param  implementation_ The address of an implementation contract.\n     *  @return version_        The version of the implementation contract.\n     */\n    function versionOf(address implementation_) external view returns (uint256 version_);\n\n}\n"},{"file_path":"modules/maple-proxy-factory/modules/proxy-factory/contracts/ProxiedInternals.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\nimport { SlotManipulatable } from \"./SlotManipulatable.sol\";\n\n/// @title An implementation that is to be proxied, will need ProxiedInternals.\nabstract contract ProxiedInternals is SlotManipulatable {\n\n    /// @dev Storage slot with the address of the current factory. `keccak256('eip1967.proxy.factory') - 1`.\n    bytes32 private constant FACTORY_SLOT = bytes32(0x7a45a402e4cb6e08ebc196f20f66d5d30e67285a2a8aa80503fa409e727a4af1);\n\n    /// @dev Storage slot with the address of the current factory. `keccak256('eip1967.proxy.implementation') - 1`.\n    bytes32 private constant IMPLEMENTATION_SLOT = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);\n\n    /// @dev Delegatecalls to a migrator contract to manipulate storage during an initialization or migration.\n    function _migrate(address migrator_, bytes calldata arguments_) internal virtual returns (bool success_) {\n        uint256 size;\n\n        assembly {\n            size := extcodesize(migrator_)\n        }\n\n        if (size == uint256(0)) return false;\n\n        ( success_, ) = migrator_.delegatecall(arguments_);\n    }\n\n    /// @dev Sets the factory address in storage.\n    function _setFactory(address factory_) internal virtual returns (bool success_) {\n        _setSlotValue(FACTORY_SLOT, bytes32(uint256(uint160(factory_))));\n        return true;\n    }\n\n    /// @dev Sets the implementation address in storage.\n    function _setImplementation(address implementation_) internal virtual returns (bool success_) {\n        _setSlotValue(IMPLEMENTATION_SLOT, bytes32(uint256(uint160(implementation_))));\n        return true;\n    }\n\n    /// @dev Returns the factory address.\n    function _factory() internal view virtual returns (address factory_) {\n        return address(uint160(uint256(_getSlotValue(FACTORY_SLOT))));\n    }\n\n    /// @dev Returns the implementation address.\n    function _implementation() internal view virtual returns (address implementation_) {\n        return address(uint160(uint256(_getSlotValue(IMPLEMENTATION_SLOT))));\n    }\n\n}\n"},{"file_path":"modules/maple-proxy-factory/modules/proxy-factory/contracts/SlotManipulatable.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\nabstract contract SlotManipulatable {\n\n    function _getReferenceTypeSlot(bytes32 slot_, bytes32 key_) internal pure returns (bytes32 value_) {\n        return keccak256(abi.encodePacked(key_, slot_));\n    }\n\n    function _getSlotValue(bytes32 slot_) internal view returns (bytes32 value_) {\n        assembly {\n            value_ := sload(slot_)\n        }\n    }\n\n    function _setSlotValue(bytes32 slot_, bytes32 value_) internal {\n        assembly {\n            sstore(slot_, value_)\n        }\n    }\n\n}\n"},{"file_path":"modules/maple-proxy-factory/modules/proxy-factory/contracts/interfaces/IDefaultImplementationBeacon.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\n/// @title An beacon that provides a default implementation for proxies, must implement IDefaultImplementationBeacon.\ninterface IDefaultImplementationBeacon {\n\n    /// @dev The address of an implementation for proxies.\n    function defaultImplementation() external view returns (address defaultImplementation_);\n\n}\n"},{"file_path":"modules/maple-proxy-factory/modules/proxy-factory/contracts/interfaces/IProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\n/// @title An implementation that is to be proxied, must implement IProxied.\ninterface IProxied {\n\n    /**\n     *  @dev The address of the proxy factory.\n     */\n    function factory() external view returns (address factory_);\n\n    /**\n     *  @dev The address of the implementation contract being proxied.\n     */\n    function implementation() external view returns (address implementation_);\n\n    /**\n     *  @dev   Modifies the proxy's implementation address.\n     *  @param newImplementation_ The address of an implementation contract.\n     */\n    function setImplementation(address newImplementation_) external;\n\n    /**\n     *  @dev   Modifies the proxy's storage by delegate-calling a migrator contract with some arguments.\n     *         Access control logic critical since caller can force a selfdestruct via a malicious `migrator_` which is delegatecalled.\n     *  @param migrator_  The address of a migrator contract.\n     *  @param arguments_ Some encoded arguments to use for the migration.\n     */\n    function migrate(address migrator_, bytes calldata arguments_) external;\n\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"loan_","type":"address"},{"indexed":false,"internalType":"uint256","name":"unrealizedLosses_","type":"uint256"}],"name":"CollateralLiquidationFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"loan_","type":"address"}],"name":"CollateralLiquidationTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"CoverDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toTreasury_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toPool_","type":"uint256"}],"name":"CoverLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"CoverWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"managementFeeRate_","type":"uint256"}],"name":"DelegateManagementFeeRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy_","type":"address"},{"indexed":false,"internalType":"bool","name":"isStrategy_","type":"bool"}],"name":"IsStrategySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityCap_","type":"uint256"}],"name":"LiquidityCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDelegate_","type":"address"},{"indexed":true,"internalType":"address","name":"newDelegate_","type":"address"}],"name":"PendingDelegateAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDelegate_","type":"address"},{"indexed":true,"internalType":"address","name":"newDelegate_","type":"address"}],"name":"PendingDelegateSet","type":"event"},{"anonymous":false,"inputs":[],"name":"PoolConfigurationComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolPermissionManager_","type":"address"}],"name":"PoolPermissionManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemableShares_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resultingAssets_","type":"uint256"}],"name":"RedeemProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"RedeemRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"active_","type":"bool"}],"name":"SetAsActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"SharesRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy_","type":"address"}],"name":"StrategyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toVersion_","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"arguments_","type":"bytes"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawalManager_","type":"address"}],"name":"WithdrawalManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemableShares_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resultingAssets_","type":"uint256"}],"name":"WithdrawalProcessed","type":"event"},{"inputs":[],"name":"HUNDRED_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptPoolDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strategyFactory_","type":"address"},{"internalType":"bytes","name":"extraDeploymentData_","type":"bytes"}],"name":"addStrategy","outputs":[{"internalType":"address","name":"strategy_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"address","name":"caller_","type":"address"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"canCall","outputs":[{"internalType":"bool","name":"canCall_","type":"bool"},{"internalType":"string","name":"errorMessage_","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"completeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configured","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"convertToExitShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateManagementFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"depositCover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"factory_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"loan_","type":"address"}],"name":"finishCollateralLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"getEscrowParams","outputs":[{"internalType":"uint256","name":"escrowShares_","type":"uint256"},{"internalType":"address","name":"destination_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"address","name":"globals_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"governor_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSufficientCover","outputs":[{"internalType":"bool","name":"hasSufficientCover_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStrategy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_","type":"address"},{"internalType":"bytes","name":"arguments_","type":"bytes"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingPoolDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolDelegateCover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolPermissionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"sender_","type":"address"}],"name":"processRedeem","outputs":[{"internalType":"uint256","name":"redeemableShares_","type":"uint256"},{"internalType":"uint256","name":"resultingAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"sender_","type":"address"}],"name":"processWithdraw","outputs":[{"internalType":"uint256","name":"redeemableShares_","type":"uint256"},{"internalType":"uint256","name":"resultingAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"name":"removeShares","outputs":[{"internalType":"uint256","name":"sharesReturned_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination_","type":"address"},{"internalType":"uint256","name":"principal_","type":"uint256"}],"name":"requestFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"sender_","type":"address"}],"name":"requestRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"sender_","type":"address"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active_","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delegateManagementFeeRate_","type":"uint256"}],"name":"setDelegateManagementFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation_","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy_","type":"address"},{"internalType":"bool","name":"isStrategy_","type":"bool"}],"name":"setIsStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityCap_","type":"uint256"}],"name":"setLiquidityCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingPoolDelegate_","type":"address"}],"name":"setPendingPoolDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolPermissionManager_","type":"address"}],"name":"setPoolPermissionManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalManager_","type":"address"}],"name":"setWithdrawalManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategyListLength","outputs":[{"internalType":"uint256","name":"strategyListLength_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"loan_","type":"address"},{"internalType":"address","name":"liquidatorFactory_","type":"address"}],"name":"triggerDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrealizedLosses","outputs":[{"internalType":"uint256","name":"unrealizedLosses_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version_","type":"uint256"},{"internalType":"bytes","name":"arguments_","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"address","name":"recipient_","type":"address"}],"name":"withdrawCover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}