ETH Price: $2,469.38 (+1.00%)

Contract

0xd8E5EfE8DDbe78C8B08bdd70A6dc668F54a6C01c
 

Overview

ETH Balance

1.0313 ETH

Eth Value

$2,546.67 (@ $2,469.38/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Decrease137038102021-11-28 17:53:421049 days ago1638122022IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.02863431124.05583111
Decrease134296452021-10-16 14:46:051092 days ago1634395565IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0091102363.42320026
Reduced Coinage134296362021-10-16 14:44:371092 days ago1634395477IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0115323464.37937801
Decrease133073832021-09-27 10:58:021111 days ago1632740282IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0090480746.05368346
Reduced Coinage133073732021-09-27 10:56:001111 days ago1632740160IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.00950744.24309591
Decrease131454912021-09-02 9:35:521136 days ago1630575352IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0142651374.98176966
Reduced Coinage131453542021-09-02 9:05:131136 days ago1630573513IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0161052987.58256407
Decrease131452752021-09-02 8:45:191136 days ago1630572319IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0147561784.48223547
Reduced Coinage131452662021-09-02 8:43:071136 days ago1630572187IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0183434187.28017096
Decrease130356192021-08-16 10:06:191153 days ago1629108379IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0072075737.58523435
Reduced Coinage130355962021-08-16 10:01:561153 days ago1629108116IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0074759735.57360217
Decrease130091832021-08-12 8:07:561158 days ago1628755676IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0059677943
Reduced Coinage130091802021-08-12 8:07:181158 days ago1628755638IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0086381747
Decrease130091502021-08-12 8:00:561158 days ago1628755256IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0078588945
Reduced Coinage130091482021-08-12 8:00:431158 days ago1628755243IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0098965345
Decrease130085602021-08-12 5:45:421158 days ago1628747142IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0111289145.61122993
Reduced Coinage130085252021-08-12 5:37:231158 days ago1628746643IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0129757258.70917188
Set Flag130084552021-08-12 5:22:541158 days ago1628745774IN
0xd8E5EfE8...F54a6C01c
0 ETH0.0022213948.4597618
Set Flag129501552021-08-03 4:13:341167 days ago1627964014IN
0xd8E5EfE8...F54a6C01c
0 ETH0.0005458338
Coin129434922021-08-02 3:05:371168 days ago1627873537IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0060318428
Coin129244992021-07-30 2:54:231171 days ago1627613663IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0118399534
Coin129244892021-07-30 2:52:431171 days ago1627613563IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0121827439
Coin129214152021-07-29 15:12:441171 days ago1627571564IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0090451836
Coin129211992021-07-29 14:23:491171 days ago1627568629IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0077543636
Coin129210332021-07-29 13:41:111171 days ago1627566071IN
0xd8E5EfE8...F54a6C01c
0.01 ETH0.0078091525
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
137038102021-11-28 17:53:421049 days ago1638122022
0xd8E5EfE8...F54a6C01c
0.01 ETH
134296452021-10-16 14:46:051092 days ago1634395565
0xd8E5EfE8...F54a6C01c
0.01 ETH
134296362021-10-16 14:44:371092 days ago1634395477
0xd8E5EfE8...F54a6C01c
0.01 ETH
133073832021-09-27 10:58:021111 days ago1632740282
0xd8E5EfE8...F54a6C01c
0.01 ETH
133073732021-09-27 10:56:001111 days ago1632740160
0xd8E5EfE8...F54a6C01c
0.01 ETH
131454912021-09-02 9:35:521136 days ago1630575352
0xd8E5EfE8...F54a6C01c
0.01 ETH
131453542021-09-02 9:05:131136 days ago1630573513
0xd8E5EfE8...F54a6C01c
0.01 ETH
131452752021-09-02 8:45:191136 days ago1630572319
0xd8E5EfE8...F54a6C01c
0.01 ETH
131452662021-09-02 8:43:071136 days ago1630572187
0xd8E5EfE8...F54a6C01c
0.01 ETH
130356192021-08-16 10:06:191153 days ago1629108379
0xd8E5EfE8...F54a6C01c
0.01 ETH
130355962021-08-16 10:01:561153 days ago1629108116
0xd8E5EfE8...F54a6C01c
0.01 ETH
130091832021-08-12 8:07:561158 days ago1628755676
0xd8E5EfE8...F54a6C01c
0.01 ETH
130091802021-08-12 8:07:181158 days ago1628755638
0xd8E5EfE8...F54a6C01c
0.01 ETH
130091502021-08-12 8:00:561158 days ago1628755256
0xd8E5EfE8...F54a6C01c
0.01 ETH
130091482021-08-12 8:00:431158 days ago1628755243
0xd8E5EfE8...F54a6C01c
0.01 ETH
130085602021-08-12 5:45:421158 days ago1628747142
0xd8E5EfE8...F54a6C01c
0.01 ETH
130085252021-08-12 5:37:231158 days ago1628746643
0xd8E5EfE8...F54a6C01c
0.01 ETH
129434922021-08-02 3:05:371168 days ago1627873537
0xd8E5EfE8...F54a6C01c
0.01 ETH
129244992021-07-30 2:54:231171 days ago1627613663
0xd8E5EfE8...F54a6C01c
0.01 ETH
129244892021-07-30 2:52:431171 days ago1627613563
0xd8E5EfE8...F54a6C01c
0.01 ETH
129214152021-07-29 15:12:441171 days ago1627571564
0xd8E5EfE8...F54a6C01c
0.01 ETH
129211992021-07-29 14:23:491171 days ago1627568629
0xd8E5EfE8...F54a6C01c
0.01 ETH
129210332021-07-29 13:41:111171 days ago1627566071
0xd8E5EfE8...F54a6C01c
0.01 ETH
127213392021-06-28 8:00:411203 days ago1624867241
0xd8E5EfE8...F54a6C01c
0.01 ETH
126896662021-06-23 9:46:321207 days ago1624441592
0xd8E5EfE8...F54a6C01c
0.01 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MortgagePool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-07
*/

// File: lib/ReentrancyGuard.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () public {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: iface/IPriceController.sol

pragma solidity ^0.6.12;

interface IPriceController {
    function getPriceForPToken(address token, address uToken, address payback) external payable returns (uint256 tokenPrice, uint256 pTokenPrice);
}
// File: iface/IInsurancePool.sol

pragma solidity ^0.6.12;

interface IInsurancePool {
    function setPTokenToIns(address pToken, address ins) external;
    function destroyPToken(address pToken, uint256 amount, address token) external;
    function eliminate(address pToken, address token) external;
    function setLatestTime(address token) external;
}
// File: iface/IERC20.sol

pragma solidity ^0.6.12;

interface IERC20 {
	function decimals() external view returns (uint8);
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: lib/Address.sol

pragma solidity 0.6.12;

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{value:amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}
// File: lib/SafeERC20.sol

pragma solidity 0.6.12;

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(ERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(ERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(ERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface ERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: lib/TransferHelper.sol

pragma solidity ^0.6.12;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}
// File: iface/IPTokenFactory.sol

pragma solidity ^0.6.12;

interface IPTokenFactory {
    function getGovernance() external view returns(address);
    function getPTokenOperator(address contractAddress) external view returns(bool);
    function getPTokenAuthenticity(address pToken) external view returns(bool);
}
// File: iface/IParasset.sol

pragma solidity ^0.6.12;

interface IParasset {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function destroy(uint256 amount, address account) external;
    function issuance(uint256 amount, address account) external;
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: lib/SafeMath.sol

pragma solidity ^0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }

    function div(uint x, uint y) internal pure returns (uint z) {
        require(y > 0, "ds-math-div-zero");
        z = x / y;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    }
}
// File: PToken.sol

pragma solidity ^0.6.12;

contract PToken is IParasset {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowed;
    uint256 public _totalSupply = 0;                                        
    string public name = "";
    string public symbol = "";
    uint8 public decimals = 18;

    IPTokenFactory pTokenFactory;

    constructor (string memory _name, 
                 string memory _symbol) public {
    	name = _name;                                                               
    	symbol = _symbol;
    	pTokenFactory = IPTokenFactory(address(msg.sender));
    }

    //---------modifier---------

    modifier onlyGovernance() {
        require(address(msg.sender) == pTokenFactory.getGovernance(), "Log:PToken:!governance");
        _;
    }

    modifier onlyPool() {
    	require(pTokenFactory.getPTokenOperator(address(msg.sender)), "Log:PToken:!Pool");
    	_;
    }

    //---------view---------

    // Query factory contract address
    function getPTokenFactory() public view returns(address) {
        return address(pTokenFactory);
    }

    /// @notice The view of totalSupply
    /// @return The total supply of ntoken
    function totalSupply() override public view returns (uint256) {
        return _totalSupply;
    }

    /// @dev The view of balances
    /// @param owner The address of an account
    /// @return The balance of the account
    function balanceOf(address owner) override public view returns (uint256) {
        return _balances[owner];
    }

    function allowance(address owner, address spender) override public view returns (uint256) {
        return _allowed[owner][spender];
    }

    //---------transaction---------

    function changeFactory(address factory) public onlyGovernance {
        pTokenFactory = IPTokenFactory(address(factory));
    }

    function rename(string memory _name, 
                    string memory _symbol) public onlyGovernance {
        name = _name;                                                               
        symbol = _symbol;
    }

    function transfer(address to, uint256 value) override public returns (bool) 
    {
        _transfer(msg.sender, to, value);
        return true;
    }

    function approve(address spender, uint256 value) override public returns (bool) 
    {
        require(spender != address(0));
        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) override public returns (bool) 
    {
        _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) 
    {
        require(spender != address(0));

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) 
    {
        require(spender != address(0));

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue);
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

    function destroy(uint256 amount, address account) override external onlyPool{
    	require(_balances[account] >= amount, "Log:PToken:!destroy");
    	_balances[account] = _balances[account].sub(amount);
    	_totalSupply = _totalSupply.sub(amount);
    	emit Transfer(account, address(0x0), amount);
    }

    function issuance(uint256 amount, address account) override external onlyPool{
    	_balances[account] = _balances[account].add(amount);
    	_totalSupply = _totalSupply.add(amount);
    	emit Transfer(address(0x0), account, amount);
    }
}
// File: MortgagePool.sol

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

contract MortgagePool is ReentrancyGuard {
	using SafeMath for uint256;
	using SafeERC20 for ERC20;

    // Governance address
	address public governance;
	// Underlying asset address => PToken address
	mapping(address=>address) public underlyingToPToken;
	// PToken address => Underlying asset address
	mapping(address=>address) public pTokenToUnderlying;
    // PToken address => Mortgage asset address => Bool
	mapping(address=>mapping(address=>bool)) mortgageAllow;
    // PToken address => Mortgage asset address => User address => Debt data
	mapping(address=>mapping(address=>mapping(address=>PersonalLedger))) ledger;
    // PToken address => Mortgage asset address => Users who have created debt positions(address)
    mapping(address=>mapping(address=>address[])) ledgerArray;
    // Mortgage asset address => Maximum mortgage rate
    mapping(address=>uint256) maxRate;
    // Mortgage asset address => Liquidation line
    mapping(address=>uint256) liquidationLine;
    // PriceController contract
    IPriceController quary;
    // Insurance pool contract
    IInsurancePool insurancePool;
    // PToken creation factory contract
    IPTokenFactory pTokenFactory;
	// Market base interest rate
	uint256 r0 = 0.025 ether;
	// Amount of blocks produced in a year
	uint256 oneYear = 2400000;
    // Status
    uint8 public flag;      // = 0: pause
                            // = 1: active
                            // = 2: out only

	struct PersonalLedger {
        uint256 mortgageAssets;         // Amount of mortgaged assets
        uint256 parassetAssets;         // Amount of debt(Ptoken,Stability fee not included)
        uint256 blockHeight;            // The block height of the last operation
        uint256 rate;                   // Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation)
        bool created;                   // Is it created
    }

    event FeeValue(address pToken, uint256 value);

    /// @dev Initialization method
    /// @param factoryAddress PToken creation factory contract
	constructor (address factoryAddress) public {
        pTokenFactory = IPTokenFactory(factoryAddress);
        governance = pTokenFactory.getGovernance();
        flag = 0;
    }

    //---------modifier---------

    modifier onlyGovernance() {
        require(msg.sender == governance, "Log:MortgagePool:!gov");
        _;
    }

    modifier whenActive() {
        require(flag == 1, "Log:MortgagePool:!active");
        _;
    }

    modifier outOnly() {
        require(flag != 0, "Log:MortgagePool:!0");
        _;
    }

    //---------view---------

    /// @dev Calculate the stability fee
    /// @param parassetAssets Amount of debt(Ptoken,Stability fee not included)
    /// @param blockHeight The block height of the last operation
    /// @param rate Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation)
    /// @param nowRate Current mortgage rate (not including stability fee)
    /// @return fee
    function getFee(uint256 parassetAssets, 
    	            uint256 blockHeight,
    	            uint256 rate,
                    uint256 nowRate) public view returns(uint256) {
        uint256 topOne = parassetAssets.mul(r0).mul(block.number.sub(blockHeight));
        uint256 ratePlus = rate.add(nowRate);
        uint256 topTwo = parassetAssets.mul(r0).mul(block.number.sub(blockHeight)).mul(uint256(3).mul(ratePlus));
    	uint256 bottom = oneYear.mul(1 ether);
    	return topOne.div(bottom).add(topTwo.div(bottom.mul(1 ether).mul(2)));
    }

    /// @dev Calculate the mortgage rate
    /// @param mortgageAssets Amount of mortgaged assets
    /// @param parassetAssets Amount of debt
    /// @param tokenPrice Mortgage asset price(1 ETH = ? token)
    /// @param pTokenPrice PToken price(1 ETH = ? pToken)
    /// @return mortgage rate
    function getMortgageRate(uint256 mortgageAssets,
    	                     uint256 parassetAssets, 
    	                     uint256 tokenPrice, 
    	                     uint256 pTokenPrice) public pure returns(uint256) {
        if (mortgageAssets == 0 || pTokenPrice == 0) {
            return 0;
        }
    	return parassetAssets.mul(tokenPrice).mul(1 ether).div(pTokenPrice.mul(mortgageAssets));
    }

    /// @dev Get real-time data of the current debt warehouse
    /// @param mortgageToken Mortgage asset address
    /// @param pToken PToken address
    /// @param tokenPrice Mortgage asset price(1 ETH = ? token)
    /// @param uTokenPrice Underlying asset price(1 ETH = ? Underlying asset)
    /// @param maxRateNum Maximum mortgage rate
    /// @param owner Debt owner
    /// @return fee Stability fee
    /// @return mortgageRate Real-time mortgage rate(Including stability fee)
    /// @return maxSubM The maximum amount of mortgage assets can be reduced
    /// @return maxAddP Maximum number of coins that can be added
    function getInfoRealTime(address mortgageToken, 
                             address pToken, 
                             uint256 tokenPrice, 
                             uint256 uTokenPrice,
                             uint256 maxRateNum,
                             uint256 owner) public view returns(uint256 fee, 
                                                                uint256 mortgageRate, 
                                                                uint256 maxSubM, 
                                                                uint256 maxAddP) {
        PersonalLedger memory pLedger = ledger[pToken][mortgageToken][address(owner)];
        if (pLedger.mortgageAssets == 0 && pLedger.parassetAssets == 0) {
            return (0,0,0,0);
        }
        uint256 pTokenPrice = getDecimalConversion(pTokenToUnderlying[pToken], uTokenPrice, pToken);
        uint256 tokenPriceAmount = tokenPrice;
        fee = getFee(pLedger.parassetAssets, pLedger.blockHeight, pLedger.rate, getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets, tokenPriceAmount, pTokenPrice));
        mortgageRate = getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets.add(fee), tokenPriceAmount, pTokenPrice);
        uint256 maxRateEther = maxRateNum.mul(0.01 ether);
        if (mortgageRate >= maxRateEther) {
            maxSubM = 0;
            maxAddP = 0;
        } else {
            maxSubM = pLedger.mortgageAssets.sub(pLedger.parassetAssets.mul(tokenPriceAmount).mul(1 ether).div(maxRateEther.mul(pTokenPrice)));
            maxAddP = pLedger.mortgageAssets.mul(pTokenPrice).mul(maxRateEther).div(uint256(1 ether).mul(tokenPriceAmount)).sub(pLedger.parassetAssets);
        }
    }
    
    /// @dev Uniform accuracy
    /// @param inputToken Initial token
    /// @param inputTokenAmount Amount of token
    /// @param outputToken Converted token
    /// @return stability Amount of outputToken
    function getDecimalConversion(address inputToken, 
    	                          uint256 inputTokenAmount, 
    	                          address outputToken) public view returns(uint256) {
    	uint256 inputTokenDec = 18;
    	uint256 outputTokenDec = 18;
    	if (inputToken != address(0x0)) {
    		inputTokenDec = IERC20(inputToken).decimals();
    	}

    	if (outputToken != address(0x0)) {
    		outputTokenDec = IERC20(outputToken).decimals();
    	}
    	return inputTokenAmount.mul(10**outputTokenDec).div(10**inputTokenDec);
    }

    /// @dev View debt warehouse data
    /// @param pToken pToken address
    /// @param mortgageToken mortgage asset address
    /// @param owner debt owner
    /// @return mortgageAssets amount of mortgaged assets
    /// @return parassetAssets amount of debt(Ptoken,Stability fee not included)
    /// @return blockHeight the block height of the last operation
    /// @return rate Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation)
    /// @return created is it created
    function getLedger(address pToken, 
    	               address mortgageToken,
                       address owner) public view returns(uint256 mortgageAssets, 
    		                                              uint256 parassetAssets, 
    		                                              uint256 blockHeight,
                                                          uint256 rate,
                                                          bool created) {
    	PersonalLedger memory pLedger = ledger[pToken][mortgageToken][address(owner)];
    	return (pLedger.mortgageAssets, pLedger.parassetAssets, pLedger.blockHeight, pLedger.rate, pLedger.created);
    }

    /// @dev View governance address
    /// @return governance address
    function getGovernance() external view returns(address) {
        return governance;
    }

    /// @dev View insurance pool address
    /// @return insurance pool address
    function getInsurancePool() external view returns(address) {
        return address(insurancePool);
    }

    /// @dev View the market base interest rate
    /// @return market base interest rate
    function getR0() external view returns(uint256) {
    	return r0;
    }

    /// @dev View the amount of blocks produced in a year
    /// @return amount of blocks produced in a year
    function getOneYear() external view returns(uint256) {
    	return oneYear;
    }

    /// @dev View the maximum mortgage rate
    /// @param mortgageToken Mortgage asset address
    /// @return maximum mortgage rate
    function getMaxRate(address mortgageToken) external view returns(uint256) {
    	return maxRate[mortgageToken];
    }

    /// @dev View the liquidation line
    /// @param mortgageToken Mortgage asset address
    /// @return liquidation line
    function getLiquidationLine(address mortgageToken) external view returns(uint256) {
        return liquidationLine[mortgageToken];
    }

    /// @dev View the priceController contract address
    /// @return priceController contract address
    function getPriceController() external view returns(address) {
        return address(quary);
    }

    /// @dev View the ptoken address according to the underlying asset
    /// @param uToken Underlying asset address
    /// @return ptoken address
    function getUnderlyingToPToken(address uToken) external view returns(address) {
        return underlyingToPToken[uToken];
    }

    /// @dev View the underlying asset according to the ptoken address
    /// @param pToken ptoken address
    /// @return underlying asset
    function getPTokenToUnderlying(address pToken) external view returns(address) {
        return pTokenToUnderlying[pToken];
    }

    /// @dev View the debt array length
    /// @param pToken ptoken address
    /// @param mortgageToken mortgage asset address
    /// @return debt array length
    function getLedgerArrayNum(address pToken, 
                               address mortgageToken) external view returns(uint256) {
        return ledgerArray[pToken][mortgageToken].length;
    }

    /// @dev View the debt owner
    /// @param pToken ptoken address
    /// @param mortgageToken mortgage asset address
    /// @param index array subscript
    /// @return debt owner
    function getLedgerAddress(address pToken, 
                              address mortgageToken, 
                              uint256 index) external view returns(address) {
        return ledgerArray[pToken][mortgageToken][index];
    }

    //---------governance----------

    /// @dev Set contract status
    /// @param num 0: pause, 1: active, 2: out only
    function setFlag(uint8 num) public onlyGovernance {
        flag = num;
    }

    /// @dev Allow asset mortgage to generate ptoken
    /// @param pToken ptoken address
    /// @param mortgageToken mortgage asset address
    /// @param allow allow mortgage
    function setMortgageAllow(address pToken, 
    	                      address mortgageToken, 
    	                      bool allow) public onlyGovernance {
    	mortgageAllow[pToken][mortgageToken] = allow;
    }

    /// @dev Set insurance pool contract
    /// @param add insurance pool contract
    function setInsurancePool(address add) public onlyGovernance {
        insurancePool = IInsurancePool(add);
    }

    /// @dev Set market base interest rate
    /// @param num market base interest rate(num = ? * 1 ether)
    function setR0(uint256 num) public onlyGovernance {
    	r0 = num;
    }

    /// @dev Set the amount of blocks produced in a year
    /// @param num amount of blocks produced in a year
    function setOneYear(uint256 num) public onlyGovernance {
    	oneYear = num;
    }

    /// @dev Set liquidation line
    /// @param mortgageToken mortgage asset address
    /// @param num liquidation line(num = ? * 100)
    function setLiquidationLine(address mortgageToken, 
                                uint256 num) public onlyGovernance {
        liquidationLine[mortgageToken] = num.mul(0.01 ether);
    }

    /// @dev Set the maximum mortgage rate
    /// @param mortgageToken mortgage asset address
    /// @param num maximum mortgage rate(num = ? * 100)
    function setMaxRate(address mortgageToken, 
                        uint256 num) public onlyGovernance {
    	maxRate[mortgageToken] = num.mul(0.01 ether);
    }

    /// @dev Set priceController contract address
    /// @param add priceController contract address
    function setPriceController(address add) public onlyGovernance {
        quary = IPriceController(add);
    }

    /// @dev Set the underlying asset and ptoken mapping and
    ///      Set the latest redemption time of ptoken insurance
    /// @param uToken underlying asset address
    /// @param pToken ptoken address
    function setInfo(address uToken, 
                     address pToken) public onlyGovernance {
        require(underlyingToPToken[uToken] == address(0x0), "Log:MortgagePool:underlyingToPToken");
        require(address(insurancePool) != address(0x0), "Log:MortgagePool:0x0");
        underlyingToPToken[uToken] = address(pToken);
        pTokenToUnderlying[address(pToken)] = uToken;
        insurancePool.setLatestTime(uToken);
    }

    //---------transaction---------

    /// @dev Set governance address
    function setGovernance() public {
        governance = pTokenFactory.getGovernance();
        require(governance != address(0x0), "Log:MortgagePool:0x0");
    }

    /// @dev Mortgage asset casting ptoken
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param amount amount of mortgaged assets
    /// @param rate custom mortgage rate
    function coin(address mortgageToken, 
                  address pToken, 
                  uint256 amount, 
                  uint256 rate) public payable whenActive nonReentrant {

    	require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
        require(rate > 0 && rate <= maxRate[mortgageToken], "Log:MortgagePool:rate!=0");
        require(amount > 0, "Log:MortgagePool:amount!=0");
    	PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)];
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;

    	// Get the price and transfer to the mortgage token
        uint256 tokenPrice;
        uint256 pTokenPrice;
        if (mortgageToken != address(0x0)) {
            ERC20(mortgageToken).safeTransferFrom(address(msg.sender), address(this), amount);
            (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value);
        } else {
            require(msg.value >= amount, "Log:MortgagePool:!msg.value");
            (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], uint256(msg.value).sub(amount));
        }

        // Calculate the stability fee
        uint256 blockHeight = pLedger.blockHeight;
        uint256 fee = 0;
    	if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) {
            fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice));
            // The stability fee is transferred to the insurance pool
            ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee);
            // Eliminate negative accounts
            insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]);
            emit FeeValue(pToken, fee);
    	}

        // Additional ptoken issuance
        uint256 pTokenAmount = amount.mul(pTokenPrice).mul(rate).div(tokenPrice.mul(100));
        PToken(pToken).issuance(pTokenAmount, address(msg.sender));

        // Update debt information
        pLedger.mortgageAssets = mortgageAssets.add(amount);
        pLedger.parassetAssets = parassetAssets.add(pTokenAmount);
        pLedger.blockHeight = block.number;
        pLedger.rate = getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice);

        // Tag created
        if (pLedger.created == false) {
            ledgerArray[pToken][mortgageToken].push(address(msg.sender));
            pLedger.created = true;
        }
    }
    
    /// @dev Increase mortgage assets
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param amount amount of mortgaged assets
    function supplement(address mortgageToken, 
                        address pToken, 
                        uint256 amount) public payable outOnly nonReentrant {

    	require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
        require(amount > 0, "Log:MortgagePool:!amount");
    	PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)];
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        require(pLedger.created, "Log:MortgagePool:!created");

    	// Get the price and transfer to the mortgage token
        uint256 tokenPrice;
        uint256 pTokenPrice;
        if (mortgageToken != address(0x0)) {
            ERC20(mortgageToken).safeTransferFrom(address(msg.sender), address(this), amount);
            (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value);
        } else {
            require(msg.value >= amount, "Log:MortgagePool:!msg.value");
            (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], uint256(msg.value).sub(amount));
        }

        // Calculate the stability fee
        uint256 blockHeight = pLedger.blockHeight;
        uint256 fee = 0;
    	if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) {
            fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice));
            // The stability fee is transferred to the insurance pool
            ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee);
            // Eliminate negative accounts
            insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]);
            emit FeeValue(pToken, fee);
    	}

        // Update debt information
    	pLedger.mortgageAssets = mortgageAssets.add(amount);
    	pLedger.blockHeight = block.number;
        pLedger.rate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice);
    }

    /// @dev Reduce mortgage assets
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param amount amount of mortgaged assets
    function decrease(address mortgageToken, 
                      address pToken, 
                      uint256 amount) public payable outOnly nonReentrant {

    	require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
    	PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)];
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        require(amount > 0 && amount <= mortgageAssets, "Log:MortgagePool:!amount");
        require(pLedger.created, "Log:MortgagePool:!created");

    	// Get the price
        (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value);

        // Calculate the stability fee
        uint256 blockHeight = pLedger.blockHeight;
        uint256 fee = 0;
    	if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) {
            fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice));
            // The stability fee is transferred to the insurance pool
            ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee);
            // Eliminate negative accounts
            insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]);
            emit FeeValue(pToken, fee);
    	}

        // Update debt information
    	pLedger.mortgageAssets = mortgageAssets.sub(amount);
    	pLedger.blockHeight = block.number;
        pLedger.rate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice);

        // The debt warehouse mortgage rate cannot be greater than the maximum mortgage rate
    	require(pLedger.rate <= maxRate[mortgageToken], "Log:MortgagePool:!maxRate");

    	// Transfer out mortgage assets
    	if (mortgageToken != address(0x0)) {
    		ERC20(mortgageToken).safeTransfer(address(msg.sender), amount);
    	} else {
            TransferHelper.safeTransferETH(address(msg.sender), amount);
    	}
    }

    /// @dev Increase debt (increase coinage)
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param amount amount of debt
    function increaseCoinage(address mortgageToken,
                             address pToken,
                             uint256 amount) public payable whenActive nonReentrant {

        require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
        require(amount > 0, "Log:MortgagePool:!amount");
        PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)];
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        require(pLedger.created, "Log:MortgagePool:!created");

        // Get the price
        (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value);

        // Calculate the stability fee
        uint256 blockHeight = pLedger.blockHeight;
        uint256 fee = 0;
        if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) {
            fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice));
            // The stability fee is transferred to the insurance pool
            ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee);
            // Eliminate negative accounts
            insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]);
            emit FeeValue(pToken, fee);
        }

        // Update debt information
        pLedger.parassetAssets = parassetAssets.add(amount);
        pLedger.blockHeight = block.number;
        pLedger.rate = getMortgageRate(mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice);

        // The debt warehouse mortgage rate cannot be greater than the maximum mortgage rate
        require(pLedger.rate <= maxRate[mortgageToken], "Log:MortgagePool:!maxRate");

        // Additional ptoken issuance
        PToken(pToken).issuance(amount, address(msg.sender));
    }

    /// @dev Reduce debt (increase coinage)
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param amount amount of debt
    function reducedCoinage(address mortgageToken,
                            address pToken,
                            uint256 amount) public payable outOnly nonReentrant {

        require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
        PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)];
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        address uToken = pTokenToUnderlying[pToken];
        require(amount > 0 && amount <= parassetAssets, "Log:MortgagePool:!amount");
        require(pLedger.created, "Log:MortgagePool:!created");

        // Get the price
        (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, uToken, msg.value);

        // Calculate the stability fee
        uint256 blockHeight = pLedger.blockHeight;
        uint256 fee = 0;
        if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) {
            fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice));
            // The stability fee is transferred to the insurance pool
            ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), amount.add(fee));
            // Eliminate negative accounts
            insurancePool.eliminate(pToken, uToken);
            emit FeeValue(pToken, fee);
        }

        // Update debt information
        pLedger.parassetAssets = parassetAssets.sub(amount);
        pLedger.blockHeight = block.number;
        pLedger.rate = getMortgageRate(mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice);

        // Destroy ptoken
        insurancePool.destroyPToken(pToken, amount, uToken);
    }

    /// @dev Liquidation of debt
    /// @param mortgageToken mortgage asset address
    /// @param pToken ptoken address
    /// @param account debt owner address
    /// @param amount amount of mortgaged assets
    function liquidation(address mortgageToken, 
                         address pToken,
                         address account,
                         uint256 amount) public payable outOnly nonReentrant {

    	require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow");
    	PersonalLedger storage pLedger = ledger[pToken][mortgageToken][account];
        require(pLedger.created, "Log:MortgagePool:!created");
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        require(amount > 0 && amount <= mortgageAssets, "Log:MortgagePool:!amount");

    	// Get the price
        address uToken = pTokenToUnderlying[pToken];
    	(uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, uToken, msg.value);
        
        // Judging the liquidation line
        checkLine(pLedger, tokenPrice, pTokenPrice, mortgageToken);

        // Calculate the amount of ptoken
        uint256 pTokenAmount = amount.mul(pTokenPrice).mul(90).div(tokenPrice.mul(100));
    	// Transfer to ptoken
    	ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), pTokenAmount);

    	// Eliminate negative accounts
        insurancePool.eliminate(pToken, uToken);

        // Calculate the debt for destruction
        uint256 offset = parassetAssets.mul(amount).div(mortgageAssets);

        // Destroy ptoken
    	insurancePool.destroyPToken(pToken, offset, uToken);

    	// Update debt information
    	pLedger.mortgageAssets = mortgageAssets.sub(amount);
        pLedger.parassetAssets = parassetAssets.sub(offset);
        // MortgageAssets liquidation, mortgage rate and block number are not updated
        if (pLedger.mortgageAssets == 0) {
            pLedger.parassetAssets = 0;
            pLedger.blockHeight = 0;
            pLedger.rate = 0;
        }

    	// Transfer out mortgage asset
    	if (mortgageToken != address(0x0)) {
    		ERC20(mortgageToken).safeTransfer(address(msg.sender), amount);
    	} else {
            TransferHelper.safeTransferETH(address(msg.sender), amount);
    	}
    }

    /// @dev Check the liquidation line
    /// @param pLedger debt warehouse ledger
    /// @param tokenPrice Mortgage asset price(1 ETH = ? token)
    /// @param pTokenPrice PToken price(1 ETH = ? pToken)
    /// @param mortgageToken mortgage asset address
    function checkLine(PersonalLedger memory pLedger, 
                       uint256 tokenPrice, 
                       uint256 pTokenPrice, 
                       address mortgageToken) private view {
        uint256 parassetAssets = pLedger.parassetAssets;
        uint256 mortgageAssets = pLedger.mortgageAssets;
        // The current mortgage rate cannot exceed the liquidation line
        uint256 mortgageRate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice);
        uint256 fee = 0;
        if (parassetAssets > 0 && block.number > pLedger.blockHeight && pLedger.blockHeight != 0) {
            fee = getFee(parassetAssets, pLedger.blockHeight, pLedger.rate, mortgageRate);
        }
        require(getMortgageRate(mortgageAssets, parassetAssets.add(fee), tokenPrice, pTokenPrice) > liquidationLine[mortgageToken], "Log:MortgagePool:!liquidationLine");
    }

    /// @dev Get price
    /// @param mortgageToken mortgage asset address
    /// @param uToken underlying asset address
    /// @param priceValue price fee
    /// @return tokenPrice Mortgage asset price(1 ETH = ? token)
    /// @return pTokenPrice PToken price(1 ETH = ? pToken)
    function getPriceForPToken(address mortgageToken, 
                               address uToken,
                               uint256 priceValue) private returns (uint256 tokenPrice, 
                                                                    uint256 pTokenPrice) {
        (tokenPrice, pTokenPrice) = quary.getPriceForPToken{value:priceValue}(mortgageToken, uToken, msg.sender);   
    }


    // function takeOutERC20(address token, uint256 amount, address to) public onlyGovernance {
    //     ERC20(token).safeTransfer(address(to), amount);
    // }

    // function takeOutETH(uint256 amount, address to) public onlyGovernance {
    //     TransferHelper.safeTransferETH(address(to), amount);
    // }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"factoryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FeeValue","type":"event"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"coin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decrease","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flag","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"uint256","name":"inputTokenAmount","type":"uint256"},{"internalType":"address","name":"outputToken","type":"address"}],"name":"getDecimalConversion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"nowRate","type":"uint256"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"uTokenPrice","type":"uint256"},{"internalType":"uint256","name":"maxRateNum","type":"uint256"},{"internalType":"uint256","name":"owner","type":"uint256"}],"name":"getInfoRealTime","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"mortgageRate","type":"uint256"},{"internalType":"uint256","name":"maxSubM","type":"uint256"},{"internalType":"uint256","name":"maxAddP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInsurancePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"getLedger","outputs":[{"internalType":"uint256","name":"mortgageAssets","type":"uint256"},{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"bool","name":"created","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getLedgerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getLedgerArrayNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getLiquidationLine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getMaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mortgageAssets","type":"uint256"},{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"pTokenPrice","type":"uint256"}],"name":"getMortgageRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getOneYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"}],"name":"getPTokenToUnderlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uToken","type":"address"}],"name":"getUnderlyingToPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseCoinage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pTokenToUnderlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reducedCoinage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"setFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"uToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"setInsurancePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setLiquidationLine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"setMortgageAllow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setOneYear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"setPriceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setR0","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplement","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"underlyingToPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526658d15e17628000600c5562249f00600d553480156200002357600080fd5b50604051620032e8380380620032e8833981016040819052620000469162000114565b6001600055600b80546001600160a01b0319166001600160a01b0383811691909117918290556040805163289b3c0d60e01b81529051929091169163289b3c0d91600480820192602092909190829003018186803b158015620000a857600080fd5b505afa158015620000bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e3919062000114565b600180546001600160a01b0319166001600160a01b039290921691909117905550600e805460ff1916905562000144565b60006020828403121562000126578081fd5b81516001600160a01b03811681146200013d578182fd5b9392505050565b61319480620001546000396000f3fe60806040526004361061020f5760003560e01c806388ac317711610118578063b1ef1e44116100a0578063d0d5665b1161006f578063d0d5665b146105b7578063f1a4252e146105cc578063f9081591146105e1578063fb606f9214610601578063fd7948d4146106215761020f565b8063b1ef1e441461054f578063bf8e30b814610562578063c7aea00114610582578063cafab788146105a25761020f565b806394a39b6d116100e757806394a39b6d1461049f5780639b773d96146104cf578063a30f5313146104ef578063a94c487e1461050f578063a99c53b31461052f5761020f565b806388ac31771461042a578063890eba681461044a5780638f957d1d1461046c578063930aa4161461048c5761020f565b80633f8498201161019b5780636c074fe61161016a5780636c074fe6146103975780637120a88b146103b75780637326ad08146103d757806373ddaef4146103ea5780637ff4d02f1461040a5761020f565b80633f8498201461032d57806350777e5e1461034d578063566847291461036d5780635aa6e675146103825761020f565b806322a94595116101e257806322a94595146102a3578063289b3c0d146102b65780632932e191146102cb5780633ce4c3b6146102f85780633cf045a4146103185761020f565b806308d32a721461021457806308ff8ea61461024e57806312e20d03146102635780631effb30d14610276575b600080fd5b34801561022057600080fd5b5061023461022f36600461282f565b610641565b6040516102459594939291906130d6565b60405180910390f35b61026161025c366004612908565b6106cf565b005b610261610271366004612879565b6109bf565b34801561028257600080fd5b50610296610291366004612908565b610cfd565b6040516102459190612b3f565b6102616102b1366004612948565b610d4d565b3480156102c257600080fd5b50610296611147565b3480156102d757600080fd5b506102eb6102e63660046127b8565b611156565b604051610245919061309b565b34801561030457600080fd5b506102eb6103133660046127f7565b611171565b34801561032457600080fd5b5061029661119e565b34801561033957600080fd5b506102616103483660046127b8565b6111ad565b34801561035957600080fd5b50610261610368366004612a62565b6111f9565b34801561037957600080fd5b506102eb611228565b34801561038e57600080fd5b5061029661122e565b3480156103a357600080fd5b506102966103b23660046127b8565b61123d565b3480156103c357600080fd5b506102616103d2366004612ace565b611258565b6102616103e5366004612908565b611298565b3480156103f657600080fd5b506102eb610405366004612a9d565b61159f565b34801561041657600080fd5b506102eb610425366004612a9d565b61165e565b34801561043657600080fd5b50610261610445366004612a62565b6116a4565b34801561045657600080fd5b5061045f6116d3565b60405161024591906130fb565b34801561047857600080fd5b506102966104873660046127b8565b6116dc565b61026161049a366004612908565b6116fa565b3480156104ab57600080fd5b506104bf6104ba36600461298d565b6119c9565b60405161024594939291906130bb565b3480156104db57600080fd5b506102616104ea3660046129e5565b611b93565b3480156104fb57600080fd5b5061026161050a3660046129e5565b611bee565b34801561051b57600080fd5b5061026161052a3660046127b8565b611c49565b34801561053b57600080fd5b506102eb61054a3660046127b8565b611c95565b61026161055d366004612908565b611cb0565b34801561056e57600080fd5b5061029661057d3660046127b8565b611f8c565b34801561058e57600080fd5b5061026161059d3660046128c9565b611faa565b3480156105ae57600080fd5b5061026161200e565b3480156105c357600080fd5b506102966120d1565b3480156105d857600080fd5b506102eb6120e0565b3480156105ed57600080fd5b506102eb6105fc366004612a10565b6120e6565b34801561060d57600080fd5b5061026161061c3660046127f7565b61221e565b34801561062d57600080fd5b5061029661063c3660046127b8565b61234d565b6000806000806000610651612787565b505050506001600160a01b03948516600090815260056020908152604080832096881683529581528582209490961681529285525050819020815160a08101835281548082526001830154948201859052600283015493820184905260038301546060830181905260049093015460ff161515608090920182905294565b600e5460ff166106fa5760405162461bcd60e51b81526004016106f19061306e565b60405180910390fd5b6002600054141561071d5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166107675760405162461bcd60e51b81526004016106f190612f3c565b600081116107875760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166107df5760405162461bcd60e51b81526004016106f190612e61565b6000806001600160a01b03881615610837576108066001600160a01b038916333089612368565b6001600160a01b0380881660009081526003602052604090205461082d918a9116346123c6565b909250905061088d565b853410156108575760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808816600090815260036020526040902054610887918a9116610882348a61245e565b6123c6565b90925090505b6002850154600085158015906108a257508143115b80156108ad57508115155b15610987576108c886838960030154610405898b8a8a61165e565b600a549091506108e7906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f9261092d928e92911690600401612b53565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b5050505060008051602061313f833981519152898260405161097e929190612bb4565b60405180910390a15b6109918589612481565b8088554360028901556109a69087868661165e565b6003909701969096555050600160005550505050505050565b600e5460ff166109e15760405162461bcd60e51b81526004016106f19061306e565b60026000541415610a045760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610a4e5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808416600090815260056020908152604080832088851684528252808320938616835292905220600481015460ff16610aa15760405162461bcd60e51b81526004016106f190612e61565b600181015481548315801590610ab75750808411155b610ad35760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038087166000908152600360205260408120549091169080610afd8a84346123c6565b6040805160a0810182528954815260018a0154602082015260028a01549181019190915260038901546060820152600489015460ff16151560808201529193509150610b4b9083838d6124a4565b6000610b76610b5b84606461254f565b610b70605a610b6a8c8761254f565b9061254f565b90612586565b600a54909150610b95906001600160a01b038c81169133911684612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f90610bc7908d908890600401612b53565b600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506000610c1286610b708b8a61254f90919063ffffffff16565b600a5460405162d1253d60e31b81529192506001600160a01b03169063068929e890610c46908e9085908a90600401612bcd565b600060405180830381600087803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b50505050610c8b898761245e90919063ffffffff16565b8855610c97878261245e565b60018901558754610cb8576000600189018190556002890181905560038901555b6001600160a01b038c1615610ce057610cdb6001600160a01b038d16338b6125b8565b610cea565b610cea338a6125dc565b5050600160005550505050505050505050565b6001600160a01b0380841660009081526006602090815260408083209386168352929052908120805483908110610d3057fe5b6000918252602090912001546001600160a01b0316949350505050565b600e5460ff16600114610d725760405162461bcd60e51b81526004016106f190612c84565b60026000541415610d955760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610ddf5760405162461bcd60e51b81526004016106f190612f3c565b600081118015610e0757506001600160a01b0384166000908152600760205260409020548111155b610e235760405162461bcd60e51b81526004016106f190612dfb565b60008211610e435760405162461bcd60e51b81526004016106f190612e98565b6001600160a01b0380841660009081526005602090815260408083209388168084529382528083203384529091528120600181015481549193909290819015610ecc57610e9b6001600160a01b038a1633308a612368565b6001600160a01b03808916600090815260036020526040902054610ec2918b9116346123c6565b9092509050610f1d565b86341015610eec5760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808916600090815260036020526040902054610f17918b9116610882348b61245e565b90925090505b600285015460008515801590610f3257508143115b8015610f3d57508115155b1561101757610f5886838960030154610405898b8a8a61165e565b600a54909150610f77906001600160a01b038c81169133911684612368565b600a546001600160a01b038b811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92610fbd928f92911690600401612b53565b600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a8260405161100e929190612bb4565b60405180910390a15b600061103561102786606461254f565b610b708b610b6a8e8961254f565b6040516313b1db0b60e31b81529091506001600160a01b038c1690639d8ed8589061106690849033906004016130a4565b600060405180830381600087803b15801561108057600080fd5b505af1158015611094573d6000803e3d6000fd5b505050506110ab8a8761248190919063ffffffff16565b88556110b78782612481565b600189018190554360028a015588546110d191878761165e565b6003890155600488015460ff16610cea575050506001600160a01b0397881660009081526006602090815260408083209b909a168252998a52978820805460018181018355918a5299892090990180546001600160a01b031916331790555050506004909101805460ff19168617905550505055565b6001546001600160a01b031690565b6001600160a01b031660009081526008602052604090205490565b6001600160a01b038083166000908152600660209081526040808320938516835292905220545b92915050565b6009546001600160a01b031690565b6001546001600160a01b031633146111d75760405162461bcd60e51b81526004016106f190612e32565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112235760405162461bcd60e51b81526004016106f190612e32565b600c55565b600c5490565b6001546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146112825760405162461bcd60e51b81526004016106f190612e32565b600e805460ff191660ff92909216919091179055565b600e5460ff166001146112bd5760405162461bcd60e51b81526004016106f190612c84565b600260005414156112e05760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff1661132a5760405162461bcd60e51b81526004016106f190612f3c565b6000811161134a5760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166113a25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b03808616600090815260036020526040812054909182916113cd918a9116346123c6565b60028701549193509150600085158015906113e757508143115b80156113f257508115155b156114cc5761140d86838960030154610405898b8a8a61165e565b600a5490915061142c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611472928e92911690600401612b53565b600060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b5050505060008051602061313f83398151915289826040516114c3929190612bb4565b60405180910390a15b6114d68689612481565b600188018190554360028901556114f0908690868661165e565b600388018190556001600160a01b038b16600090815260076020526040902054101561152e5760405162461bcd60e51b81526004016106f190612d83565b6040516313b1db0b60e31b81526001600160a01b038a1690639d8ed8589061155c908b9033906004016130a4565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b50506001600055505050505050505050505050565b6000806115bd6115af438761245e565b600c54610b6a90899061254f565b905060006115cb8585612481565b905060006115f86115dd60038461254f565b610b6a6115ea438b61245e565b600c54610b6a908d9061254f565b90506000611619670de0b6b3a7640000600d5461254f90919063ffffffff16565b905061164f61163f6116386002610b6a85670de0b6b3a764000061254f565b8490612586565b6116498684612586565b90612481565b9450505050505b949350505050565b600084158061166b575081155b1561167857506000611656565b61169b611685838761254f565b610b70670de0b6b3a7640000610b6a888861254f565b95945050505050565b6001546001600160a01b031633146116ce5760405162461bcd60e51b81526004016106f190612e32565b600d55565b600e5460ff1681565b6001600160a01b039081166000908152600360205260409020541690565b600e5460ff1661171c5760405162461bcd60e51b81526004016106f19061306e565b6002600054141561173f5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166117895760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808316600081815260056020908152604080832088861684528252808320338452825280832060018101548154958552600390935292205491939092911684158015906117de5750828511155b6117fa5760405162461bcd60e51b81526004016106f190612c1f565b600484015460ff1661181e5760405162461bcd60e51b81526004016106f190612e61565b60008061182c8984346123c6565b600288015491935091506000861580159061184657508143115b801561185157508115155b156119295761186c87838a600301546104058a8c8a8a61165e565b600a5490915061189d9033906001600160a01b031661188b8c85612481565b6001600160a01b038e16929190612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f906118cf908d908990600401612b53565b600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a82604051611920929190612bb4565b60405180910390a15b611933878a61245e565b600189018190554360028a015561194d908790868661165e565b6003890155600a5460405162d1253d60e31b81526001600160a01b039091169063068929e890611985908d908d908a90600401612bcd565b600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600160005550505050505050505050505050565b6000806000806119d7612787565b506001600160a01b03808a1660009081526005602090815260408083208e851684528252808320938916835292815290829020825160a0810184528154808252600183015493820193909352600282015493810193909352600381015460608401526004015460ff1615156080830152158015611a5657506020810151155b15611a6f57600080600080945094509450945050611b86565b6001600160a01b03808b166000908152600360205260408120549091611a9791168a8d6120e6565b60208301516040840151606085015185519394508d93611ac0939291906104059084878961165e565b83516020850151919850611adf91611ad8908a612481565b838561165e565b95506000611af48a662386f26fc1000061254f565b9050808710611b0a576000955060009450611b81565b611b45611b3d611b1a838661254f565b610b70670de0b6b3a7640000610b6a878a6020015161254f90919063ffffffff16565b85519061245e565b6020850151909650611b7e90611b78611b66670de0b6b3a76400008661254f565b8751610b70908690610b6a908a61254f565b9061245e565b94505b505050505b9650965096509692505050565b6001546001600160a01b03163314611bbd5760405162461bcd60e51b81526004016106f190612e32565b611bce81662386f26fc1000061254f565b6001600160a01b0390921660009081526007602052604090209190915550565b6001546001600160a01b03163314611c185760405162461bcd60e51b81526004016106f190612e32565b611c2981662386f26fc1000061254f565b6001600160a01b0390921660009081526008602052604090209190915550565b6001546001600160a01b03163314611c735760405162461bcd60e51b81526004016106f190612e32565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526007602052604090205490565b600e5460ff16611cd25760405162461bcd60e51b81526004016106f19061306e565b60026000541415611cf55760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff16611d3f5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b0380831660009081526005602090815260408083209387168352928152828220338352905220600181015481548315801590611d825750808411155b611d9e5760405162461bcd60e51b81526004016106f190612c1f565b600483015460ff16611dc25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b0380861660009081526003602052604081205490918291611ded918a9116346123c6565b6002870154919350915060008515801590611e0757508143115b8015611e1257508115155b15611eec57611e2d86838960030154610405898b8a8a61165e565b600a54909150611e4c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611e92928e92911690600401612b53565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b5050505060008051602061313f8339815191528982604051611ee3929190612bb4565b60405180910390a15b611ef6858961245e565b808855436002890155611f0b9087868661165e565b600388018190556001600160a01b038b166000908152600760205260409020541015611f495760405162461bcd60e51b81526004016106f190612d83565b6001600160a01b038a1615611f7157611f6c6001600160a01b038b16338a6125b8565b611f7b565b611f7b33896125dc565b505060016000555050505050505050565b6001600160a01b039081166000908152600260205260409020541690565b6001546001600160a01b03163314611fd45760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b03928316600090815260046020908152604080832094909516825292909252919020805460ff1916911515919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b031663289b3c0d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906127db565b600180546001600160a01b0319166001600160a01b039283161790819055166120cf5760405162461bcd60e51b81526004016106f190612ce9565b565b600a546001600160a01b031690565b600d5490565b60006012806001600160a01b0386161561217157856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213357600080fd5b505afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190612aea565b60ff1691505b6001600160a01b038416156121f757836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190612aea565b60ff1690505b61221482600a0a610b7083600a0a8861254f90919063ffffffff16565b9695505050505050565b6001546001600160a01b031633146122485760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b0382811660009081526002602052604090205416156122805760405162461bcd60e51b81526004016106f190612fbd565b600a546001600160a01b03166122a85760405162461bcd60e51b81526004016106f190612ce9565b6001600160a01b03808316600081815260026020908152604080832080548688166001600160a01b031991821681179092559084526003909252918290208054909116909217909155600a5490516377e8a1bd60e11b815291169063efd1437a90612317908590600401612b3f565b600060405180830381600087803b15801561233157600080fd5b505af1158015612345573d6000803e3d6000fd5b505050505050565b6002602052600090815260409020546001600160a01b031681565b6123c0846323b872dd60e01b85858560405160240161238993929190612b90565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b50505050565b600954604051630da33aa960e01b815260009182916001600160a01b0390911690630da33aa990859061240190899089903390600401612b6d565b60408051808303818588803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124529190612a7a565b90969095509350505050565b808203828111156111985760405162461bcd60e51b81526004016106f190612bf0565b808201828110156111985760405162461bcd60e51b81526004016106f190612cbb565b6020840151845160006124b98284888861165e565b9050600080841180156124cf5750876040015143115b80156124de5750604088015115155b156124fa576124f78489604001518a606001518561159f565b90505b6001600160a01b038516600090815260086020526040902054612528846125218785612481565b8a8a61165e565b116125455760405162461bcd60e51b81526004016106f190612dba565b5050505050505050565b600081158061256a5750508082028282828161256757fe5b04145b6111985760405162461bcd60e51b81526004016106f190612c56565b60008082116125a75760405162461bcd60e51b81526004016106f190612ecf565b8183816125b057fe5b049392505050565b6125d78363a9059cbb60e01b8484604051602401612389929190612bb4565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516126069190612b06565b60006040518083038185875af1925050503d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b50509050806125d75760405162461bcd60e51b81526004016106f190612ef9565b61267b826001600160a01b031661274e565b6126975760405162461bcd60e51b81526004016106f190613037565b60006060836001600160a01b0316836040516126b39190612b06565b6000604051808303816000865af19150503d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b5091509150816127175760405162461bcd60e51b81526004016106f190612d17565b8051156123c057808060200190518101906127329190612a46565b6123c05760405162461bcd60e51b81526004016106f190612f73565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611656575050151592915050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000602082840312156127c9578081fd5b81356127d481613109565b9392505050565b6000602082840312156127ec578081fd5b81516127d481613109565b60008060408385031215612809578081fd5b823561281481613109565b9150602083013561282481613109565b809150509250929050565b600080600060608486031215612843578081fd5b833561284e81613109565b9250602084013561285e81613109565b9150604084013561286e81613109565b809150509250925092565b6000806000806080858703121561288e578081fd5b843561289981613109565b935060208501356128a981613109565b925060408501356128b981613109565b9396929550929360600135925050565b6000806000606084860312156128dd578283fd5b83356128e881613109565b925060208401356128f881613109565b9150604084013561286e81613121565b60008060006060848603121561291c578283fd5b833561292781613109565b9250602084013561293781613109565b929592945050506040919091013590565b6000806000806080858703121561295d578384fd5b843561296881613109565b9350602085013561297881613109565b93969395505050506040820135916060013590565b60008060008060008060c087890312156129a5578182fd5b86356129b081613109565b955060208701356129c081613109565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080604083850312156129f7578182fd5b8235612a0281613109565b946020939093013593505050565b600080600060608486031215612a24578283fd5b8335612a2f81613109565b925060208401359150604084013561286e81613109565b600060208284031215612a57578081fd5b81516127d481613121565b600060208284031215612a73578081fd5b5035919050565b60008060408385031215612a8c578182fd5b505080516020909101519092909150565b60008060008060808587031215612ab2578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612adf578081fd5b81356127d48161312f565b600060208284031215612afb578081fd5b81516127d48161312f565b60008251815b81811015612b265760208186018101518583015201612b0c565b81811115612b345782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a21616d6f756e740000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a216163746976650000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526014908201527304c6f673a4d6f727467616765506f6f6c3a3078360641b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252601b908201527f4c6f673a4d6f727467616765506f6f6c3a216d73672e76616c75650000000000604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216d61785261746500000000000000604082015260600190565b60208082526021908201527f4c6f673a4d6f727467616765506f6f6c3a216c69717569646174696f6e4c696e6040820152606560f81b606082015260800190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a72617465213d300000000000000000604082015260600190565b6020808252601590820152742637b39d26b7b93a33b0b3b2a837b7b61d10b3b7bb60591b604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216372656174656400000000000000604082015260600190565b6020808252601a908201527f4c6f673a4d6f727467616765506f6f6c3a616d6f756e74213d30000000000000604082015260600190565b60208082526010908201526f64732d6d6174682d6469762d7a65726f60801b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252601f908201527f4c6f673a4d6f727467616765506f6f6c3a216d6f727467616765416c6c6f7700604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f4c6f673a4d6f727467616765506f6f6c3a756e6465726c79696e67546f50546f60408201526235b2b760e91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b60208082526013908201527204c6f673a4d6f727467616765506f6f6c3a213606c1b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b93845260208401929092526040830152606082015260800190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60ff91909116815260200190565b6001600160a01b038116811461311e57600080fd5b50565b801515811461311e57600080fd5b60ff8116811461311e57600080fdfe4377f33be9a604d55b08975df4d8840dc93be5d56bfa558d0f6ba5638e26a21fa264697066735822122018e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c148364736f6c634300060c0033000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806388ac317711610118578063b1ef1e44116100a0578063d0d5665b1161006f578063d0d5665b146105b7578063f1a4252e146105cc578063f9081591146105e1578063fb606f9214610601578063fd7948d4146106215761020f565b8063b1ef1e441461054f578063bf8e30b814610562578063c7aea00114610582578063cafab788146105a25761020f565b806394a39b6d116100e757806394a39b6d1461049f5780639b773d96146104cf578063a30f5313146104ef578063a94c487e1461050f578063a99c53b31461052f5761020f565b806388ac31771461042a578063890eba681461044a5780638f957d1d1461046c578063930aa4161461048c5761020f565b80633f8498201161019b5780636c074fe61161016a5780636c074fe6146103975780637120a88b146103b75780637326ad08146103d757806373ddaef4146103ea5780637ff4d02f1461040a5761020f565b80633f8498201461032d57806350777e5e1461034d578063566847291461036d5780635aa6e675146103825761020f565b806322a94595116101e257806322a94595146102a3578063289b3c0d146102b65780632932e191146102cb5780633ce4c3b6146102f85780633cf045a4146103185761020f565b806308d32a721461021457806308ff8ea61461024e57806312e20d03146102635780631effb30d14610276575b600080fd5b34801561022057600080fd5b5061023461022f36600461282f565b610641565b6040516102459594939291906130d6565b60405180910390f35b61026161025c366004612908565b6106cf565b005b610261610271366004612879565b6109bf565b34801561028257600080fd5b50610296610291366004612908565b610cfd565b6040516102459190612b3f565b6102616102b1366004612948565b610d4d565b3480156102c257600080fd5b50610296611147565b3480156102d757600080fd5b506102eb6102e63660046127b8565b611156565b604051610245919061309b565b34801561030457600080fd5b506102eb6103133660046127f7565b611171565b34801561032457600080fd5b5061029661119e565b34801561033957600080fd5b506102616103483660046127b8565b6111ad565b34801561035957600080fd5b50610261610368366004612a62565b6111f9565b34801561037957600080fd5b506102eb611228565b34801561038e57600080fd5b5061029661122e565b3480156103a357600080fd5b506102966103b23660046127b8565b61123d565b3480156103c357600080fd5b506102616103d2366004612ace565b611258565b6102616103e5366004612908565b611298565b3480156103f657600080fd5b506102eb610405366004612a9d565b61159f565b34801561041657600080fd5b506102eb610425366004612a9d565b61165e565b34801561043657600080fd5b50610261610445366004612a62565b6116a4565b34801561045657600080fd5b5061045f6116d3565b60405161024591906130fb565b34801561047857600080fd5b506102966104873660046127b8565b6116dc565b61026161049a366004612908565b6116fa565b3480156104ab57600080fd5b506104bf6104ba36600461298d565b6119c9565b60405161024594939291906130bb565b3480156104db57600080fd5b506102616104ea3660046129e5565b611b93565b3480156104fb57600080fd5b5061026161050a3660046129e5565b611bee565b34801561051b57600080fd5b5061026161052a3660046127b8565b611c49565b34801561053b57600080fd5b506102eb61054a3660046127b8565b611c95565b61026161055d366004612908565b611cb0565b34801561056e57600080fd5b5061029661057d3660046127b8565b611f8c565b34801561058e57600080fd5b5061026161059d3660046128c9565b611faa565b3480156105ae57600080fd5b5061026161200e565b3480156105c357600080fd5b506102966120d1565b3480156105d857600080fd5b506102eb6120e0565b3480156105ed57600080fd5b506102eb6105fc366004612a10565b6120e6565b34801561060d57600080fd5b5061026161061c3660046127f7565b61221e565b34801561062d57600080fd5b5061029661063c3660046127b8565b61234d565b6000806000806000610651612787565b505050506001600160a01b03948516600090815260056020908152604080832096881683529581528582209490961681529285525050819020815160a08101835281548082526001830154948201859052600283015493820184905260038301546060830181905260049093015460ff161515608090920182905294565b600e5460ff166106fa5760405162461bcd60e51b81526004016106f19061306e565b60405180910390fd5b6002600054141561071d5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166107675760405162461bcd60e51b81526004016106f190612f3c565b600081116107875760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166107df5760405162461bcd60e51b81526004016106f190612e61565b6000806001600160a01b03881615610837576108066001600160a01b038916333089612368565b6001600160a01b0380881660009081526003602052604090205461082d918a9116346123c6565b909250905061088d565b853410156108575760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808816600090815260036020526040902054610887918a9116610882348a61245e565b6123c6565b90925090505b6002850154600085158015906108a257508143115b80156108ad57508115155b15610987576108c886838960030154610405898b8a8a61165e565b600a549091506108e7906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f9261092d928e92911690600401612b53565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b5050505060008051602061313f833981519152898260405161097e929190612bb4565b60405180910390a15b6109918589612481565b8088554360028901556109a69087868661165e565b6003909701969096555050600160005550505050505050565b600e5460ff166109e15760405162461bcd60e51b81526004016106f19061306e565b60026000541415610a045760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610a4e5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808416600090815260056020908152604080832088851684528252808320938616835292905220600481015460ff16610aa15760405162461bcd60e51b81526004016106f190612e61565b600181015481548315801590610ab75750808411155b610ad35760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038087166000908152600360205260408120549091169080610afd8a84346123c6565b6040805160a0810182528954815260018a0154602082015260028a01549181019190915260038901546060820152600489015460ff16151560808201529193509150610b4b9083838d6124a4565b6000610b76610b5b84606461254f565b610b70605a610b6a8c8761254f565b9061254f565b90612586565b600a54909150610b95906001600160a01b038c81169133911684612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f90610bc7908d908890600401612b53565b600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506000610c1286610b708b8a61254f90919063ffffffff16565b600a5460405162d1253d60e31b81529192506001600160a01b03169063068929e890610c46908e9085908a90600401612bcd565b600060405180830381600087803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b50505050610c8b898761245e90919063ffffffff16565b8855610c97878261245e565b60018901558754610cb8576000600189018190556002890181905560038901555b6001600160a01b038c1615610ce057610cdb6001600160a01b038d16338b6125b8565b610cea565b610cea338a6125dc565b5050600160005550505050505050505050565b6001600160a01b0380841660009081526006602090815260408083209386168352929052908120805483908110610d3057fe5b6000918252602090912001546001600160a01b0316949350505050565b600e5460ff16600114610d725760405162461bcd60e51b81526004016106f190612c84565b60026000541415610d955760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610ddf5760405162461bcd60e51b81526004016106f190612f3c565b600081118015610e0757506001600160a01b0384166000908152600760205260409020548111155b610e235760405162461bcd60e51b81526004016106f190612dfb565b60008211610e435760405162461bcd60e51b81526004016106f190612e98565b6001600160a01b0380841660009081526005602090815260408083209388168084529382528083203384529091528120600181015481549193909290819015610ecc57610e9b6001600160a01b038a1633308a612368565b6001600160a01b03808916600090815260036020526040902054610ec2918b9116346123c6565b9092509050610f1d565b86341015610eec5760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808916600090815260036020526040902054610f17918b9116610882348b61245e565b90925090505b600285015460008515801590610f3257508143115b8015610f3d57508115155b1561101757610f5886838960030154610405898b8a8a61165e565b600a54909150610f77906001600160a01b038c81169133911684612368565b600a546001600160a01b038b811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92610fbd928f92911690600401612b53565b600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a8260405161100e929190612bb4565b60405180910390a15b600061103561102786606461254f565b610b708b610b6a8e8961254f565b6040516313b1db0b60e31b81529091506001600160a01b038c1690639d8ed8589061106690849033906004016130a4565b600060405180830381600087803b15801561108057600080fd5b505af1158015611094573d6000803e3d6000fd5b505050506110ab8a8761248190919063ffffffff16565b88556110b78782612481565b600189018190554360028a015588546110d191878761165e565b6003890155600488015460ff16610cea575050506001600160a01b0397881660009081526006602090815260408083209b909a168252998a52978820805460018181018355918a5299892090990180546001600160a01b031916331790555050506004909101805460ff19168617905550505055565b6001546001600160a01b031690565b6001600160a01b031660009081526008602052604090205490565b6001600160a01b038083166000908152600660209081526040808320938516835292905220545b92915050565b6009546001600160a01b031690565b6001546001600160a01b031633146111d75760405162461bcd60e51b81526004016106f190612e32565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112235760405162461bcd60e51b81526004016106f190612e32565b600c55565b600c5490565b6001546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146112825760405162461bcd60e51b81526004016106f190612e32565b600e805460ff191660ff92909216919091179055565b600e5460ff166001146112bd5760405162461bcd60e51b81526004016106f190612c84565b600260005414156112e05760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff1661132a5760405162461bcd60e51b81526004016106f190612f3c565b6000811161134a5760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166113a25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b03808616600090815260036020526040812054909182916113cd918a9116346123c6565b60028701549193509150600085158015906113e757508143115b80156113f257508115155b156114cc5761140d86838960030154610405898b8a8a61165e565b600a5490915061142c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611472928e92911690600401612b53565b600060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b5050505060008051602061313f83398151915289826040516114c3929190612bb4565b60405180910390a15b6114d68689612481565b600188018190554360028901556114f0908690868661165e565b600388018190556001600160a01b038b16600090815260076020526040902054101561152e5760405162461bcd60e51b81526004016106f190612d83565b6040516313b1db0b60e31b81526001600160a01b038a1690639d8ed8589061155c908b9033906004016130a4565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b50506001600055505050505050505050505050565b6000806115bd6115af438761245e565b600c54610b6a90899061254f565b905060006115cb8585612481565b905060006115f86115dd60038461254f565b610b6a6115ea438b61245e565b600c54610b6a908d9061254f565b90506000611619670de0b6b3a7640000600d5461254f90919063ffffffff16565b905061164f61163f6116386002610b6a85670de0b6b3a764000061254f565b8490612586565b6116498684612586565b90612481565b9450505050505b949350505050565b600084158061166b575081155b1561167857506000611656565b61169b611685838761254f565b610b70670de0b6b3a7640000610b6a888861254f565b95945050505050565b6001546001600160a01b031633146116ce5760405162461bcd60e51b81526004016106f190612e32565b600d55565b600e5460ff1681565b6001600160a01b039081166000908152600360205260409020541690565b600e5460ff1661171c5760405162461bcd60e51b81526004016106f19061306e565b6002600054141561173f5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166117895760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808316600081815260056020908152604080832088861684528252808320338452825280832060018101548154958552600390935292205491939092911684158015906117de5750828511155b6117fa5760405162461bcd60e51b81526004016106f190612c1f565b600484015460ff1661181e5760405162461bcd60e51b81526004016106f190612e61565b60008061182c8984346123c6565b600288015491935091506000861580159061184657508143115b801561185157508115155b156119295761186c87838a600301546104058a8c8a8a61165e565b600a5490915061189d9033906001600160a01b031661188b8c85612481565b6001600160a01b038e16929190612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f906118cf908d908990600401612b53565b600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a82604051611920929190612bb4565b60405180910390a15b611933878a61245e565b600189018190554360028a015561194d908790868661165e565b6003890155600a5460405162d1253d60e31b81526001600160a01b039091169063068929e890611985908d908d908a90600401612bcd565b600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600160005550505050505050505050505050565b6000806000806119d7612787565b506001600160a01b03808a1660009081526005602090815260408083208e851684528252808320938916835292815290829020825160a0810184528154808252600183015493820193909352600282015493810193909352600381015460608401526004015460ff1615156080830152158015611a5657506020810151155b15611a6f57600080600080945094509450945050611b86565b6001600160a01b03808b166000908152600360205260408120549091611a9791168a8d6120e6565b60208301516040840151606085015185519394508d93611ac0939291906104059084878961165e565b83516020850151919850611adf91611ad8908a612481565b838561165e565b95506000611af48a662386f26fc1000061254f565b9050808710611b0a576000955060009450611b81565b611b45611b3d611b1a838661254f565b610b70670de0b6b3a7640000610b6a878a6020015161254f90919063ffffffff16565b85519061245e565b6020850151909650611b7e90611b78611b66670de0b6b3a76400008661254f565b8751610b70908690610b6a908a61254f565b9061245e565b94505b505050505b9650965096509692505050565b6001546001600160a01b03163314611bbd5760405162461bcd60e51b81526004016106f190612e32565b611bce81662386f26fc1000061254f565b6001600160a01b0390921660009081526007602052604090209190915550565b6001546001600160a01b03163314611c185760405162461bcd60e51b81526004016106f190612e32565b611c2981662386f26fc1000061254f565b6001600160a01b0390921660009081526008602052604090209190915550565b6001546001600160a01b03163314611c735760405162461bcd60e51b81526004016106f190612e32565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526007602052604090205490565b600e5460ff16611cd25760405162461bcd60e51b81526004016106f19061306e565b60026000541415611cf55760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff16611d3f5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b0380831660009081526005602090815260408083209387168352928152828220338352905220600181015481548315801590611d825750808411155b611d9e5760405162461bcd60e51b81526004016106f190612c1f565b600483015460ff16611dc25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b0380861660009081526003602052604081205490918291611ded918a9116346123c6565b6002870154919350915060008515801590611e0757508143115b8015611e1257508115155b15611eec57611e2d86838960030154610405898b8a8a61165e565b600a54909150611e4c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611e92928e92911690600401612b53565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b5050505060008051602061313f8339815191528982604051611ee3929190612bb4565b60405180910390a15b611ef6858961245e565b808855436002890155611f0b9087868661165e565b600388018190556001600160a01b038b166000908152600760205260409020541015611f495760405162461bcd60e51b81526004016106f190612d83565b6001600160a01b038a1615611f7157611f6c6001600160a01b038b16338a6125b8565b611f7b565b611f7b33896125dc565b505060016000555050505050505050565b6001600160a01b039081166000908152600260205260409020541690565b6001546001600160a01b03163314611fd45760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b03928316600090815260046020908152604080832094909516825292909252919020805460ff1916911515919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b031663289b3c0d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906127db565b600180546001600160a01b0319166001600160a01b039283161790819055166120cf5760405162461bcd60e51b81526004016106f190612ce9565b565b600a546001600160a01b031690565b600d5490565b60006012806001600160a01b0386161561217157856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213357600080fd5b505afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190612aea565b60ff1691505b6001600160a01b038416156121f757836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190612aea565b60ff1690505b61221482600a0a610b7083600a0a8861254f90919063ffffffff16565b9695505050505050565b6001546001600160a01b031633146122485760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b0382811660009081526002602052604090205416156122805760405162461bcd60e51b81526004016106f190612fbd565b600a546001600160a01b03166122a85760405162461bcd60e51b81526004016106f190612ce9565b6001600160a01b03808316600081815260026020908152604080832080548688166001600160a01b031991821681179092559084526003909252918290208054909116909217909155600a5490516377e8a1bd60e11b815291169063efd1437a90612317908590600401612b3f565b600060405180830381600087803b15801561233157600080fd5b505af1158015612345573d6000803e3d6000fd5b505050505050565b6002602052600090815260409020546001600160a01b031681565b6123c0846323b872dd60e01b85858560405160240161238993929190612b90565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b50505050565b600954604051630da33aa960e01b815260009182916001600160a01b0390911690630da33aa990859061240190899089903390600401612b6d565b60408051808303818588803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124529190612a7a565b90969095509350505050565b808203828111156111985760405162461bcd60e51b81526004016106f190612bf0565b808201828110156111985760405162461bcd60e51b81526004016106f190612cbb565b6020840151845160006124b98284888861165e565b9050600080841180156124cf5750876040015143115b80156124de5750604088015115155b156124fa576124f78489604001518a606001518561159f565b90505b6001600160a01b038516600090815260086020526040902054612528846125218785612481565b8a8a61165e565b116125455760405162461bcd60e51b81526004016106f190612dba565b5050505050505050565b600081158061256a5750508082028282828161256757fe5b04145b6111985760405162461bcd60e51b81526004016106f190612c56565b60008082116125a75760405162461bcd60e51b81526004016106f190612ecf565b8183816125b057fe5b049392505050565b6125d78363a9059cbb60e01b8484604051602401612389929190612bb4565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516126069190612b06565b60006040518083038185875af1925050503d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b50509050806125d75760405162461bcd60e51b81526004016106f190612ef9565b61267b826001600160a01b031661274e565b6126975760405162461bcd60e51b81526004016106f190613037565b60006060836001600160a01b0316836040516126b39190612b06565b6000604051808303816000865af19150503d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b5091509150816127175760405162461bcd60e51b81526004016106f190612d17565b8051156123c057808060200190518101906127329190612a46565b6123c05760405162461bcd60e51b81526004016106f190612f73565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611656575050151592915050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000602082840312156127c9578081fd5b81356127d481613109565b9392505050565b6000602082840312156127ec578081fd5b81516127d481613109565b60008060408385031215612809578081fd5b823561281481613109565b9150602083013561282481613109565b809150509250929050565b600080600060608486031215612843578081fd5b833561284e81613109565b9250602084013561285e81613109565b9150604084013561286e81613109565b809150509250925092565b6000806000806080858703121561288e578081fd5b843561289981613109565b935060208501356128a981613109565b925060408501356128b981613109565b9396929550929360600135925050565b6000806000606084860312156128dd578283fd5b83356128e881613109565b925060208401356128f881613109565b9150604084013561286e81613121565b60008060006060848603121561291c578283fd5b833561292781613109565b9250602084013561293781613109565b929592945050506040919091013590565b6000806000806080858703121561295d578384fd5b843561296881613109565b9350602085013561297881613109565b93969395505050506040820135916060013590565b60008060008060008060c087890312156129a5578182fd5b86356129b081613109565b955060208701356129c081613109565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080604083850312156129f7578182fd5b8235612a0281613109565b946020939093013593505050565b600080600060608486031215612a24578283fd5b8335612a2f81613109565b925060208401359150604084013561286e81613109565b600060208284031215612a57578081fd5b81516127d481613121565b600060208284031215612a73578081fd5b5035919050565b60008060408385031215612a8c578182fd5b505080516020909101519092909150565b60008060008060808587031215612ab2578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612adf578081fd5b81356127d48161312f565b600060208284031215612afb578081fd5b81516127d48161312f565b60008251815b81811015612b265760208186018101518583015201612b0c565b81811115612b345782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a21616d6f756e740000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a216163746976650000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526014908201527304c6f673a4d6f727467616765506f6f6c3a3078360641b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252601b908201527f4c6f673a4d6f727467616765506f6f6c3a216d73672e76616c75650000000000604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216d61785261746500000000000000604082015260600190565b60208082526021908201527f4c6f673a4d6f727467616765506f6f6c3a216c69717569646174696f6e4c696e6040820152606560f81b606082015260800190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a72617465213d300000000000000000604082015260600190565b6020808252601590820152742637b39d26b7b93a33b0b3b2a837b7b61d10b3b7bb60591b604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216372656174656400000000000000604082015260600190565b6020808252601a908201527f4c6f673a4d6f727467616765506f6f6c3a616d6f756e74213d30000000000000604082015260600190565b60208082526010908201526f64732d6d6174682d6469762d7a65726f60801b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252601f908201527f4c6f673a4d6f727467616765506f6f6c3a216d6f727467616765416c6c6f7700604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f4c6f673a4d6f727467616765506f6f6c3a756e6465726c79696e67546f50546f60408201526235b2b760e91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b60208082526013908201527204c6f673a4d6f727467616765506f6f6c3a213606c1b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b93845260208401929092526040830152606082015260800190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60ff91909116815260200190565b6001600160a01b038116811461311e57600080fd5b50565b801515811461311e57600080fd5b60ff8116811461311e57600080fdfe4377f33be9a604d55b08975df4d8840dc93be5d56bfa558d0f6ba5638e26a21fa264697066735822122018e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c148364736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b

-----Decoded View---------------
Arg [0] : factoryAddress (address): 0xbe612b724B77038bC40A4E4A88335A93A9aA445B

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b


Deployed Bytecode Sourcemap

15660:30928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23692:670;;;;;;;;;;-1:-1:-1;23692:670:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;33344:2127;;;;;;:::i;:::-;;:::i;:::-;;42197:2171;;;;;;:::i;:::-;;:::i;27004:242::-;;;;;;;;;;-1:-1:-1;27004:242:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30504:2648::-;;;;;;:::i;:::-;;:::i;24444:92::-;;;;;;;;;;;;;:::i;25508:138::-;;;;;;;;;;-1:-1:-1;25508:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26608:197::-;;;;;;;;;;-1:-1:-1;26608:197:0;;;;;:::i;:::-;;:::i;25760:101::-;;;;;;;;;;;;;:::i;29249:111::-;;;;;;;;;;-1:-1:-1;29249:111:0;;;;;:::i;:::-;;:::i;28192:74::-;;;;;;;;;;-1:-1:-1;28192:74:0;;;;;:::i;:::-;;:::i;24833:73::-;;;;;;;;;;;;;:::i;15793:25::-;;;;;;;;;;;;;:::i;15973:51::-;;;;;;;;;;-1:-1:-1;15973:51:0;;;;;:::i;:::-;;:::i;27380:79::-;;;;;;;;;;-1:-1:-1;27380:79:0;;;;;:::i;:::-;;:::i;37959:1989::-;;;;;;:::i;:::-;;:::i;18727:556::-;;;;;;;;;;-1:-1:-1;18727:556:0;;;;;:::i;:::-;;:::i;19592:419::-;;;;;;;;;;-1:-1:-1;19592:419:0;;;;;:::i;:::-;;:::i;28388:84::-;;;;;;;;;;-1:-1:-1;28388:84:0;;;;;:::i;:::-;;:::i;17010:17::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26303:130::-;;;;;;;;;;-1:-1:-1;26303:130:0;;;;;:::i;:::-;;:::i;40130:1841::-;;;;;;:::i;:::-;;:::i;20658:1735::-;;;;;;;;;;-1:-1:-1;20658:1735:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;28973:164::-;;;;;;;;;;-1:-1:-1;28973:164:0;;;;;:::i;:::-;;:::i;28620:191::-;;;;;;;;;;-1:-1:-1;28620:191:0;;;;;:::i;:::-;;:::i;27960:115::-;;;;;;;;;;-1:-1:-1;27960:115:0;;;;;:::i;:::-;;:::i;25254:119::-;;;;;;;;;;-1:-1:-1;25254:119:0;;;;;:::i;:::-;;:::i;35657:2118::-;;;;;;:::i;:::-;;:::i;26021:130::-;;;;;;;;;;-1:-1:-1;26021:130:0;;;;;:::i;:::-;;:::i;27649:217::-;;;;;;;;;;-1:-1:-1;27649:217:0;;;;;:::i;:::-;;:::i;30106:163::-;;;;;;;;;;;;;:::i;24626:107::-;;;;;;;;;;;;;:::i;25026:83::-;;;;;;;;;;;;;:::i;22619:556::-;;;;;;;;;;-1:-1:-1;22619:556:0;;;;;:::i;:::-;;:::i;29581:441::-;;;;;;;;;;-1:-1:-1;29581:441:0;;;;;:::i;:::-;;:::i;15870:51::-;;;;;;;;;;-1:-1:-1;15870:51:0;;;;;:::i;:::-;;:::i;23692:670::-;23831:22;23909;23987:19;24067:12;24140;24162:29;;:::i;:::-;-1:-1:-1;;;;;;;;;24194:14:0;;;;;;;:6;:14;;;;;;;;:29;;;;;;;;;;;:45;;;;;;;;;-1:-1:-1;;24194:45:0;;;24162:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23692:670::o;33344:2127::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;;;;;;;;;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;33525:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;33517:80;;;;-1:-1:-1::0;;;33517:80:0::2;;;;;;;:::i;:::-;33625:1;33616:6;:10;33608:47;;;;-1:-1:-1::0;;;33608:47:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33696:14:0;;::::2;33663:30;33696:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;33734:10:::2;33696:50:::0;;;;;33782:22:::2;::::0;::::2;::::0;33840;;33881:15:::2;::::0;::::2;::::0;::::2;;33873:53;;;;-1:-1:-1::0;;;33873:53:0::2;;;;;;;:::i;:::-;33997:18;::::0;-1:-1:-1;;;;;34060:29:0;::::2;::::0;34056:484:::2;;34106:81;-1:-1:-1::0;;;;;34106:37:0;::::2;34152:10;34173:4;34180:6:::0;34106:37:::2;:81::i;:::-;-1:-1:-1::0;;;;;34263:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;34230:71:::2;::::0;34248:13;;34263:26:::2;34291:9;34230:17;:71::i;:::-;34202:99:::0;;-1:-1:-1;34202:99:0;-1:-1:-1;34056:484:0::2;;;34355:6;34342:9;:19;;34334:59;;;;-1:-1:-1::0;;;34334:59:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34469:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;34436:92:::2;::::0;34454:13;;34469:26:::2;34497:30;34505:9;34520:6:::0;34497:22:::2;:30::i;:::-;34436:17;:92::i;:::-;34408:120:::0;;-1:-1:-1;34408:120:0;-1:-1:-1;34056:484:0::2;34614:19;::::0;::::2;::::0;34592::::2;34671:18:::0;;;;;:48:::2;;;34708:11;34693:12;:26;34671:48;:68;;;;-1:-1:-1::0;34723:16:0;;::::2;34671:68;34667:552;;;34762:123;34769:14;34785:11;34798:7;:12;;;34812:72;34828:14;34844;34860:10;34872:11;34812:15;:72::i;34762:123::-;35031:13;::::0;34756:129;;-1:-1:-1;34971:80:0::2;::::0;-1:-1:-1;;;;;34971:30:0;;::::2;::::0;35010:10:::2;::::0;35031:13:::2;34756:129:::0;34971:30:::2;:80::i;:::-;35110:13;::::0;-1:-1:-1;;;;;35142:26:0;;::::2;35110:13;35142:26:::0;;;:18:::2;:26;::::0;;;;;;;35110:59;;-1:-1:-1;;;35110:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;35134:6;;35142:26;::::2;::::0;35110:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;35198:6:0::2;35206:3;35189:21;;;;;;;:::i;:::-;;;;;;;;34667:552;35289:26;:14:::0;35308:6;35289:18:::2;:26::i;:::-;35264:51:::0;;;35345:12:::2;35323:19;::::0;::::2;:34:::0;35383:80:::2;::::0;35423:14;35439:10;35451:11;35383:15:::2;:80::i;:::-;35368:12;::::0;;::::2;:95:::0;;;;-1:-1:-1;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;33344:2127:0:o;42197:2171::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;42423:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;42415:80;;;;-1:-1:-1::0;;;42415:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42536:14:0;;::::2;42503:30;42536:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;:38;;::::2;::::0;;;;;;42593:15:::2;::::0;::::2;::::0;::::2;;42585:53;;;;-1:-1:-1::0;;;42585:53:0::2;;;;;;;:::i;:::-;42674:22;::::0;::::2;::::0;42732;;42773:10;;;;;:38:::2;;;42797:14;42787:6;:24;;42773:38;42765:75;;;;-1:-1:-1::0;;;42765:75:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42893:26:0;;::::2;42876:14;42893:26:::0;;;:18:::2;:26;::::0;;;;;;;::::2;::::0;42876:14;42971:51:::2;42989:13:::0;42893:26;43012:9:::2;42971:17;:51::i;:::-;43084:58;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;::::2;;;;::::0;;;;42927:95;;-1:-1:-1;42927:95:0;-1:-1:-1;43084:58:0::2;::::0;42927:95;;43128:13;43084:9:::2;:58::i;:::-;43198:20;43221:56;43257:19;:10:::0;43272:3:::2;43257:14;:19::i;:::-;43221:31;43249:2;43221:23;:6:::0;43232:11;43221:10:::2;:23::i;:::-;:27:::0;::::2;:31::i;:::-;:35:::0;::::2;:56::i;:::-;43373:13;::::0;43198:79;;-1:-1:-1;43313:89:0::2;::::0;-1:-1:-1;;;;;43313:30:0;;::::2;::::0;43352:10:::2;::::0;43373:13:::2;43198:79:::0;43313:30:::2;:89::i;:::-;43452:13;::::0;:39:::2;::::0;-1:-1:-1;;;43452:39:0;;-1:-1:-1;;;;;43452:13:0;;::::2;::::0;:23:::2;::::0;:39:::2;::::0;43476:6;;43484;;43452:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43551:14;43568:46;43599:14;43568:26;43587:6;43568:14;:18;;:26;;;;:::i;:46::-;43651:13;::::0;:51:::2;::::0;-1:-1:-1;;;43651:51:0;;43551:63;;-1:-1:-1;;;;;;43651:13:0::2;::::0;:27:::2;::::0;:51:::2;::::0;43679:6;;43551:63;;43695:6;;43651:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43770:26;43789:6;43770:14;:18;;:26;;;;:::i;:::-;43745:51:::0;;43832:26:::2;:14:::0;43851:6;43832:18:::2;:26::i;:::-;43807:22;::::0;::::2;:51:::0;43960:22;;43956:155:::2;;44029:1;44004:22;::::0;::::2;:26:::0;;;44045:19:::2;::::0;::::2;:23:::0;;;44083:12:::2;::::0;::::2;:16:::0;43956:155:::2;-1:-1:-1::0;;;;;44161:29:0;::::2;::::0;44157:204:::2;;44201:62;-1:-1:-1::0;;;;;44201:33:0;::::2;44243:10;44256:6:::0;44201:33:::2;:62::i;:::-;44157:204;;;44293:59;44332:10;44345:6;44293:30;:59::i;:::-;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;42197:2171:0:o;27004:242::-;-1:-1:-1;;;;;27197:19:0;;;27170:7;27197:19;;;:11;:19;;;;;;;;:34;;;;;;;;;;;:41;;27232:5;;27197:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27197:41:0;;27004:242;-1:-1:-1;;;;27004:242:0:o;30504:2648::-;18146:4;;;;;:9;18138:46;;;;-1:-1:-1;;;18138:46:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;30704:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;30696:80;;;;-1:-1:-1::0;;;30696:80:0::2;;;;;;;:::i;:::-;30802:1;30795:4;:8;:42;;;;-1:-1:-1::0;;;;;;30815:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;30807:30;::::2;;30795:42;30787:79;;;;-1:-1:-1::0;;;30787:79:0::2;;;;;;;:::i;:::-;30894:1;30885:6;:10;30877:49;;;;-1:-1:-1::0;;;30877:49:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30967:14:0;;::::2;30934:30;30967:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;;31005:10:::2;30967:50:::0;;;;;;;31053:22:::2;::::0;::::2;::::0;31111;;30967:50;;31053:22;;30934:30;;;31267:29;31263:484:::2;;31313:81;-1:-1:-1::0;;;;;31313:37:0;::::2;31359:10;31380:4;31387:6:::0;31313:37:::2;:81::i;:::-;-1:-1:-1::0;;;;;31470:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;31437:71:::2;::::0;31455:13;;31470:26:::2;31498:9;31437:17;:71::i;:::-;31409:99:::0;;-1:-1:-1;31409:99:0;-1:-1:-1;31263:484:0::2;;;31562:6;31549:9;:19;;31541:59;;;;-1:-1:-1::0;;;31541:59:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31676:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;31643:92:::2;::::0;31661:13;;31676:26:::2;31704:30;31712:9;31727:6:::0;31704:22:::2;:30::i;31643:92::-;31615:120:::0;;-1:-1:-1;31615:120:0;-1:-1:-1;31263:484:0::2;31821:19;::::0;::::2;::::0;31799::::2;31878:18:::0;;;;;:48:::2;;;31915:11;31900:12;:26;31878:48;:68;;;;-1:-1:-1::0;31930:16:0;;::::2;31878:68;31874:552;;;31969:123;31976:14;31992:11;32005:7;:12;;;32019:72;32035:14;32051;32067:10;32079:11;32019:15;:72::i;31969:123::-;32238:13;::::0;31963:129;;-1:-1:-1;32178:80:0::2;::::0;-1:-1:-1;;;;;32178:30:0;;::::2;::::0;32217:10:::2;::::0;32238:13:::2;31963:129:::0;32178:30:::2;:80::i;:::-;32317:13;::::0;-1:-1:-1;;;;;32349:26:0;;::::2;32317:13;32349:26:::0;;;:18:::2;:26;::::0;;;;;;;32317:59;;-1:-1:-1;;;32317:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;32341:6;;32349:26;::::2;::::0;32317:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;32405:6:0::2;32413:3;32396:21;;;;;;;:::i;:::-;;;;;;;;31874:552;32477:20;32500:58;32538:19;:10:::0;32553:3:::2;32538:14;:19::i;:::-;32500:33;32528:4:::0;32500:23:::2;:6:::0;32511:11;32500:10:::2;:23::i;:58::-;32569;::::0;-1:-1:-1;;;32569:58:0;;32477:81;;-1:-1:-1;;;;;;32569:23:0;::::2;::::0;::::2;::::0;:58:::2;::::0;32477:81;;32615:10:::2;::::0;32569:58:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32701:26;32720:6;32701:14;:18;;:26;;;;:::i;:::-;32676:51:::0;;32763:32:::2;:14:::0;32782:12;32763:18:::2;:32::i;:::-;32738:22;::::0;::::2;:57:::0;;;32828:12:::2;32806:19;::::0;::::2;:34:::0;32882:22;;32866:88:::2;::::0;32930:10;32942:11;32866:15:::2;:88::i;:::-;32851:12;::::0;::::2;:103:::0;32995:15:::2;::::0;::::2;::::0;::::2;;32991:154;;-1:-1:-1::0;;;;;;;;33036:19:0;;::::2;;::::0;;;:11:::2;:19;::::0;;;;;;;:34;;;::::2;::::0;;;;;;;;:60;;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;;-1:-1:-1;;;;;;33036:60:0::2;33084:10;33036:60;::::0;;-1:-1:-1;;;33111:15:0::2;::::0;;::::2;:22:::0;;-1:-1:-1;;33111:22:0::2;::::0;::::2;::::0;;-1:-1:-1;;;2679:22:0;30504:2648::o;24444:92::-;24518:10;;-1:-1:-1;;;;;24518:10:0;24444:92;:::o;25508:138::-;-1:-1:-1;;;;;25608:30:0;25581:7;25608:30;;;:15;:30;;;;;;;25508:138::o;26608:197::-;-1:-1:-1;;;;;26756:19:0;;;26729:7;26756:19;;;:11;:19;;;;;;;;:34;;;;;;;;;:41;26608:197;;;;;:::o;25760:101::-;25847:5;;-1:-1:-1;;;;;25847:5:0;25760:101;:::o;29249:111::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;29323:5:::1;:29:::0;;-1:-1:-1;;;;;;29323:29:0::1;-1:-1:-1::0;;;;;29323:29:0;;;::::1;::::0;;;::::1;::::0;;29249:111::o;28192:74::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28250:2:::1;:8:::0;28192:74::o;24833:73::-;24896:2;;24833:73;:::o;15793:25::-;;;-1:-1:-1;;;;;15793:25:0;;:::o;15973:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15973:51:0;;:::o;27380:79::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;27441:4:::1;:10:::0;;-1:-1:-1;;27441:10:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;27380:79::o;37959:1989::-;18146:4;;;;;:9;18138:46;;;;-1:-1:-1;;;18138:46:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;38159:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;38151:80;;;;-1:-1:-1::0;;;38151:80:0::2;;;;;;;:::i;:::-;38259:1;38250:6;:10;38242:47;;;;-1:-1:-1::0;;;38242:47:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38333:14:0;;::::2;38300:30;38333:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;38371:10:::2;38333:50:::0;;;;;38419:22:::2;::::0;::::2;::::0;38477;;38518:15:::2;::::0;::::2;::::0;::::2;;38510:53;;;;-1:-1:-1::0;;;38510:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38679:26:0;;::::2;38603:18;38679:26:::0;;;:18:::2;:26;::::0;;;;;38603:18;;;;38646:71:::2;::::0;38664:13;;38679:26:::2;38707:9;38646:17;:71::i;:::-;38792:19;::::0;::::2;::::0;38602:115;;-1:-1:-1;38602:115:0;-1:-1:-1;38770:19:0::2;38852:18:::0;;;;;:48:::2;;;38889:11;38874:12;:26;38852:48;:68;;;;-1:-1:-1::0;38904:16:0;;::::2;38852:68;38848:555;;;38943:123;38950:14;38966:11;38979:7;:12;;;38993:72;39009:14;39025;39041:10;39053:11;38993:15;:72::i;38943:123::-;39212:13;::::0;38937:129;;-1:-1:-1;39152:80:0::2;::::0;-1:-1:-1;;;;;39152:30:0;;::::2;::::0;39191:10:::2;::::0;39212:13:::2;38937:129:::0;39152:30:::2;:80::i;:::-;39291:13;::::0;-1:-1:-1;;;;;39323:26:0;;::::2;39291:13;39323:26:::0;;;:18:::2;:26;::::0;;;;;;;39291:59;;-1:-1:-1;;;39291:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;39315:6;;39323:26;::::2;::::0;39291:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;39379:6:0::2;39387:3;39370:21;;;;;;;:::i;:::-;;;;;;;;38848:555;39476:26;:14:::0;39495:6;39476:18:::2;:26::i;:::-;39451:22;::::0;::::2;:51:::0;;;39535:12:::2;39513:19;::::0;::::2;:34:::0;39573:80:::2;::::0;39589:14;;39629:10;39641:11;39573:15:::2;:80::i;:::-;39558:12;::::0;::::2;:95:::0;;;-1:-1:-1;;;;;39784:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;-1:-1:-1;39768:38:0::2;39760:76;;;;-1:-1:-1::0;;;39760:76:0::2;;;;;;;:::i;:::-;39888:52;::::0;-1:-1:-1;;;39888:52:0;;-1:-1:-1;;;;;39888:23:0;::::2;::::0;::::2;::::0;:52:::2;::::0;39912:6;;39928:10:::2;::::0;39888:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;;;37959:1989:0:o;18727:556::-;18897:7;;18934:57;18961:29;:12;18978:11;18961:16;:29::i;:::-;18953:2;;18934:22;;:14;;:18;:22::i;:57::-;18917:74;-1:-1:-1;19002:16:0;19021:17;:4;19030:7;19021:8;:17::i;:::-;19002:36;-1:-1:-1;19049:14:0;19066:87;19128:24;19136:1;19002:36;19128:14;:24::i;:::-;19066:57;19093:29;:12;19110:11;19093:16;:29::i;:::-;19085:2;;19066:22;;:14;;:18;:22::i;:87::-;19049:104;;19161:14;19178:20;19190:7;19178;;:11;;:20;;;;:::i;:::-;19161:37;-1:-1:-1;19213:62:0;19236:38;19247:26;19271:1;19247:19;19161:37;19258:7;19247:10;:19::i;:26::-;19236:6;;:10;:38::i;:::-;19213:18;:6;19224;19213:10;:18::i;:::-;:22;;:62::i;:::-;19206:69;;;;;;18727:556;;;;;;;:::o;19592:419::-;19809:7;19833:19;;;:39;;-1:-1:-1;19856:16:0;;19833:39;19829:80;;;-1:-1:-1;19896:1:0;19889:8;;19829:80;19923;19971:31;:11;19987:14;19971:15;:31::i;:::-;19923:43;19958:7;19923:30;:14;19942:10;19923:18;:30::i;:80::-;19916:87;19592:419;-1:-1:-1;;;;;19592:419:0:o;28388:84::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28451:7:::1;:13:::0;28388:84::o;17010:17::-;;;;;;:::o;26303:130::-;-1:-1:-1;;;;;26399:26:0;;;26372:7;26399:26;;;:18;:26;;;;;;;;26303:130::o;40130:1841::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;40324:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;40316:80;;;;-1:-1:-1::0;;;40316:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40440:14:0;;::::2;40407:30;40440:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;40478:10:::2;40440:50:::0;;;;;;;40526:22:::2;::::0;::::2;::::0;40584;;40634:26;;;:18:::2;:26:::0;;;;;;40440:50;;40526:22;;40584;40634:26:::2;40679:10:::0;;;;;:38:::2;;;40703:14;40693:6;:24;;40679:38;40671:75;;;;-1:-1:-1::0;;;40671:75:0::2;;;;;;;:::i;:::-;40765:15;::::0;::::2;::::0;::::2;;40757:53;;;;-1:-1:-1::0;;;40757:53:0::2;;;;;;;:::i;:::-;40850:18;40870:19:::0;40893:51:::2;40911:13;40926:6;40934:9;40893:17;:51::i;:::-;41019:19;::::0;::::2;::::0;40849:95;;-1:-1:-1;40849:95:0;-1:-1:-1;40997:19:0::2;41079:18:::0;;;;;:48:::2;;;41116:11;41101:12;:26;41079:48;:68;;;;-1:-1:-1::0;41131:16:0;;::::2;41079:68;41075:547;;;41170:123;41177:14;41193:11;41206:7;:12;;;41220:72;41236:14;41252;41268:10;41280:11;41220:15;:72::i;41170:123::-;41439:13;::::0;41164:129;;-1:-1:-1;41379:92:0::2;::::0;41418:10:::2;::::0;-1:-1:-1;;;;;41439:13:0::2;41455:15;:6:::0;41164:129;41455:10:::2;:15::i;:::-;-1:-1:-1::0;;;;;41379:30:0;::::2;::::0;:92;;:30:::2;:92::i;:::-;41530:13;::::0;:39:::2;::::0;-1:-1:-1;;;41530:39:0;;-1:-1:-1;;;;;41530:13:0;;::::2;::::0;:23:::2;::::0;:39:::2;::::0;41554:6;;41562;;41530:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;41598:6:0::2;41606:3;41589:21;;;;;;;:::i;:::-;;;;;;;;41075:547;41695:26;:14:::0;41714:6;41695:18:::2;:26::i;:::-;41670:22;::::0;::::2;:51:::0;;;41754:12:::2;41732:19;::::0;::::2;:34:::0;41792:80:::2;::::0;41808:14;;41848:10;41860:11;41792:15:::2;:80::i;:::-;41777:12;::::0;::::2;:95:::0;41912:13:::2;::::0;:51:::2;::::0;-1:-1:-1;;;41912:51:0;;-1:-1:-1;;;;;41912:13:0;;::::2;::::0;:27:::2;::::0;:51:::2;::::0;41940:6;;41948;;41956;;41912:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;;;;40130:1841:0:o;20658:1735::-;20971:11;21050:20;21138:15;21221;21249:29;;:::i;:::-;-1:-1:-1;;;;;;21281:14:0;;;;;;;:6;:14;;;;;;;;:29;;;;;;;;;;:45;;;;;;;;;;;;21249:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21341:27;:58;;;;-1:-1:-1;21372:22:0;;;;:27;21341:58;21337:107;;;21424:1;21426;21428;21430;21416:16;;;;;;;;;;;21337:107;-1:-1:-1;;;;;21497:26:0;;;21454:19;21497:26;;;:18;:26;;;;;;21454:19;;21476:69;;21497:26;21525:11;21516:6;21476:20;:69::i;:::-;21617:22;;;;21641:19;;;;21662:12;;;;21692:22;;21454:91;;-1:-1:-1;21583:10:0;;21610:161;;21617:22;21641:19;21662:12;21676:94;;21617:22;21583:10;21454:91;21676:15;:94::i;21610:161::-;21813:22;;21837;;;;21604:167;;-1:-1:-1;21797:103:0;;21837:31;;21604:167;21837:26;:31::i;:::-;21870:16;21888:11;21797:15;:103::i;:::-;21782:118;-1:-1:-1;21911:20:0;21934:26;:10;21949;21934:14;:26::i;:::-;21911:49;;21991:12;21975;:28;21971:415;;22030:1;22020:11;;22056:1;22046:11;;21971:415;;;22100:120;22127:92;22189:29;:12;22206:11;22189:16;:29::i;:::-;22127:57;22176:7;22127:44;22154:16;22127:7;:22;;;:26;;:44;;;;:::i;:92::-;22100:22;;;:26;:120::i;:::-;22351:22;;;;22090:130;;-1:-1:-1;22245:129:0;;:101;22307:38;22315:7;22328:16;22307:20;:38::i;:::-;22245:22;;:57;;22289:12;;22245:39;;22272:11;22245:26;:39::i;:101::-;:105;;:129::i;:::-;22235:139;;21971:415;20658:1735;;;;;;;;;;;;;;;;:::o;28973:164::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;29110:19:::1;:3:::0;29118:10:::1;29110:7;:19::i;:::-;-1:-1:-1::0;;;;;29085:22:0;;::::1;;::::0;;;:7:::1;:22;::::0;;;;:44;;;;-1:-1:-1;28973:164:0:o;28620:191::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28784:19:::1;:3:::0;28792:10:::1;28784:7;:19::i;:::-;-1:-1:-1::0;;;;;28751:30:0;;::::1;;::::0;;;:15:::1;:30;::::0;;;;:52;;;;-1:-1:-1;28620:191:0:o;27960:115::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28032:13:::1;:35:::0;;-1:-1:-1;;;;;;28032:35:0::1;-1:-1:-1::0;;;;;28032:35:0;;;::::1;::::0;;;::::1;::::0;;27960:115::o;25254:119::-;-1:-1:-1;;;;;25343:22:0;25319:7;25343:22;;;:7;:22;;;;;;;25254:119::o;35657:2118::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;35832:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;35824:80;;;;-1:-1:-1::0;;;35824:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35945:14:0;;::::2;35912:30;35945:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;35983:10:::2;35945:50:::0;;;;;36031:22:::2;::::0;::::2;::::0;36089;;36130:10;;;;;:38:::2;;;36154:14;36144:6;:24;;36130:38;36122:75;;;;-1:-1:-1::0;;;36122:75:0::2;;;;;;;:::i;:::-;36216:15;::::0;::::2;::::0;::::2;;36208:53;;;;-1:-1:-1::0;;;36208:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36374:26:0;;::::2;36298:18;36374:26:::0;;;:18:::2;:26;::::0;;;;;36298:18;;;;36341:71:::2;::::0;36359:13;;36374:26:::2;36402:9;36341:17;:71::i;:::-;36487:19;::::0;::::2;::::0;36297:115;;-1:-1:-1;36297:115:0;-1:-1:-1;36465:19:0::2;36544:18:::0;;;;;:48:::2;;;36581:11;36566:12;:26;36544:48;:68;;;;-1:-1:-1::0;36596:16:0;;::::2;36544:68;36540:552;;;36635:123;36642:14;36658:11;36671:7;:12;;;36685:72;36701:14;36717;36733:10;36745:11;36685:15;:72::i;36635:123::-;36904:13;::::0;36629:129;;-1:-1:-1;36844:80:0::2;::::0;-1:-1:-1;;;;;36844:30:0;;::::2;::::0;36883:10:::2;::::0;36904:13:::2;36629:129:::0;36844:30:::2;:80::i;:::-;36983:13;::::0;-1:-1:-1;;;;;37015:26:0;;::::2;36983:13;37015:26:::0;;;:18:::2;:26;::::0;;;;;;;36983:59;;-1:-1:-1;;;36983:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;37007:6;;37015:26;::::2;::::0;36983:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;37071:6:0::2;37079:3;37062:21;;;;;;;:::i;:::-;;;;;;;;36540:552;37162:26;:14:::0;37181:6;37162:18:::2;:26::i;:::-;37137:51:::0;;;37218:12:::2;37196:19;::::0;::::2;:34:::0;37256:80:::2;::::0;37296:14;37312:10;37324:11;37256:15:::2;:80::i;:::-;37241:12;::::0;::::2;:95:::0;;;-1:-1:-1;;;;;37464:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;-1:-1:-1;37448:38:0::2;37440:76;;;;-1:-1:-1::0;;;37440:76:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37568:29:0;::::2;::::0;37564:204:::2;;37608:62;-1:-1:-1::0;;;;;37608:33:0;::::2;37650:10;37663:6:::0;37608:33:::2;:62::i;:::-;37564:204;;;37700:59;37739:10;37752:6;37700:30;:59::i;:::-;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;35657:2118:0:o;26021:130::-;-1:-1:-1;;;;;26117:26:0;;;26090:7;26117:26;;;:18;:26;;;;;;;;26021:130::o;27649:217::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27814:21:0;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;:36;;;::::1;::::0;;;;;;;;;:44;;-1:-1:-1;;27814:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27649:217::o;30106:163::-;30162:13;;;;;;;;;-1:-1:-1;;;;;30162:13:0;-1:-1:-1;;;;;30162:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30149:10;:42;;-1:-1:-1;;;;;;30149:42:0;-1:-1:-1;;;;;30149:42:0;;;;;;;;30210:10;30202:59;;;;-1:-1:-1;;;30202:59:0;;;;;;;:::i;:::-;30106:163::o;24626:107::-;24711:13;;-1:-1:-1;;;;;24711:13:0;24626:107;:::o;25026:83::-;25094:7;;25026:83;:::o;22619:556::-;22802:7;22843:2;;-1:-1:-1;;;;;22892:26:0;;;22888:95;;22952:10;-1:-1:-1;;;;;22945:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22929:45;;;;22888:95;-1:-1:-1;;;;;22996:27:0;;;22992:98;;23058:11;-1:-1:-1;;;;;23051:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23034:47;;;;22992:98;23104:63;23153:13;23149:2;:17;23104:40;23129:14;23125:2;:18;23104:16;:20;;:40;;;;:::i;:63::-;23097:70;22619:556;-1:-1:-1;;;;;;22619:556:0:o;29581:441::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29694:26:0;;::::1;29732:3;29694:26:::0;;;:18:::1;:26;::::0;;;;;::::1;:42:::0;29686:90:::1;;;;-1:-1:-1::0;;;29686:90:0::1;;;;;;;:::i;:::-;29803:13;::::0;-1:-1:-1;;;;;29803:13:0::1;29787:71;;;;-1:-1:-1::0;;;29787:71:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29869:26:0;;::::1;;::::0;;;:18:::1;:26;::::0;;;;;;;:44;;;;::::1;-1:-1:-1::0;;;;;;29869:44:0;;::::1;::::0;::::1;::::0;;;29924:35;;;:18:::1;:35:::0;;;;;;;:44;;;;::::1;::::0;;::::1;::::0;;;29979:13:::1;::::0;:35;;-1:-1:-1;;;29979:35:0;;:13;::::1;::::0;:27:::1;::::0;:35:::1;::::0;29888:6;;29979:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29581:441:::0;;:::o;15870:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15870:51:0;;:::o;5265:203::-;5365:95;5384:5;5414:27;;;5443:4;5449:2;5453:5;5391:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5391:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5391:68:0;-1:-1:-1;;;;;;5391:68:0;;;;;;;;;;5365:18;:95::i;:::-;5265:203;;;;:::o;45850:405::-;46168:5;;:76;;-1:-1:-1;;;46168:76:0;;46018:18;;;;-1:-1:-1;;;;;46168:5:0;;;;:23;;46198:10;;46168:76;;46210:13;;46225:6;;46233:10;;46168:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46140:104;;;;-1:-1:-1;45850:405:0;-1:-1:-1;;;;45850:405:0:o;10593:129::-;10677:5;;;10672:16;;;;10664:50;;;;-1:-1:-1;;;10664:50:0;;;;;;;:::i;10457:128::-;10541:5;;;10536:16;;;;10528:49;;;;-1:-1:-1;;;10528:49:0;;;;;;;:::i;44640:914::-;44878:22;;;;44936;;44853;45065:80;44936:22;44878;45121:10;45133:11;45065:15;:80::i;:::-;45042:103;;45156:11;45203:1;45186:14;:18;:56;;;;;45223:7;:19;;;45208:12;:34;45186:56;:84;;;;-1:-1:-1;45246:19:0;;;;:24;;45186:84;45182:194;;;45293:71;45300:14;45316:7;:19;;;45337:7;:12;;;45351;45293:6;:71::i;:::-;45287:77;;45182:194;-1:-1:-1;;;;;45478:30:0;;;;;;:15;:30;;;;;;45394:81;45410:14;45426:23;:14;45445:3;45426:18;:23::i;:::-;45451:10;45463:11;45394:15;:81::i;:::-;:114;45386:160;;;;-1:-1:-1;;;45386:160:0;;;;;;;:::i;:::-;44640:914;;;;;;;;:::o;10730:142::-;10782:6;10809;;;:30;;-1:-1:-1;;10824:5:0;;;10838:1;10833;10824:5;10833:1;10819:15;;;;;:20;10809:30;10801:63;;;;-1:-1:-1;;;10801:63:0;;;;;;;:::i;10880:220::-;10932:6;10963:1;10959;:5;10951:34;;;;-1:-1:-1;;;10951:34:0;;;;;;;:::i;:::-;11004:1;11000;:5;;;;;;;10880:220;-1:-1:-1;;;10880:220:0:o;5082:175::-;5164:85;5183:5;5213:23;;;5238:2;5242:5;5190:58;;;;;;;;;:::i;5164:85::-;5082:175;;;:::o;8891:195::-;8999:12;;;8961;8999;;;;;;;;;-1:-1:-1;;;;;8978:7:0;;;8992:5;;8978:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8960:52;;;9031:7;9023:55;;;;-1:-1:-1;;;9023:55:0;;;;;;;:::i;6412:448::-;6499:27;6507:5;-1:-1:-1;;;;;6499:25:0;;:27::i;:::-;6491:71;;;;-1:-1:-1;;;6491:71:0;;;;;;;:::i;:::-;6574:12;6588:23;6623:5;-1:-1:-1;;;;;6615:19:0;6635:4;6615:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6573:67;;;;6659:7;6651:52;;;;-1:-1:-1;;;6651:52:0;;;;;;;:::i;:::-;6718:17;;:21;6714:139;;6775:10;6764:30;;;;;;;;;;;;:::i;:::-;6756:85;;;;-1:-1:-1;;;6756:85:0;;;;;;;:::i;4291:317::-;4351:4;4517:20;;4417:66;4557:23;;;;;;:42;;-1:-1:-1;;4584:15:0;;;4549:51;-1:-1:-1;;4291:317:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1097:241::-;;1201:2;1189:9;1180:7;1176:23;1172:32;1169:2;;;-1:-1;;1207:12;1169:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1259:63;1163:175;-1:-1;;;1163:175::o;1345:263::-;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;-1:-1;;1466:12;1428:2;226:6;220:13;238:33;265:5;238:33;:::i;1615:366::-;;;1736:2;1724:9;1715:7;1711:23;1707:32;1704:2;;;-1:-1;;1742:12;1704:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1794:63;-1:-1;1894:2;1933:22;;72:20;97:33;72:20;97:33;:::i;:::-;1902:63;;;;1698:283;;;;;:::o;1988:491::-;;;;2126:2;2114:9;2105:7;2101:23;2097:32;2094:2;;;-1:-1;;2132:12;2094:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2184:63;-1:-1;2284:2;2323:22;;72:20;97:33;72:20;97:33;:::i;:::-;2292:63;-1:-1;2392:2;2431:22;;72:20;97:33;72:20;97:33;:::i;:::-;2400:63;;;;2088:391;;;;;:::o;2486:617::-;;;;;2641:3;2629:9;2620:7;2616:23;2612:33;2609:2;;;-1:-1;;2648:12;2609:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2700:63;-1:-1;2800:2;2839:22;;72:20;97:33;72:20;97:33;:::i;:::-;2808:63;-1:-1;2908:2;2947:22;;72:20;97:33;72:20;97:33;:::i;:::-;2603:500;;;;-1:-1;2916:63;;3016:2;3055:22;616:20;;-1:-1;;2603:500::o;3110:485::-;;;;3245:2;3233:9;3224:7;3220:23;3216:32;3213:2;;;-1:-1;;3251:12;3213:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3303:63;-1:-1;3403:2;3442:22;;72:20;97:33;72:20;97:33;:::i;:::-;3411:63;-1:-1;3511:2;3547:22;;347:20;372:30;347:20;372:30;:::i;3602:491::-;;;;3740:2;3728:9;3719:7;3715:23;3711:32;3708:2;;;-1:-1;;3746:12;3708:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3798:63;-1:-1;3898:2;3937:22;;72:20;97:33;72:20;97:33;:::i;:::-;3702:391;;3906:63;;-1:-1;;;4006:2;4045:22;;;;616:20;;3702:391::o;4100:617::-;;;;;4255:3;4243:9;4234:7;4230:23;4226:33;4223:2;;;-1:-1;;4262:12;4223:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4314:63;-1:-1;4414:2;4453:22;;72:20;97:33;72:20;97:33;:::i;:::-;4217:500;;4422:63;;-1:-1;;;;4522:2;4561:22;;616:20;;4630:2;4669:22;616:20;;4217:500::o;4724:869::-;;;;;;;4913:3;4901:9;4892:7;4888:23;4884:33;4881:2;;;-1:-1;;4920:12;4881:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4972:63;-1:-1;5072:2;5111:22;;72:20;97:33;72:20;97:33;:::i;:::-;4875:718;;5080:63;;-1:-1;;;;5180:2;5219:22;;616:20;;5288:2;5327:22;;616:20;;5396:3;5436:22;;616:20;;-1:-1;5505:3;5545:22;;;616:20;;-1:-1;4875:718::o;5600:366::-;;;5721:2;5709:9;5700:7;5696:23;5692:32;5689:2;;;-1:-1;;5727:12;5689:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5779:63;5879:2;5918:22;;;;616:20;;-1:-1;;;5683:283::o;5973:491::-;;;;6111:2;6099:9;6090:7;6086:23;6082:32;6079:2;;;-1:-1;;6117:12;6079:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6169:63;-1:-1;6269:2;6308:22;;616:20;;-1:-1;6377:2;6416:22;;72:20;97:33;72:20;97:33;:::i;6471:257::-;;6583:2;6571:9;6562:7;6558:23;6554:32;6551:2;;;-1:-1;;6589:12;6551:2;495:6;489:13;507:30;531:5;507:30;:::i;6735:241::-;;6839:2;6827:9;6818:7;6814:23;6810:32;6807:2;;;-1:-1;;6845:12;6807:2;-1:-1;616:20;;6801:175;-1:-1;6801:175::o;6983:399::-;;;7115:2;7103:9;7094:7;7090:23;7086:32;7083:2;;;-1:-1;;7121:12;7083:2;-1:-1;;764:13;;7284:2;7334:22;;;764:13;;;;;-1:-1;7077:305::o;7389:617::-;;;;;7544:3;7532:9;7523:7;7519:23;7515:33;7512:2;;;-1:-1;;7551:12;7512:2;-1:-1;;616:20;;;7703:2;7742:22;;616:20;;-1:-1;7811:2;7850:22;;616:20;;7919:2;7958:22;616:20;;-1:-1;7506:500;-1:-1;7506:500::o;8013:237::-;;8115:2;8103:9;8094:7;8090:23;8086:32;8083:2;;;-1:-1;;8121:12;8083:2;905:6;892:20;917:31;942:5;917:31;:::i;8257:259::-;;8370:2;8358:9;8349:7;8345:23;8341:32;8338:2;;;-1:-1;;8376:12;8338:2;1042:6;1036:13;1054:31;1079:5;1054:31;:::i;17028:271::-;;9063:5;30993:12;-1:-1;32296:101;32310:6;32307:1;32304:13;32296:101;;;9207:4;32377:11;;;;;32371:18;32358:11;;;32351:39;32325:10;32296:101;;;32412:6;32409:1;32406:13;32403:2;;;-1:-1;32468:6;32463:3;32459:16;32452:27;32403:2;-1:-1;9238:16;;;;;17162:137;-1:-1;;17162:137::o;17306:222::-;-1:-1;;;;;31611:54;;;;8743:37;;17433:2;17418:18;;17404:124::o;17535:333::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;17854:2;17839:18;;8743:37;17690:2;17675:18;;17661:207::o;17875:460::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;;18230:2;18215:18;;8743:37;31611:54;;;18321:2;18306:18;;8602:58;18066:2;18051:18;;18037:298::o;18342:444::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;;;18689:2;18674:18;;8743:37;18772:2;18757:18;;16865:37;;;;18525:2;18510:18;;18496:290::o;18793:333::-;-1:-1;;;;;31611:54;;;;8743:37;;19112:2;19097:18;;16865:37;18948:2;18933:18;;18919:207::o;19133:444::-;-1:-1;;;;;31611:54;;;8743:37;;19480:2;19465:18;;16865:37;;;;31611:54;;;19563:2;19548:18;;8743:37;19316:2;19301:18;;19287:290::o;19584:416::-;19784:2;19798:47;;;9491:2;19769:18;;;31291:19;-1:-1;;;31331:14;;;9507:44;9570:12;;;19755:245::o;20007:416::-;20207:2;20221:47;;;9821:2;20192:18;;;31291:19;9857:26;31331:14;;;9837:47;9903:12;;;20178:245::o;20430:416::-;20630:2;20644:47;;;10154:2;20615:18;;;31291:19;-1:-1;;;31331:14;;;10170:43;10232:12;;;20601:245::o;20853:416::-;21053:2;21067:47;;;10483:2;21038:18;;;31291:19;10519:26;31331:14;;;10499:47;10565:12;;;21024:245::o;21276:416::-;21476:2;21490:47;;;10816:2;21461:18;;;31291:19;-1:-1;;;31331:14;;;10832:43;10894:12;;;21447:245::o;21699:416::-;21899:2;21913:47;;;11145:2;21884:18;;;31291:19;-1:-1;;;31331:14;;;11161:43;11223:12;;;21870:245::o;22122:416::-;22322:2;22336:47;;;22307:18;;;31291:19;11510:34;31331:14;;;11490:55;11564:12;;;22293:245::o;22545:416::-;22745:2;22759:47;;;11815:2;22730:18;;;31291:19;11851:29;31331:14;;;11831:50;11900:12;;;22716:245::o;22968:416::-;23168:2;23182:47;;;12151:2;23153:18;;;31291:19;12187:27;31331:14;;;12167:48;12234:12;;;23139:245::o;23391:416::-;23591:2;23605:47;;;12485:2;23576:18;;;31291:19;12521:34;31331:14;;;12501:55;-1:-1;;;12576:12;;;12569:25;12613:12;;;23562:245::o;23814:416::-;24014:2;24028:47;;;12864:2;23999:18;;;31291:19;12900:26;31331:14;;;12880:47;12946:12;;;23985:245::o;24237:416::-;24437:2;24451:47;;;13197:2;24422:18;;;31291:19;-1:-1;;;31331:14;;;13213:44;13276:12;;;24408:245::o;24660:416::-;24860:2;24874:47;;;13527:2;24845:18;;;31291:19;13563:27;31331:14;;;13543:48;13610:12;;;24831:245::o;25083:416::-;25283:2;25297:47;;;13861:2;25268:18;;;31291:19;13897:28;31331:14;;;13877:49;13945:12;;;25254:245::o;25506:416::-;25706:2;25720:47;;;14196:2;25691:18;;;31291:19;-1:-1;;;31331:14;;;14212:39;14270:12;;;25677:245::o;25929:416::-;26129:2;26143:47;;;14521:2;26114:18;;;31291:19;14557:34;31331:14;;;14537:55;-1:-1;;;14612:12;;;14605:27;14651:12;;;26100:245::o;26352:416::-;26552:2;26566:47;;;14902:2;26537:18;;;31291:19;14938:33;31331:14;;;14918:54;14991:12;;;26523:245::o;26775:416::-;26975:2;26989:47;;;15242:2;26960:18;;;31291:19;15278:34;31331:14;;;15258:55;-1:-1;;;15333:12;;;15326:34;15379:12;;;26946:245::o;27198:416::-;27398:2;27412:47;;;15630:2;27383:18;;;31291:19;15666:34;31331:14;;;15646:55;-1:-1;;;15721:12;;;15714:27;15760:12;;;27369:245::o;27621:416::-;27821:2;27835:47;;;16011:2;27806:18;;;31291:19;16047:33;31331:14;;;16027:54;16100:12;;;27792:245::o;28044:416::-;28244:2;28258:47;;;16351:2;28229:18;;;31291:19;16387:33;31331:14;;;16367:54;16440:12;;;28215:245::o;28467:416::-;28667:2;28681:47;;;16691:2;28652:18;;;31291:19;-1:-1;;;31331:14;;;16707:42;16768:12;;;28638:245::o;28890:222::-;16865:37;;;29017:2;29002:18;;28988:124::o;29119:333::-;16865:37;;;-1:-1;;;;;31611:54;29438:2;29423:18;;8743:37;29274:2;29259:18;;29245:207::o;29459:556::-;16865:37;;;29835:2;29820:18;;16865:37;;;;29918:2;29903:18;;16865:37;30001:2;29986:18;;16865:37;29670:3;29655:19;;29641:374::o;30022:656::-;16865:37;;;30420:2;30405:18;;16865:37;;;;30503:2;30488:18;;16865:37;;;;30586:2;30571:18;;16865:37;31523:13;31516:21;30663:3;30648:19;;8857:34;30255:3;30240:19;;30226:452::o;30685:214::-;31827:4;31816:16;;;;16981:35;;30808:2;30793:18;;30779:120::o;32500:117::-;-1:-1;;;;;31611:54;;32559:35;;32549:2;;32608:1;;32598:12;32549:2;32543:74;:::o;32624:111::-;32705:5;31523:13;31516:21;32683:5;32680:32;32670:2;;32726:1;;32716:12;32866:113;31827:4;32949:5;31816:16;32926:5;32923:33;32913:2;;32970:1;;32960:12

Swarm Source

ipfs://18e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c1483

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.