ETH Price: $1,939.69 (+1.47%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Liquidate Accoun...115029182020-12-22 11:11:291544 days ago1608635489IN
0xBa539B9a...094f9541c
0 ETH0.0270295860
Upgrade Warp114874202020-12-20 2:13:261546 days ago1608430406IN
0xBa539B9a...094f9541c
0 ETH0.0262034200
Start Upgrade Ti...114743522020-12-18 2:06:581548 days ago1608257218IN
0xBa539B9a...094f9541c
0 ETH0.0042587867
Borrow SC114727172020-12-17 20:06:141549 days ago1608235574IN
0xBa539B9a...094f9541c
0 ETH0.06609156126.5
Borrow SC114724392020-12-17 19:04:341549 days ago1608231874IN
0xBa539B9a...094f9541c
0 ETH0.0258028260
Borrow SC114722772020-12-17 18:31:191549 days ago1608229879IN
0xBa539B9a...094f9541c
0 ETH0.13396791311
Borrow SC114721652020-12-17 18:04:381549 days ago1608228278IN
0xBa539B9a...094f9541c
0 ETH0.1463328300
Borrow SC114719932020-12-17 17:24:161549 days ago1608225856IN
0xBa539B9a...094f9541c
0 ETH0.06641138149
Borrow SC114707992020-12-17 13:02:421549 days ago1608210162IN
0xBa539B9a...094f9541c
0 ETH0.0445730986.9
Borrow SC114672342020-12-16 23:48:091549 days ago1608162489IN
0xBa539B9a...094f9541c
0 ETH0.0199124947.3
Borrow SC114670802020-12-16 23:15:551550 days ago1608160555IN
0xBa539B9a...094f9541c
0 ETH0.0452225290.5577077
Borrow SC114663512020-12-16 20:31:211550 days ago1608150681IN
0xBa539B9a...094f9541c
0 ETH0.0199516943
Borrow SC114663092020-12-16 20:22:211550 days ago1608150141IN
0xBa539B9a...094f9541c
0 ETH0.017715544
Borrow SC114662932020-12-16 20:19:181550 days ago1608149958IN
0xBa539B9a...094f9541c
0 ETH0.0168302241.8
Borrow SC114662612020-12-16 20:10:521550 days ago1608149452IN
0xBa539B9a...094f9541c
0 ETH0.0131145745
Borrow SC114662612020-12-16 20:10:521550 days ago1608149452IN
0xBa539B9a...094f9541c
0 ETH0.0189588647
Borrow SC114662322020-12-16 20:04:241550 days ago1608149064IN
0xBa539B9a...094f9541c
0 ETH0.0211573649
Borrow SC114661712020-12-16 19:48:411550 days ago1608148121IN
0xBa539B9a...094f9541c
0 ETH0.0329280676
Borrow SC114659852020-12-16 19:07:301550 days ago1608145650IN
0xBa539B9a...094f9541c
0 ETH0.0149970637.4
Borrow SC114659302020-12-16 18:56:181550 days ago1608144978IN
0xBa539B9a...094f9541c
0 ETH0.0367552890
Borrow SC114649712020-12-16 15:34:391550 days ago1608132879IN
0xBa539B9a...094f9541c
0 ETH0.05757624120
Transfer Ownersh...114622672020-12-16 5:36:581550 days ago1608097018IN
0xBa539B9a...094f9541c
0 ETH0.0016985655
Create New LP Va...114622652020-12-16 5:36:561550 days ago1608097016IN
0xBa539B9a...094f9541c
0 ETH0.0961533155
Create New LP Va...114622632020-12-16 5:36:431550 days ago1608097003IN
0xBa539B9a...094f9541c
0 ETH0.1048407855
Create New LP Va...114622112020-12-16 5:24:321550 days ago1608096272IN
0xBa539B9a...094f9541c
0 ETH0.293868955
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-114621932020-12-16 5:20:561550 days ago1608096056
0xBa539B9a...094f9541c
 Contract Creation0 ETH
-114621882020-12-16 5:19:371550 days ago1608095977
0xBa539B9a...094f9541c
 Contract Creation0 ETH
-114621862020-12-16 5:19:061550 days ago1608095946
0xBa539B9a...094f9541c
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WarpControl

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-16
*/

// File: node_modules\@openzeppelin\contracts\GSN\Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin\contracts\access\Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin\contracts\math\SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts\interfaces\WarpVaultSCI.sol

pragma solidity ^0.6.0;

////////////////////////////////////////////////////////////////////////////////////////////
/// @title WarpVaultSCI
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
The WarpVaultSCI contract an abstract contract the WarpControl contract uses to interface
    with a WarpVaultSC contract.
**/

abstract contract WarpVaultSCI {
    uint256 public totalReserves;

    function borrowBalanceCurrent(address account)
        public
        virtual
        returns (uint256);

    function borrowBalancePrior(address account)
        public
        virtual
        view
        returns (uint256);

    function exchangeRateCurrent() public virtual returns (uint256);

    function _borrow(uint256 _borrowAmount, address _borrower) external virtual;

    function _repayLiquidatedLoan(
        address _borrower,
        address _liquidator,
        uint256 _amount
    ) public virtual;

    function setNewInterestModel(address _newModel) public virtual;

    function getSCDecimals() public virtual view returns (uint8);

    function getSCAddress() public virtual view returns (address);

    function updateWarpControl(address _warpControl) public virtual;

    function updateTeam(address _warpTeam) public virtual;

    function viewAccountBalance(address _account)
        public
        virtual
        view
        returns (uint256);
}

// File: contracts\interfaces\WarpVaultLPI.sol

pragma solidity ^0.6.0;

////////////////////////////////////////////////////////////////////////////////////////////
/// @title WarpVaultLPI
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
The WarpVaultLPI contract an abstract contract the WarpControl contract uses to interface
    with a WarpVaultLP contract.
**/

abstract contract WarpVaultLPI {
    function getAssetAdd() public virtual view returns (address);

    function collateralOfAccount(address _account)
        public
        virtual
        view
        returns (uint256);

    function _liquidateAccount(address _account, address _liquidator)
        public
        virtual;

    function updateWarpControl(address _warpControl) public virtual;
}

// File: contracts\interfaces\WarpVaultLPFactoryI.sol

pragma solidity ^0.6.0;

////////////////////////////////////////////////////////////////////////////////////////////
/// @title WarpVaultLPFactoryI
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
The WarpVaultLPFactory contract is designed to produce individual WarpVaultLP contracts
**/

abstract contract WarpVaultLPFactoryI {
    function createWarpVaultLP(
        uint256 _timelock,
        address _lp,
        string memory _lpName
    ) public virtual returns (address);
}

// File: contracts\interfaces\WarpVaultSCFactoryI.sol

pragma solidity ^0.6.0;

////////////////////////////////////////////////////////////////////////////////////////////
/// @title WarpVaultSCFactoryI
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
The WarpVaultSCFactoryI contract is used by the Warp Control contract to interface with the WarpVaultSCFactory contract
**/

abstract contract WarpVaultSCFactoryI {
    function createNewWarpVaultSC(
        address _InterestRate,
        address _StableCoin,
        address _warpTeam,
        uint256 _initialExchangeRate,
        uint256 _timelock,
        uint256 _reserveFactorMantissa
    ) public virtual returns (address);
}

// File: contracts\interfaces\UniswapLPOracleFactoryI.sol

pragma solidity ^0.6.0;

////////////////////////////////////////////////////////////////////////////////////////////
/// @title UniswapLPOracleFactoryI
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
The UniswapLPOracleFactoryI contract an abstract contract the Warp platform uses to interface
    With the UniswapOracleFactory to retrieve token prices.
**/

abstract contract UniswapLPOracleFactoryI {
    function createNewOracles(
        address _tokenA,
        address _tokenB,
        address _lpToken
    ) public virtual;

    function OneUSDC() public virtual view returns (uint256);

    function getUnderlyingPrice(address _MMI) public virtual returns (uint256);

    function viewUnderlyingPrice(address _MMI)
        public
        virtual
        view
        returns (uint256);

    function getPriceOfToken(address _token, uint256 _amount)
        public
        virtual
        returns (uint256);

    function viewPriceOfToken(address token, uint256 _amount)
        public
        virtual
        view
        returns (uint256);

    function transferOwnership(address _newOwner) public virtual;

    function _calculatePriceOfLP(
        uint256 supply,
        uint256 value0,
        uint256 value1,
        uint8 supplyDecimals
    ) public virtual pure returns (uint256);
}

// File: contracts\compound\BaseJumpRateModelV2.sol

pragma solidity ^0.6.0;


/**
  * @title Logic for Compound's JumpRateModel Contract V2.
  * @author Compound (modified by Dharma Labs, refactored by Arr00)
  * @notice Version 2 modifies Version 1 by enabling updateable parameters.
  */
contract BaseJumpRateModelV2 {
    using SafeMath for uint;

    event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock, uint jumpMultiplierPerBlock, uint kink);

    /**
     * @notice The address of the owner, i.e. the Timelock contract, which can update parameters directly
     */
    address public owner;

    /**
     * @notice The approximate number of blocks per year that is assumed by the interest rate model
     */
    uint public constant blocksPerYear = 2102400;

    /**
     * @notice The multiplier of utilization rate that gives the slope of the interest rate
     */
    uint public multiplierPerBlock;

    /**
     * @notice The base interest rate which is the y-intercept when utilization rate is 0
     */
    uint public baseRatePerBlock;

    /**
     * @notice The multiplierPerBlock after hitting a specified utilization point
     */
    uint public jumpMultiplierPerBlock;

    /**
     * @notice The utilization point at which the jump multiplier is applied
     */
    uint public kink;

    /**
     * @notice Construct an interest rate model
     * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18)
     * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18)
     * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point
     * @param kink_ The utilization point at which the jump multiplier is applied
     * @param owner_ The address of the owner, i.e. the Timelock contract (which has the ability to update parameters directly)
     */
    constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_, address owner_) internal {
        owner = owner_;

        updateJumpRateModelInternal(baseRatePerYear,  multiplierPerYear, jumpMultiplierPerYear, kink_);
    }

    /**
     * @notice Update the parameters of the interest rate model (only callable by owner, i.e. Timelock)
     * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18)
     * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18)
     * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point
     * @param kink_ The utilization point at which the jump multiplier is applied
     */
    function updateJumpRateModel(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) external {
        require(msg.sender == owner, "only the owner may call this function.");

        updateJumpRateModelInternal(baseRatePerYear, multiplierPerYear, jumpMultiplierPerYear, kink_);
    }

    /**
     * @notice Calculates the utilization rate of the market: `borrows / (cash + borrows - reserves)`
     * @param cash The amount of cash in the market
     * @param borrows The amount of borrows in the market
     * @param reserves The amount of reserves in the market (currently unused)
     * @return The utilization rate as a mantissa between [0, 1e18]
     */
    function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) {
        // Utilization rate is 0 when there are no borrows
        if (borrows == 0) {
            return 0;
        }

        return borrows.mul(1e18).div(cash.add(borrows).sub(reserves));
    }

    /**
     * @notice Calculates the current borrow rate per block, with the error code expected by the market
     * @param cash The amount of cash in the market
     * @param borrows The amount of borrows in the market
     * @param reserves The amount of reserves in the market
     * @return The borrow rate percentage per block as a mantissa (scaled by 1e18)
     */
    function getBorrowRateInternal(uint cash, uint borrows, uint reserves) internal view returns (uint) {
        uint util = utilizationRate(cash, borrows, reserves);

        if (util <= kink) {
            return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
        } else {
            uint normalRate = kink.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
            uint excessUtil = util.sub(kink);
            return excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(normalRate);
        }
    }

    /**
     * @notice Calculates the current supply rate per block
     * @param cash The amount of cash in the market
     * @param borrows The amount of borrows in the market
     * @param reserves The amount of reserves in the market
     * @param reserveFactorMantissa The current reserve factor for the market
     * @return The supply rate percentage per block as a mantissa (scaled by 1e18)
     */
    function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) public  view returns (uint) {
        uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa);
        uint borrowRate = getBorrowRateInternal(cash, borrows, reserves);
        uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18);
        return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18);
    }

    /**
     * @notice Internal function to update the parameters of the interest rate model
     * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18)
     * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18)
     * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point
     * @param kink_ The utilization point at which the jump multiplier is applied
     */
    function updateJumpRateModelInternal(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) internal {
        baseRatePerBlock = baseRatePerYear.div(blocksPerYear);
        multiplierPerBlock = (multiplierPerYear.mul(1e18)).div(blocksPerYear.mul(kink_));
        jumpMultiplierPerBlock = jumpMultiplierPerYear.div(blocksPerYear);
        kink = kink_;

        emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink);
    }


}

// File: contracts\compound\JumpRateModelV2.sol

pragma solidity ^0.6.0;




/**
  * @title Compound's JumpRateModel Contract V2 for V2 cTokens
  * @author Arr00
  * @notice Supports only for V2 cTokens
  */
contract JumpRateModelV2 is  BaseJumpRateModelV2  {

	/**
     * @notice Calculates the current borrow rate per block
     * @param cash The amount of cash in the market
     * @param borrows The amount of borrows in the market
     * @param reserves The amount of reserves in the market
     * @return The borrow rate percentage per block as a mantissa (scaled by 1e18)
     */
    function getBorrowRate(uint cash, uint borrows, uint reserves) external  view returns (uint) {
        return getBorrowRateInternal(cash, borrows, reserves);
    }

    constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_, address owner_)
    	BaseJumpRateModelV2(baseRatePerYear,multiplierPerYear,jumpMultiplierPerYear,kink_,owner_) public {}
}

// File: contracts\compound\CarefulMath.sol

pragma solidity ^0.6.0;

/**
  * @title Careful Math
  * @author Compound

/blob/master/contracts/math/SafeMath.sol
  */
contract CarefulMath {

    /**
     * @dev Possible error codes that we can return
     */
    enum MathError {
        NO_ERROR,
        DIVISION_BY_ZERO,
        INTEGER_OVERFLOW,
        INTEGER_UNDERFLOW
    }

    /**
    * @dev Multiplies two numbers, returns an error on overflow.
    */
    function mulUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (a == 0) {
            return (MathError.NO_ERROR, 0);
        }

        uint c = a * b;

        if (c / a != b) {
            return (MathError.INTEGER_OVERFLOW, 0);
        } else {
            return (MathError.NO_ERROR, c);
        }
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function divUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b == 0) {
            return (MathError.DIVISION_BY_ZERO, 0);
        }

        return (MathError.NO_ERROR, a / b);
    }

    /**
    * @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend).
    */
    function subUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b <= a) {
            return (MathError.NO_ERROR, a - b);
        } else {
            return (MathError.INTEGER_UNDERFLOW, 0);
        }
    }

    /**
    * @dev Adds two numbers, returns an error on overflow.
    */
    function addUInt(uint a, uint b) internal pure returns (MathError, uint) {
        uint c = a + b;

        if (c >= a) {
            return (MathError.NO_ERROR, c);
        } else {
            return (MathError.INTEGER_OVERFLOW, 0);
        }
    }

    /**
    * @dev add a and b and then subtract c
    */
    function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) {
        (MathError err0, uint sum) = addUInt(a, b);

        if (err0 != MathError.NO_ERROR) {
            return (err0, 0);
        }

        return subUInt(sum, c);
    }
}

// File: contracts\compound\Exponential.sol

pragma solidity ^0.6.0;


/**
 * @title Exponential module for storing fixed-precision decimals
 * @author Compound
 * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places.
 *         Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is:
 *         `Exp({mantissa: 5100000000000000000})`.
 */
contract Exponential is CarefulMath {
    uint constant expScale = 1e18;
    uint constant doubleScale = 1e36;
    uint constant halfExpScale = expScale/2;
    uint constant mantissaOne = expScale;

    struct Exp {
        uint mantissa;
    }

    struct Double {
        uint mantissa;
    }

    /**
     * @dev Creates an exponential from numerator and denominator values.
     *      Note: Returns an error if (`num` * 10e18) > MAX_INT,
     *            or if `denom` is zero.
     */
    function getExp(uint num, uint denom) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledNumerator) = mulUInt(num, expScale);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        (MathError err1, uint rational) = divUInt(scaledNumerator, denom);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: rational}));
    }

    /**
     * @dev Adds two exponentials, returning a new exponential.
     */
    function addExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = addUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    /**
     * @dev Subtracts two exponentials, returning a new exponential.
     */
    function subExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = subUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    /**
     * @dev Multiply an Exp by a scalar, returning a new Exp.
     */
    function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa}));
    }

    /**
     * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer.
     */
    function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(product));
    }

    /**
     * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer.
     */
    function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return addUInt(truncate(product), addend);
    }

    /**
     * @dev Divide an Exp by a scalar, returning a new Exp.
     */
    function divScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: descaledMantissa}));
    }

    /**
     * @dev Divide a scalar by an Exp, returning a new Exp.
     */
    function divScalarByExp(uint scalar, Exp memory divisor) pure internal returns (MathError, Exp memory) {
        /*
          We are doing this as:
          getExp(mulUInt(expScale, scalar), divisor.mantissa)

          How it works:
          Exp = a / b;
          Scalar = s;
          `s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale`
        */
        (MathError err0, uint numerator) = mulUInt(expScale, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }
        return getExp(numerator, divisor.mantissa);
    }

    /**
     * @dev Divide a scalar by an Exp, then truncate to return an unsigned integer.
     */
    function divScalarByExpTruncate(uint scalar, Exp memory divisor) pure internal returns (MathError, uint) {
        (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(fraction));
    }

    /**
     * @dev Multiplies two exponentials, returning a new exponential.
     */
    function mulExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {

        (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        // We add half the scale before dividing so that we get rounding instead of truncation.
        //  See "Listing 6" and text above it at https://accu.org/index.php/journals/1717
        // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18.
        (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale);
        // The only error `div` can return is MathError.DIVISION_BY_ZERO but we control `expScale` and it is not zero.
        assert(err2 == MathError.NO_ERROR);

        return (MathError.NO_ERROR, Exp({mantissa: product}));
    }

    /**
     * @dev Multiplies two exponentials given their mantissas, returning a new exponential.
     */
    function mulExp(uint a, uint b) pure internal returns (MathError, Exp memory) {
        return mulExp(Exp({mantissa: a}), Exp({mantissa: b}));
    }

    /**
     * @dev Multiplies three exponentials, returning a new exponential.
     */
    function mulExp3(Exp memory a, Exp memory b, Exp memory c) pure internal returns (MathError, Exp memory) {
        (MathError err, Exp memory ab) = mulExp(a, b);
        if (err != MathError.NO_ERROR) {
            return (err, ab);
        }
        return mulExp(ab, c);
    }

    /**
     * @dev Divides two exponentials, returning a new exponential.
     *     (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b,
     *  which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa)
     */
    function divExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        return getExp(a.mantissa, b.mantissa);
    }

    /**
     * @dev Truncates the given exp to a whole number value.
     *      For example, truncate(Exp{mantissa: 15 * expScale}) = 15
     */
    function truncate(Exp memory exp) pure internal returns (uint) {
        // Note: We are not using careful math here as we're performing a division that cannot fail
        return exp.mantissa / expScale;
    }

    /**
     * @dev Checks if first Exp is less than second Exp.
     */
    function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa < right.mantissa;
    }

    /**
     * @dev Checks if left Exp <= right Exp.
     */
    function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa <= right.mantissa;
    }

    /**
     * @dev Checks if left Exp > right Exp.
     */
    function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa > right.mantissa;
    }

    /**
     * @dev returns true if Exp is exactly zero
     */
    function isZeroExp(Exp memory value) pure internal returns (bool) {
        return value.mantissa == 0;
    }

    function safe224(uint n, string memory errorMessage) pure internal returns (uint224) {
        require(n < 2**224, errorMessage);
        return uint224(n);
    }

    function safe32(uint n, string memory errorMessage) pure internal returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function add_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(uint a, uint b) pure internal returns (uint) {
        return add_(a, b, "addition overflow");
    }

    function add_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(uint a, uint b) pure internal returns (uint) {
        return sub_(a, b, "subtraction underflow");
    }

    function sub_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function mul_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b.mantissa) / expScale});
    }

    function mul_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Exp memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / expScale;
    }

    function mul_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b.mantissa) / doubleScale});
    }

    function mul_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Double memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / doubleScale;
    }

    function mul_(uint a, uint b) pure internal returns (uint) {
        return mul_(a, b, "multiplication overflow");
    }

    function mul_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        if (a == 0 || b == 0) {
            return 0;
        }
        uint c = a * b;
        require(c / a == b, errorMessage);
        return c;
    }

    function div_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(mul_(a.mantissa, expScale), b.mantissa)});
    }

    function div_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Exp memory b) pure internal returns (uint) {
        return div_(mul_(a, expScale), b.mantissa);
    }

    function div_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa)});
    }

    function div_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Double memory b) pure internal returns (uint) {
        return div_(mul_(a, doubleScale), b.mantissa);
    }

    function div_(uint a, uint b) pure internal returns (uint) {
        return div_(a, b, "divide by zero");
    }

    function div_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function fraction(uint a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a, doubleScale), b)});
    }
}

// File: contracts\WarpControl.sol

pragma solidity ^0.6.0;










////////////////////////////////////////////////////////////////////////////////////////////
/// @title WarpControl
/// @author Christopher Dixon
////////////////////////////////////////////////////////////////////////////////////////////
/**
WarpControl is designed to coordinate Warp Vaults
This contract uses the OpenZeppelin contract Library to inherit functions from
  Ownable.sol
**/

contract WarpControl is Ownable, Exponential {
    using SafeMath for uint256;

    UniswapLPOracleFactoryI public Oracle; //oracle factory contract interface
    WarpVaultLPFactoryI public WVLPF;
    WarpVaultSCFactoryI public WVSCF;

    address public warpTeam;
    address public newWarpControl;
    uint256 public graceSpace;

    address[] public lpVaults;
    address[] public scVaults;

    mapping(address => address) public instanceLPTracker; //maps LP token address to the assets WarpVault
    mapping(address => address) public instanceSCTracker;
    mapping(address => address) public getAssetByVault;
    mapping(address => bool) public isVault;

    event NewLPVault(address _newVault);
    event ImportedLPVault(address _vault);
    event NewSCVault(address _newVault, address _interestRateModel);
    event ImportedSCVault(address _vault);
    event NewBorrow(
        address _borrower,
        address _StableCoin,
        uint256 _amountBorrowed
    );
    event Liquidation(address _account, address liquidator);
    event NewInterestRateModelCreated(
      address _token,
      uint256 _baseRatePerYear,
      uint256 _multiplierPerYear,
      uint256 _jumpMultiplierPerYear,
      uint256 _optimal
    );

    /**
      @dev Throws if called by any account other than a warp vault
     */
    modifier onlyVault() {
        require(isVault[msg.sender] == true, "Only a vault may call this");
        _;
    }

    /**
    @notice the constructor function is fired during the contract deployment process. The constructor can only be fired once and
            is used to set up Oracle variables for the MoneyMarketFactory contract.
    @param _oracle is the address for the UniswapOracleFactorycontract
    @param _WVLPF is the address for the WarpVaultLPFactory used to produce LP Warp Vaults
    @param _WVSCF is the address for the WarpVaultSCFactory used to produce Stable Coin Warp Vaults
    @dev These factories are split into seperate contracts to avoid hitting the block gas limit
    **/
    constructor(
        address _oracle,
        address _WVLPF,
        address _WVSCF,
        address _warpTeam
    ) public {
        //instantiate the contracts
        Oracle = UniswapLPOracleFactoryI(_oracle);
        WVLPF = WarpVaultLPFactoryI(_WVLPF);
        WVSCF = WarpVaultSCFactoryI(_WVSCF);
        warpTeam = _warpTeam;
    }

    /**
    @notice viewNumLPVaults returns the number of lp vaults on the warp platform
    **/
    function viewNumLPVaults() external view returns (uint256) {
        return lpVaults.length;
    }

    /**
    @notice viewNumSCVaults returns the number of stablecoin vaults on the warp platform
    **/
    function viewNumSCVaults() external view returns (uint256) {
        return scVaults.length;
    }

    /**
    @notice createNewLPVault allows the contract owner to create a new WarpVaultLP contract for a specific LP token
    @param _timelock is a variable representing the number of seconds the timeWizard will prevent withdraws and borrows from a contracts(one week is 605800 seconds)
    @param _lp is the address for the LP token this Warp Vault will manage
    @param _lpAsset1 is the address for the first asset in a pair that the LP token represents(ex: wETH in a wETH-wBTC uniswap pair)
    @param _lpAsset2 is the address for the second asset in a pair that the LP token represents(ex: wBTC in a wETH-wBTC uniswap pair)
    @param _lpName is the name of the LP token (ex:wETH-wBTC)
    **/
    function createNewLPVault(
        uint256 _timelock,
        address _lp,
        address _lpAsset1,
        address _lpAsset2,
        string memory _lpName
    ) public onlyOwner {
        //create new oracles for this LP
        Oracle.createNewOracles(_lpAsset1, _lpAsset2, _lp);
        //create new Warp LP Vault
        address _WarpVault = WVLPF.createWarpVaultLP(_timelock, _lp, _lpName);
        //track the warp vault lp instance by the address of the LP it represents
        instanceLPTracker[_lp] = _WarpVault;
        //add new LP Vault to the array of all LP vaults
        lpVaults.push(_WarpVault);
        //set Warp vault address as an approved vault
        isVault[_WarpVault] = true;
        //track vault to asset
        getAssetByVault[_WarpVault] = _lp;
        emit NewLPVault(_WarpVault);
    }

    function importLPVault(address _lpVault) public onlyOwner {
      require(isVault[_lpVault] == false);
        WarpVaultLPI _vault = WarpVaultLPI(_lpVault);
        address _lp = _vault.getAssetAdd();

        instanceLPTracker[_lp] = _lpVault;
        lpVaults.push(_lpVault);
        isVault[_lpVault] = true;
        getAssetByVault[_lpVault] = _lp;
        emit ImportedLPVault(_lpVault);
    }

    function manuallyCreateOracles(
        address _token0,
        address _token1,
        address _lpToken
    ) public onlyOwner {
        Oracle.createNewOracles(_token0, _token1, _lpToken);
    }

    /**
    @notice createNewSCVault allows the contract owner to create a new WarpVaultLP contract for a specific LP token
    @param _timelock is a variable representing the number of seconds the timeWizard will prevent withdraws and borrows from a contracts(one week is 605800 seconds)
    @param _baseRatePerYear is the base rate per year(approx target base APR)
    @param _multiplierPerYear is the multiplier per year(rate of increase in interest w/ utilizastion)
    @param _jumpMultiplierPerYear is the Jump Multiplier Per Year(the multiplier per block after hitting a specific utilizastion point)
    @param _optimal is the this is the utilizastion point or "kink" at which the jump multiplier is applied
    @param _initialExchangeRate is the intitial exchange rate(the rate at which the initial exchange of asset/ART is set)
    @param _StableCoin is the address of the StableCoin this Warp Vault will manage
    **/
    function createNewSCVault(
        uint256 _timelock,
        uint256 _baseRatePerYear,
        uint256 _multiplierPerYear,
        uint256 _jumpMultiplierPerYear,
        uint256 _optimal,
        uint256 _initialExchangeRate,
        uint256 _reserveFactorMantissa,
        address _StableCoin
    ) public onlyOwner {
        //create the interest rate model for this stablecoin
        address IR = address(
            new JumpRateModelV2(
                _baseRatePerYear,
                _multiplierPerYear,
                _jumpMultiplierPerYear,
                _optimal,
                address(this)
            )
        );
        //create the SC Warp vault
        address _WarpVault = WVSCF.createNewWarpVaultSC(
            IR,
            _StableCoin,
            warpTeam,
            _initialExchangeRate,
            _timelock,
            _reserveFactorMantissa
        );
        //track the warp vault sc instance by the address of the stablecoin it represents
        instanceSCTracker[_StableCoin] = _WarpVault;
        //add new SC Vault to the array of all SC vaults
        scVaults.push(_WarpVault);
        //set Warp vault address as an approved vault
        isVault[_WarpVault] = true;
        //track vault to asset
        getAssetByVault[_WarpVault] = _StableCoin;
        emit NewSCVault(_WarpVault, IR);
    }

    function importSCVault(address _scVault) public onlyOwner {
      require(isVault[_scVault] == false);

        WarpVaultSCI _vault = WarpVaultSCI(_scVault);
        address _token = _vault.getSCAddress();

        // track token -> vault
        instanceSCTracker[_token] = _scVault;
        // vault list
        scVaults.push(_scVault);
        // register vault in mapping
        isVault[_scVault] = true;
        // track vault -> token
        getAssetByVault[_scVault] = _token;
        emit ImportedSCVault(_scVault);
    }

    /**
    @notice Figures out how much of a given LP token an account is allowed to withdraw
    @param account is the account being checked
    @param lpToken is the address of the lpToken the user wishes to withdraw
    @dev this function runs calculations to accrue interest for an up to date amount
     */
    function getMaxWithdrawAllowed(address account, address lpToken)
        public
        returns (uint256)
    {
        uint256 borrowedTotal = getTotalBorrowedValue(account);
        uint256 collateralValue = getTotalAvailableCollateralValue(account);
        uint256 requiredCollateral = calcCollateralRequired(borrowedTotal);
        if (collateralValue < requiredCollateral) {
            return 0;
        }
        uint256 leftoverCollateral = collateralValue.sub(requiredCollateral);
        uint256 lpValue = Oracle.getUnderlyingPrice(lpToken);
        return leftoverCollateral.mul(1e18).div(lpValue);
    }

    /**
    @notice Figures out how much of a given LP token an account is allowed to withdraw
    @param account is the account being checked
    @param lpToken is the address of the lpToken the user wishes to withdraw
    @dev this function does not run calculations to accrue interest and returns the previously calculated amount
     */
    function viewMaxWithdrawAllowed(address account, address lpToken)
        public
        view
        returns (uint256)
    {
        uint256 borrowedTotal = viewTotalBorrowedValue(account);
        uint256 collateralValue = viewTotalAvailableCollateralValue(account);
        uint256 requiredCollateral = calcCollateralRequired(borrowedTotal);
        if (collateralValue < requiredCollateral) {
            return 0;
        }
        uint256 leftoverCollateral = collateralValue.sub(requiredCollateral);
        uint256 lpValue = Oracle.viewUnderlyingPrice(lpToken);
        return leftoverCollateral.mul(1e18).div(lpValue);
    }

    /**
    @notice getTotalAvailableCollateralValue returns the total availible collaeral value for an account in USDC
    @param _account is the address whos collateral is being retreived
    @dev this function runs calculations to accrue interest for an up to date amount
    **/
    function getTotalAvailableCollateralValue(address _account)
        public
        returns (uint256)
    {
        //get the number of LP vaults the platform has
        uint256 numVaults = lpVaults.length;
        //initialize the totalCollateral variable to zero
        uint256 totalCollateral = 0;
        //loop through each lp wapr vault
        for (uint256 i = 0; i < numVaults; ++i) {
            //instantiate warp vault at that position
            WarpVaultLPI vault = WarpVaultLPI(lpVaults[i]);
            //retreive the address of its asset
            address asset = vault.getAssetAdd();
            //retrieve USD price of this asset
            uint256 assetPrice = Oracle.getUnderlyingPrice(asset);

            uint256 accountCollateral = vault.collateralOfAccount(_account);
            //emit DebugValues(accountCollateral, assetPrice);

            //multiply the amount of collateral by the asset price and return it
            uint256 accountAssetsValue = accountCollateral.mul(assetPrice);
            //add value to total collateral
            totalCollateral = totalCollateral.add(accountAssetsValue);
        }
        //return total USDC value of all collateral
        return totalCollateral.div(1e18);
    }

    /**
    @notice getTotalAvailableCollateralValue returns the total availible collaeral value for an account in USDC
    @param _account is the address whos collateral is being retreived
    @dev this function does not run calculations to accrue interest and returns the previously calculated amount
    **/
    function viewTotalAvailableCollateralValue(address _account)
        public
        view
        returns (uint256)
    {
        uint256 numVaults = lpVaults.length;
        uint256 totalCollateral = 0;
        //loop through each lp wapr vault
        for (uint256 i = 0; i < numVaults; ++i) {
            //instantiate warp vault at that position
            WarpVaultLPI vault = WarpVaultLPI(lpVaults[i]);
            //retreive the address of its asset
            address asset = vault.getAssetAdd();
            //retrieve USD price of this asset
            uint256 assetPrice = Oracle.viewUnderlyingPrice(asset);

            uint256 accountCollateral = vault.collateralOfAccount(_account);

            //multiply the amount of collateral by the asset price and return it
            uint256 accountAssetsValue = accountCollateral.mul(assetPrice);
            //add value to total collateral
            totalCollateral = totalCollateral.add(accountAssetsValue);
        }
        //return total USDC value of all collateral
        return totalCollateral.div(1e18);
    }

    /**
    @notice viewPriceOfCollateral returns the price of an lpToken
    @param lpToken is the address of the lp token
    @dev this function runs calculations to retrieve the current price
    **/
    function viewPriceOfCollateral(address lpToken)
        public
        view
        returns (uint256)
    {
        return Oracle.viewUnderlyingPrice(lpToken);
    }

    /**
    @notice getPriceOfCollateral returns the price of an lpToken
    @param lpToken is the address of the lp token
    @dev this function does not run calculations amd returns the previously calculated price
    **/
    function getPriceOfCollateral(address lpToken) public returns (uint256) {
        return Oracle.getUnderlyingPrice(lpToken);
    }

    /**
    @notice viewPriceOfToken retrieves the price of a stablecoin
    @param token is the address of the stablecoin
    @param amount is the amount of stablecoin
    @dev this function runs calculations to retrieve the current price
    **/
    function viewPriceOfToken(address token, uint256 amount)
        public
        view
        returns (uint256)
    {
        return Oracle.viewPriceOfToken(token, amount);
    }

    /**
    @notice viewPriceOfToken retrieves the price of a stablecoin
    @param token is the address of the stablecoin
    @param amount is the amount of stablecoin
    @dev this function does not run calculations amd returns the previously calculated price
    **/
    function getPriceOfToken(address token, uint256 amount)
        public
        returns (uint256)
    {
        return Oracle.getPriceOfToken(token, amount);
    }

    /**
    @notice viewTotalLentValue returns the total lent value for an account in USDC
    @param _account is the account whos lent value we are calculating
    **/
    function viewTotalLentValue(address _account)
        public
        view
        returns (uint256)
    {
        uint256 numSCVaults = scVaults.length;
        uint256 totalValue = 0;

        // Add up each stable coin vaults value
        for (uint256 i = 0; i < numSCVaults; ++i) {
            //instantiate each LP warp vault
            WarpVaultSCI WVSC = WarpVaultSCI(scVaults[i]);
            //retreive the amount user has borrowed from each stablecoin vault
            uint256 lentBalanceInStable = WVSC.viewAccountBalance(_account);
            if (lentBalanceInStable == 0) {
                continue;
            }
            uint256 usdcLentAmount = viewPriceOfToken(
                WVSC.getSCAddress(),
                lentBalanceInStable
            );
            totalValue = totalValue.add(usdcLentAmount);
        }

        return totalValue;
    }

    /**
    @notice viewTotalBorrowedValue returns the total borrowed value for an account in USDC
    @param _account is the account whos borrowed value we are calculating
    @dev this function returns previously calculated values
    **/
    function viewTotalBorrowedValue(address _account)
        public
        view
        returns (uint256)
    {
        uint256 numSCVaults = scVaults.length;
        //initialize the totalBorrowedValue variable to zero
        uint256 totalBorrowedValue = 0;
        //loop through all stable coin vaults
        for (uint256 i = 0; i < numSCVaults; ++i) {
            //instantiate each LP warp vault
            WarpVaultSCI WVSC = WarpVaultSCI(scVaults[i]);
            //retreive the amount user has borrowed from each stablecoin vault
            uint256 borrowBalanceInStable = WVSC.borrowBalancePrior(_account);
            if (borrowBalanceInStable == 0) {
                continue;
            }
            uint256 usdcBorrowedAmount = viewPriceOfToken(
                WVSC.getSCAddress(),
                borrowBalanceInStable
            );
            totalBorrowedValue = totalBorrowedValue.add(usdcBorrowedAmount);
        }
        //return total Borrowed Value
        return totalBorrowedValue;
    }

    /**
    @notice viewTotalBorrowedValue returns the total borrowed value for an account in USDC
    @param _account is the account whos borrowed value we are calculating
    @dev this function returns newly calculated values
    **/
    function getTotalBorrowedValue(address _account) public returns (uint256) {
        uint256 numSCVaults = scVaults.length;
        //initialize the totalBorrowedValue variable to zero
        uint256 totalBorrowedValue = 0;
        //loop through all stable coin vaults
        for (uint256 i = 0; i < numSCVaults; ++i) {
            //instantiate each LP warp vault
            WarpVaultSCI WVSC = WarpVaultSCI(scVaults[i]);
            //retreive the amount user has borrowed from each stablecoin vault
            uint256 borrowBalanceInStable = WVSC.borrowBalanceCurrent(_account);
            if (borrowBalanceInStable == 0) {
                continue;
            }
            uint256 usdcBorrowedAmount = getPriceOfToken(
                WVSC.getSCAddress(),
                borrowBalanceInStable
            );
            totalBorrowedValue = totalBorrowedValue.add(usdcBorrowedAmount);
        }
        //return total Borrowed Value
        return totalBorrowedValue;
    }

    /**
    @notice calcBorrowLimit is used to calculate the borrow limit for an account based on the input value of their collateral
    @param _collateralValue is the USDC value of the users collateral
    @dev this function divides the input value by 3 and then adds that value to itself so it can return 2/3rds of the availible collateral
        as the borrow limit. If a usser has $150 USDC value in collateral this function will return $100 USDC as their borrow limit.
    **/
    function calcBorrowLimit(uint256 _collateralValue)
        public
        pure
        returns (uint256)
    {
        //divide the collaterals value by 3 to get 1/3rd of its value
        uint256 thirdCollatVal = _collateralValue.div(3);
        //add this 1/3rd value to itself to get 2/3rds of the original value
        return thirdCollatVal.add(thirdCollatVal);
    }

    /**
    @notice calcCollateralRequired returns the amount of collateral needed for an input borrow value
    @param _borrowAmount is the input borrow amount
    **/
    function calcCollateralRequired(uint256 _borrowAmount)
        public
        pure
        returns (uint256)
    {
        return _borrowAmount.mul(3).div(2);
    }

    /**
    @notice getBorrowLimit returns the borrow limit for an account
    @param _account is the input account address
    @dev this calculation uses current values for calculations
    **/
    function getBorrowLimit(address _account) public returns (uint256) {
        uint256 availibleCollateralValue = getTotalAvailableCollateralValue(
            _account
        );

        return calcBorrowLimit(availibleCollateralValue);
    }

    /**
    @notice getBorrowLimit returns the borrow limit for an account
    @param _account is the input account address
    @dev this calculation uses previous values for calculations
    **/
    function viewBorrowLimit(address _account) public view returns (uint256) {
        uint256 availibleCollateralValue = viewTotalAvailableCollateralValue(
            _account
        );
        //return the users borrow limit
        return calcBorrowLimit(availibleCollateralValue);
    }

    /**
    @notice borrowSC is the function an end user will call when they wish to borrow a stablecoin from the warp platform
    @param _StableCoin is the address of the stablecoin the user wishes to borrow
    @param _amount is the amount of that stablecoin the user wants to borrow
    **/
    function borrowSC(address _StableCoin, uint256 _amount) public {
        uint256 borrowedTotalInUSDC = getTotalBorrowedValue(msg.sender);
        uint256 borrowLimitInUSDC = getBorrowLimit(msg.sender);
        uint256 borrowAmountAllowedInUSDC = borrowLimitInUSDC.sub(
            borrowedTotalInUSDC
        );

        uint256 borrowAmountInUSDC = getPriceOfToken(_StableCoin, _amount);

        //require the amount being borrowed is less than or equal to the amount they are aloud to borrow
        require(
            borrowAmountAllowedInUSDC >= borrowAmountInUSDC,
            "Borrowing more than allowed"
        );

        //retreive stablecoin vault address being borrowed from and instantiate it
        WarpVaultSCI WV = WarpVaultSCI(instanceSCTracker[_StableCoin]);
        //call _borrow function on the stablecoin warp vault
        WV._borrow(_amount, msg.sender);
        emit NewBorrow(msg.sender, _StableCoin, _amount);
    }

    /**
    @notice liquidateAccount is used to liquidate a non-compliant loan after it has reached its 30 minute grace period
    @param _borrower is the address of the borrower whos loan is non-compliant
    **/
    function liquidateAccount(address _borrower) public {
        //require the liquidator is not also the borrower
        require(msg.sender != _borrower, "you cant liquidate yourself");
        //retreive the number of stablecoin vaults in the warp platform
        uint256 numSCVaults = scVaults.length;
        //retreive the number of LP vaults in the warp platform
        uint256 numLPVaults = lpVaults.length;
        // This is how much USDC worth of Stablecoin the user has borrowed
        uint256 borrowedAmount = 0;
        //initialize the stable coin balances array
        uint256[] memory scBalances = new uint256[](numSCVaults);
        // loop through and retreive the Borrowed Amount From All Vaults
        for (uint256 i = 0; i < numSCVaults; ++i) {
            //instantiate the vault at the current  position in the array
            WarpVaultSCI scVault = WarpVaultSCI(scVaults[i]);
            //retreive the borrowers borrow balance from this vault and add it to the scBalances array
            scBalances[i] = scVault.borrowBalanceCurrent(_borrower);
            uint256 borrowedAmountInUSDC = viewPriceOfToken(
                getAssetByVault[address(scVault)],
                scBalances[i]
            );

            //add the borrowed amount to the total borrowed balance
            borrowedAmount = borrowedAmount.add(borrowedAmountInUSDC);
        }
        //retreve the USDC borrow limit for the borrower
        uint256 borrowLimit = getBorrowLimit(_borrower);
        //check if the borrow is less than the borrowed amount
        if (borrowLimit <= borrowedAmount) {
            // If it is Liquidate the account
            //loop through each SC vault so the  Liquidator can pay off Stable Coin loans
            for (uint256 i = 0; i < numSCVaults; ++i) {
                //instantiate the Warp SC Vault at the current position
                WarpVaultSCI scVault = WarpVaultSCI(scVaults[i]);
                //call repayLiquidatedLoan function to repay the loan
                scVault._repayLiquidatedLoan(
                    _borrower,
                    msg.sender,
                    scBalances[i]
                );
            }
            //loop through each LP vault so the Liquidator gets the LP tokens the borrower had
            for (uint256 i = 0; i < numLPVaults; ++i) {
                //instantiate the Warp LP Vault at the current position
                WarpVaultLPI lpVault = WarpVaultLPI(lpVaults[i]);
                //call liquidateAccount function on that LP vault
                lpVault._liquidateAccount(_borrower, msg.sender);
            }
            emit Liquidation(_borrower, msg.sender);
        }
    }

    /**
    @notice updateInterestRateModel allows the warp team to update the interest rate model for a stablecoin
    @param _token is the address of the stablecoin whos vault is having its interest rate updated
    @param _baseRatePerYear is the base rate per year(approx target base APR)
    @param _multiplierPerYear is the multiplier per year(rate of increase in interest w/ utilizastion)
    @param _jumpMultiplierPerYear is the Jump Multiplier Per Year(the multiplier per block after hitting a specific utilizastion point)
    @param _optimal is the this is the utilizastion point or "kink" at which the jump multiplier is applied
    **/
    function updateInterestRateModel(
        address _token,
        uint256 _baseRatePerYear,
        uint256 _multiplierPerYear,
        uint256 _jumpMultiplierPerYear,
        uint256 _optimal
    ) public onlyOwner {
        address IR = address(
            new JumpRateModelV2(
                _baseRatePerYear,
                _multiplierPerYear,
                _jumpMultiplierPerYear,
                _optimal,
                address(this)
            )
        );
        address vault = instanceSCTracker[_token];
        WarpVaultSCI WV = WarpVaultSCI(vault);
        WV.setNewInterestModel(IR);
        emit NewInterestRateModelCreated(
          _token,
           _baseRatePerYear,
          _multiplierPerYear,
          _jumpMultiplierPerYear,
          _optimal
        );
    }

    /**
    @notice startUpgradeTimer starts a two day timer signaling that this contract will soon be updated to a new version
    @param _newWarpControl is the address of the new Warp control contract being upgraded to
    **/
    function startUpgradeTimer(address _newWarpControl) public onlyOwner {
        newWarpControl = _newWarpControl;
        graceSpace = now.add(172800);
    }

    /**
    @notice upgradeWarp is used to upgrade the Warp platform to use a new version of the WarpControl contract
    **/
    function upgradeWarp() public onlyOwner {
        require(now >= graceSpace, "you cant ugrade yet, less than two days");
        require(newWarpControl != address(0), "no new warp control set");

        Oracle.transferOwnership(newWarpControl);

        uint256 numVaults = lpVaults.length;
        uint256 numSCVaults = scVaults.length;

        for (uint256 i = 0; i < numVaults; ++i) {
            WarpVaultLPI vault = WarpVaultLPI(lpVaults[i]);
            vault.updateWarpControl(newWarpControl);
        }

        for (uint256 i = 0; i < numSCVaults; ++i) {
            WarpVaultSCI vault = WarpVaultSCI(scVaults[i]);
            vault.updateWarpControl(newWarpControl);
        }
    }

    /**
    @notice transferWarpTeam allows the wapr team address to be changed by the owner account
    @param _newWarp is the address of the new warp team
    **/
    function transferWarpTeam(address _newWarp) public onlyOwner {
        uint256 numSCVaults = scVaults.length;
        warpTeam = _newWarp;
        for (uint256 i = 0; i < numSCVaults; ++i) {
            WarpVaultSCI WVSC = WarpVaultSCI(scVaults[i]);
            WVSC.updateTeam(_newWarp);
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_WVLPF","type":"address"},{"internalType":"address","name":"_WVSCF","type":"address"},{"internalType":"address","name":"_warpTeam","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_vault","type":"address"}],"name":"ImportedLPVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_vault","type":"address"}],"name":"ImportedSCVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"address","name":"liquidator","type":"address"}],"name":"Liquidation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"address","name":"_StableCoin","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountBorrowed","type":"uint256"}],"name":"NewBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_baseRatePerYear","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_multiplierPerYear","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jumpMultiplierPerYear","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_optimal","type":"uint256"}],"name":"NewInterestRateModelCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newVault","type":"address"}],"name":"NewLPVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newVault","type":"address"},{"indexed":false,"internalType":"address","name":"_interestRateModel","type":"address"}],"name":"NewSCVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"Oracle","outputs":[{"internalType":"contract UniswapLPOracleFactoryI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WVLPF","outputs":[{"internalType":"contract WarpVaultLPFactoryI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WVSCF","outputs":[{"internalType":"contract WarpVaultSCFactoryI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_StableCoin","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrowSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collateralValue","type":"uint256"}],"name":"calcBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_borrowAmount","type":"uint256"}],"name":"calcCollateralRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timelock","type":"uint256"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_lpAsset1","type":"address"},{"internalType":"address","name":"_lpAsset2","type":"address"},{"internalType":"string","name":"_lpName","type":"string"}],"name":"createNewLPVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timelock","type":"uint256"},{"internalType":"uint256","name":"_baseRatePerYear","type":"uint256"},{"internalType":"uint256","name":"_multiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"_jumpMultiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"_optimal","type":"uint256"},{"internalType":"uint256","name":"_initialExchangeRate","type":"uint256"},{"internalType":"uint256","name":"_reserveFactorMantissa","type":"uint256"},{"internalType":"address","name":"_StableCoin","type":"address"}],"name":"createNewSCVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getAssetByVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"lpToken","type":"address"}],"name":"getMaxWithdrawAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"getPriceOfCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getPriceOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getTotalAvailableCollateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getTotalBorrowedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"graceSpace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpVault","type":"address"}],"name":"importLPVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_scVault","type":"address"}],"name":"importSCVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"instanceLPTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"instanceSCTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"liquidateAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"manuallyCreateOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newWarpControl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newWarpControl","type":"address"}],"name":"startUpgradeTimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWarp","type":"address"}],"name":"transferWarpTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_baseRatePerYear","type":"uint256"},{"internalType":"uint256","name":"_multiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"_jumpMultiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"_optimal","type":"uint256"}],"name":"updateInterestRateModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeWarp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"viewBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"lpToken","type":"address"}],"name":"viewMaxWithdrawAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewNumLPVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewNumSCVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"viewPriceOfCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"viewPriceOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"viewTotalAvailableCollateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"viewTotalBorrowedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"viewTotalLentValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warpTeam","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162003a9a38038062003a9a833981810160405260808110156200003757600080fd5b50805160208201516040830151606090930151919290916000620000636001600160e01b036200010116565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b039586166001600160a01b031991821617909155600280549486169482169490941790935560038054928516928416929092179091556004805491909316911617905562000105565b3390565b61398580620001156000396000f3fe60806040523480156200001157600080fd5b5060043610620002a45760003560e01c806388236b5a1162000171578063cf23073811620000d5578063ed6072f61162000093578063ed6072f614620008c2578063efdebdf514620008e2578063f24a534e14620008ec578063f2fde38b14620008f6578063f3c7f987146200091f578063faa8f7c2146200095057620002a4565b8063cf230738146200075a578063da4f7fb2146200079b578063e1535d1214620007bb578063e50f4a3014620007c5578063ea3f847f146200089957620002a4565b8063ab5e2c99116200012f578063ab5e2c991462000684578063acc9e5b114620006b5578063b042079214620006de578063bc64cd4e14620006fe578063bc816cac1462000727578063be9287e3146200073157620002a4565b806388236b5a14620005d057806388c342ea14620005f95780638ac5d4a314620006285780638da5cb5b1462000651578063a2b35d9d146200065b57620002a4565b80635cf5738911620002195780636af5f75211620001d75780636af5f7521462000506578063715018a6146200051057806377ca931c146200051a5780637a58dc9f14620005555780637af70ba6146200057e5780637c17d23714620005a757620002a4565b80635cf57389146200044d578063622263081462000457578063652b9b41146200047757806368f505ad14620004b4578063692d295d14620004dd57620002a4565b80631a2a16b511620002675780631a2a16b5146200038d5780631dbb0b8114620003bc5780632792bdd014620003c65780632f74020c146200041a5780634e590bee146200042457620002a4565b806302e0df2d14620002a95780630a55598914620002d45780630a8a4d3f14620003035780630c1e2b92146200031f578063169d4b141462000364575b600080fd5b620002d260048036036020811015620002c157600080fd5b50356001600160a01b031662000979565b005b620002d260048036036040811015620002ec57600080fd5b506001600160a01b03813516906020013562000a90565b6200030d62000bf3565b60408051918252519081900360200190f35b62000348600480360360208110156200033757600080fd5b50356001600160a01b031662000bf9565b604080516001600160a01b039092168252519081900360200190f35b6200030d600480360360208110156200037c57600080fd5b50356001600160a01b031662000c14565b6200030d60048036036040811015620003a557600080fd5b506001600160a01b03813516906020013562000c36565b6200030d62000cc6565b620002d26004803603610100811015620003df57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e001356001600160a01b031662000ccc565b6200034862000f0e565b6200030d600480360360208110156200043c57600080fd5b50356001600160a01b031662000f1d565b6200034862000fa3565b62000348600480360360208110156200046f57600080fd5b503562000fb2565b620004a0600480360360208110156200048f57600080fd5b50356001600160a01b031662000fda565b604080519115158252519081900360200190f35b620002d260048036036020811015620004cc57600080fd5b50356001600160a01b031662000fef565b6200030d60048036036020811015620004f557600080fd5b50356001600160a01b0316620011aa565b6200034862001212565b620002d262001221565b620002d2600480360360608110156200053257600080fd5b506001600160a01b038135811691602081013582169160409091013516620012c7565b620002d2600480360360208110156200056d57600080fd5b50356001600160a01b0316620013a0565b6200030d600480360360208110156200059657600080fd5b50356001600160a01b03166200142c565b6200030d60048036036020811015620005bf57600080fd5b50356001600160a01b03166200162c565b620002d260048036036020811015620005e857600080fd5b50356001600160a01b03166200163a565b6200030d600480360360408110156200061157600080fd5b506001600160a01b038135169060200135620017f5565b620002d2600480360360208110156200064057600080fd5b50356001600160a01b031662001864565b6200034862001c32565b6200030d600480360360208110156200067357600080fd5b50356001600160a01b031662001c41565b6200030d600480360360408110156200069c57600080fd5b506001600160a01b038135811691602001351662001d9a565b6200034860048036036020811015620006cd57600080fd5b50356001600160a01b031662001eaf565b6200034860048036036020811015620006f657600080fd5b503562001eca565b6200030d600480360360208110156200071657600080fd5b50356001600160a01b031662001ed8565b620002d2620020b4565b6200030d600480360360208110156200074957600080fd5b50356001600160a01b03166200235c565b620002d2600480360360a08110156200077257600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135620024ac565b6200030d60048036036020811015620007b357600080fd5b50356200263f565b6200030d6200265a565b620002d2600480360360a0811015620007dd57600080fd5b8135916001600160a01b03602082013581169260408301358216926060810135909216919081019060a0810160808201356401000000008111156200082157600080fd5b8201836020820111156200083457600080fd5b803590602001918460018302840111640100000000831117156200085757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062002660945050505050565b6200034860048036036020811015620008b157600080fd5b50356001600160a01b0316620028f6565b6200030d60048036036020811015620008da57600080fd5b503562002911565b620003486200293b565b620003486200294a565b620002d2600480360360208110156200090e57600080fd5b50356001600160a01b031662002959565b6200030d600480360360408110156200093757600080fd5b506001600160a01b038135811691602001351662002a57565b6200030d600480360360208110156200096857600080fd5b50356001600160a01b031662002b18565b6200098362002c33565b6000546001600160a01b03908116911614620009d5576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600854600480546001600160a01b0319166001600160a01b03841617905560005b8181101562000a8b5760006008828154811062000a0f57fe5b600091825260208220015460408051632c8fcd6560e21b81526001600160a01b0388811660048301529151919092169350839263b23f3594926024808201939182900301818387803b15801562000a6557600080fd5b505af115801562000a7a573d6000803e3d6000fd5b5050505050806001019050620009f6565b505050565b600062000a9d3362001c41565b9050600062000aac336200162c565b9050600062000ac2828463ffffffff62002c3716565b9050600062000ad28686620017f5565b90508082101562000b2a576040805162461bcd60e51b815260206004820152601b60248201527f426f72726f77696e67206d6f7265207468616e20616c6c6f7765640000000000604482015290519081900360640190fd5b6001600160a01b038087166000908152600a6020526040808220548151631196a36960e11b8152600481018a90523360248201529151931692839263232d46d2926044808201939182900301818387803b15801562000b8857600080fd5b505af115801562000b9d573d6000803e3d6000fd5b5050604080513381526001600160a01b038b1660208201528082018a905290517f39afaad37daff6f7a5998bf9de35bb3f46d51f73227bb182d92c016c981a82909350908190036060019150a150505050505050565b60065481565b600a602052600090815260409020546001600160a01b031681565b60008062000c228362001ed8565b905062000c2f8162002911565b9392505050565b60015460408051631a2a16b560e01b81526001600160a01b0385811660048301526024820185905291516000939290921691631a2a16b591604480820192602092909190829003018186803b15801562000c8f57600080fd5b505afa15801562000ca4573d6000803e3d6000fd5b505050506040513d602081101562000cbb57600080fd5b505190505b92915050565b60085490565b62000cd662002c33565b6000546001600160a01b0390811691161462000d28576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6000878787873060405162000d3d9062002e7c565b948552602085019390935260408085019290925260608401526001600160a01b039091166080830152519081900360a001906000f08015801562000d85573d6000803e3d6000fd5b506003546004805460408051630f10a94560e31b81526001600160a01b03808716948201949094528784166024820152918316604483015260648201899052608482018e905260a482018890525193945060009391909216916378854a289160c480830192602092919082900301818787803b15801562000e0557600080fd5b505af115801562000e1a573d6000803e3d6000fd5b505050506040513d602081101562000e3157600080fd5b50516001600160a01b038085166000818152600a6020908152604080832080548688166001600160a01b031991821681179092556008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054831684179055828652600c8552838620805460ff19169091179055600b845293829020805490941690941790925581519283529286169282019290925281519293507f2c3b5544df8032e6313fd1e59faede21004ab06bb69c1f6640a41566225cb00a929081900390910190a150505050505050505050565b6005546001600160a01b031681565b6001546040805163b04c6d3f60e01b81526001600160a01b0384811660048301529151600093929092169163b04c6d3f91602480820192602092909190829003018186803b15801562000f6f57600080fd5b505afa15801562000f84573d6000803e3d6000fd5b505050506040513d602081101562000f9b57600080fd5b505192915050565b6004546001600160a01b031681565b6007818154811062000fc057fe5b6000918252602090912001546001600160a01b0316905081565b600c6020526000908152604090205460ff1681565b62000ff962002c33565b6000546001600160a01b039081169116146200104b576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600c602052604090205460ff16156200107257600080fd5b60008190506000816001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b158015620010b357600080fd5b505afa158015620010c8573d6000803e3d6000fd5b505050506040513d6020811015620010df57600080fd5b50516001600160a01b038082166000818152600a6020908152604080832080546001600160a01b0319908116968b169687179091556008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507ff82a5541ca7d6caee68c834562b18f4b3e4228a200aae195fdf26770dd28cd1592918290030190a1505050565b6001546040805163fc57d4df60e01b81526001600160a01b0384811660048301529151600093929092169163fc57d4df9160248082019260209290919082900301818787803b158015620011fd57600080fd5b505af115801562000f84573d6000803e3d6000fd5b6002546001600160a01b031681565b6200122b62002c33565b6000546001600160a01b039081169116146200127d576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b620012d162002c33565b6000546001600160a01b0390811691161462001323576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b60015460408051634a42dd6d60e11b81526001600160a01b0386811660048301528581166024830152848116604483015291519190921691639485bada91606480830192600092919082900301818387803b1580156200138257600080fd5b505af115801562001397573d6000803e3d6000fd5b50505050505050565b620013aa62002c33565b6000546001600160a01b03908116911614620013fc576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b03831617905562001426426202a30062002c7b565b60065550565b60075460009081805b8281101562001609576000600782815481106200144e57fe5b6000918252602080832090910154604080516313082b1d60e21b815290516001600160a01b0390921694508492634c20ac7492600480840193829003018186803b1580156200149c57600080fd5b505afa158015620014b1573d6000803e3d6000fd5b505050506040513d6020811015620014c857600080fd5b50516001546040805163fc57d4df60e01b81526001600160a01b0380851660048301529151939450600093919092169163fc57d4df91602480830192602092919082900301818787803b1580156200151f57600080fd5b505af115801562001534573d6000803e3d6000fd5b505050506040513d60208110156200154b57600080fd5b50516040805163f919b4bf60e01b81526001600160a01b038b8116600483015291519293506000929186169163f919b4bf91602480820192602092909190829003018186803b1580156200159e57600080fd5b505afa158015620015b3573d6000803e3d6000fd5b505050506040513d6020811015620015ca57600080fd5b505190506000620015e2828463ffffffff62002cd616565b9050620015f6878263ffffffff62002c7b16565b9650505050505080600101905062001435565b506200162481670de0b6b3a764000063ffffffff62002d3416565b949350505050565b60008062000c22836200142c565b6200164462002c33565b6000546001600160a01b0390811691161462001696576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600c602052604090205460ff1615620016bd57600080fd5b60008190506000816001600160a01b0316634c20ac746040518163ffffffff1660e01b815260040160206040518083038186803b158015620016fe57600080fd5b505afa15801562001713573d6000803e3d6000fd5b505050506040513d60208110156200172a57600080fd5b50516001600160a01b03808216600081815260096020908152604080832080546001600160a01b0319908116968b169687179091556007805460018181019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507f0d4aa38d72aeeb4686737a96fec3064146b373b310127c39e9405ceabb0968bd92918290030190a1505050565b60015460408051634461a17560e11b81526001600160a01b03858116600483015260248201859052915160009392909216916388c342ea9160448082019260209290919082900301818787803b1580156200184f57600080fd5b505af115801562000ca4573d6000803e3d6000fd5b336001600160a01b0382161415620018c3576040805162461bcd60e51b815260206004820152601b60248201527f796f752063616e74206c697175696461746520796f757273656c660000000000604482015290519081900360640190fd5b600854600754600060608367ffffffffffffffff81118015620018e557600080fd5b5060405190808252806020026020018201604052801562001910578160200160208202803683370190505b50905060005b8481101562001a3d576000600882815481106200192f57fe5b6000918252602080832090910154604080516305eff7ef60e21b81526001600160a01b038c81166004830152915191909216945084936317bfdfbc93602480850194919392918390030190829087803b1580156200198c57600080fd5b505af1158015620019a1573d6000803e3d6000fd5b505050506040513d6020811015620019b857600080fd5b50518351849084908110620019c957fe5b6020908102919091018101919091526001600160a01b038083166000908152600b9092526040822054855162001a1992919091169086908690811062001a0b57fe5b602002602001015162000c36565b905062001a2d858263ffffffff62002c7b16565b9450505080600101905062001916565b50600062001a4b866200162c565b905082811162001c2a5760005b8581101562001b465760006008828154811062001a7157fe5b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663ab292f9b893387868151811062001aaf57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801562001b2057600080fd5b505af115801562001b35573d6000803e3d6000fd5b505050505080600101905062001a58565b5060005b8481101562001be55760006007828154811062001b6357fe5b600091825260208220015460408051633d2d78f960e21b81526001600160a01b038c811660048301523360248301529151919092169350839263f4b5e3e4926044808201939182900301818387803b15801562001bbf57600080fd5b505af115801562001bd4573d6000803e3d6000fd5b505050505080600101905062001b4a565b50604080516001600160a01b038816815233602082015281517fce054da468b0607d4d65949d7572acd17087e593b3e5be27ba665ba1a60ad75b929181900390910190a15b505050505050565b6000546001600160a01b031690565b60085460009081805b8281101562001d925760006008828154811062001c6357fe5b6000918252602080832090910154604080516305eff7ef60e21b81526001600160a01b038b81166004830152915191909216945084926317bfdfbc926024808201939182900301818787803b15801562001cbc57600080fd5b505af115801562001cd1573d6000803e3d6000fd5b505050506040513d602081101562001ce857600080fd5b505190508062001cfa57505062001d89565b600062001d6f836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b15801562001d3a57600080fd5b505afa15801562001d4f573d6000803e3d6000fd5b505050506040513d602081101562001d6657600080fd5b505183620017f5565b905062001d83858263ffffffff62002c7b16565b94505050505b60010162001c4a565b509392505050565b60008062001da88462001c41565b9050600062001db7856200142c565b9050600062001dc6836200263f565b90508082101562001dde576000935050505062000cc0565b600062001df2838363ffffffff62002c3716565b6001546040805163fc57d4df60e01b81526001600160a01b038a811660048301529151939450600093919092169163fc57d4df91602480830192602092919082900301818787803b15801562001e4757600080fd5b505af115801562001e5c573d6000803e3d6000fd5b505050506040513d602081101562001e7357600080fd5b5051905062001ea38162001e9684670de0b6b3a764000063ffffffff62002cd616565b9063ffffffff62002d3416565b98975050505050505050565b6009602052600090815260409020546001600160a01b031681565b6008818154811062000fc057fe5b60075460009081805b82811015620016095760006007828154811062001efa57fe5b6000918252602080832090910154604080516313082b1d60e21b815290516001600160a01b0390921694508492634c20ac7492600480840193829003018186803b15801562001f4857600080fd5b505afa15801562001f5d573d6000803e3d6000fd5b505050506040513d602081101562001f7457600080fd5b50516001546040805163b04c6d3f60e01b81526001600160a01b0380851660048301529151939450600093919092169163b04c6d3f916024808301926020929190829003018186803b15801562001fca57600080fd5b505afa15801562001fdf573d6000803e3d6000fd5b505050506040513d602081101562001ff657600080fd5b50516040805163f919b4bf60e01b81526001600160a01b038b8116600483015291519293506000929186169163f919b4bf91602480820192602092909190829003018186803b1580156200204957600080fd5b505afa1580156200205e573d6000803e3d6000fd5b505050506040513d60208110156200207557600080fd5b5051905060006200208d828463ffffffff62002cd616565b9050620020a1878263ffffffff62002c7b16565b9650505050505080600101905062001ee1565b620020be62002c33565b6000546001600160a01b0390811691161462002110576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600654421015620021535760405162461bcd60e51b8152600401808060200182810382526027815260200180620038e86027913960400191505060405180910390fd5b6005546001600160a01b0316620021b1576040805162461bcd60e51b815260206004820152601760248201527f6e6f206e6577207761727020636f6e74726f6c20736574000000000000000000604482015290519081900360640190fd5b6001546005546040805163f2fde38b60e01b81526001600160a01b0392831660048201529051919092169163f2fde38b91602480830192600092919082900301818387803b1580156200220357600080fd5b505af115801562002218573d6000803e3d6000fd5b5050600754600854909250905060005b82811015620022c0576000600782815481106200224157fe5b60009182526020822001546005546040805163133cf9e160e21b81526001600160a01b03928316600482015290519190921693508392634cf3e784926024808201939182900301818387803b1580156200229a57600080fd5b505af1158015620022af573d6000803e3d6000fd5b505050505080600101905062002228565b5060005b8181101562000a8b57600060088281548110620022dd57fe5b60009182526020822001546005546040805163133cf9e160e21b81526001600160a01b03928316600482015290519190921693508392634cf3e784926024808201939182900301818387803b1580156200233657600080fd5b505af11580156200234b573d6000803e3d6000fd5b5050505050806001019050620022c4565b60085460009081805b8281101562001d92576000600882815481106200237e57fe5b600091825260208083209091015460408051637746efab60e01b81526001600160a01b038b8116600483015291519190921694508492637746efab9260248082019391829003018186803b158015620023d657600080fd5b505afa158015620023eb573d6000803e3d6000fd5b505050506040513d60208110156200240257600080fd5b505190508062002414575050620024a3565b600062002489836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b1580156200245457600080fd5b505afa15801562002469573d6000803e3d6000fd5b505050506040513d60208110156200248057600080fd5b50518362000c36565b90506200249d858263ffffffff62002c7b16565b94505050505b60010162002365565b620024b662002c33565b6000546001600160a01b0390811691161462002508576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600084848484306040516200251d9062002e7c565b948552602085019390935260408085019290925260608401526001600160a01b039091166080830152519081900360a001906000f08015801562002565573d6000803e3d6000fd5b506001600160a01b038088166000908152600a602052604080822054815163b1be82f160e01b815284861660048201529151949550909216928392839263b1be82f19260248084019382900301818387803b158015620025c457600080fd5b505af1158015620025d9573d6000803e3d6000fd5b5050604080516001600160a01b038c168152602081018b90528082018a9052606081018990526080810188905290517f84ddd88439c324a0a4e047ab99a95ca045be271ec642848c74029c99c328df5393509081900360a0019150a15050505050505050565b600062000cc0600262001e9684600363ffffffff62002cd616565b60075490565b6200266a62002c33565b6000546001600160a01b03908116911614620026bc576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b60015460408051634a42dd6d60e11b81526001600160a01b0386811660048301528581166024830152878116604483015291519190921691639485bada91606480830192600092919082900301818387803b1580156200271b57600080fd5b505af115801562002730573d6000803e3d6000fd5b505060025460405163a8edf11560e01b8152600481018981526001600160a01b0389811660248401526060604484019081528751606485015287516000975091909416945063a8edf115938b938b9389939092916084019060208501908083838d5b83811015620027ac57818101518382015260200162002792565b50505050905090810190601f168015620027da5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015620027fc57600080fd5b505af115801562002811573d6000803e3d6000fd5b505050506040513d60208110156200282857600080fd5b50516001600160a01b03868116600081815260096020908152604080832080546001600160a01b03199081169688169687179091556007805460018181019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507fe4136410250c225cb6546e2f16dccea79b35b32f295f337362d04375101342ff92918290030190a1505050505050565b600b602052600090815260409020546001600160a01b031681565b6000806200292783600363ffffffff62002d3416565b905062000c2f818063ffffffff62002c7b16565b6003546001600160a01b031681565b6001546001600160a01b031681565b6200296362002c33565b6000546001600160a01b03908116911614620029b5576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b038116620029fc5760405162461bcd60e51b8152600401808060200182810382526026815260200180620038c26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008062002a65846200235c565b9050600062002a748562001ed8565b9050600062002a83836200263f565b90508082101562002a9b576000935050505062000cc0565b600062002aaf838363ffffffff62002c3716565b6001546040805163b04c6d3f60e01b81526001600160a01b038a811660048301529151939450600093919092169163b04c6d3f916024808301926020929190829003018186803b15801562002b0357600080fd5b505afa15801562001e5c573d6000803e3d6000fd5b60085460009081805b8281101562001d925760006008828154811062002b3a57fe5b600091825260208083209091015460408051638f7bf4fd60e01b81526001600160a01b038b8116600483015291519190921694508492638f7bf4fd9260248082019391829003018186803b15801562002b9257600080fd5b505afa15801562002ba7573d6000803e3d6000fd5b505050506040513d602081101562002bbe57600080fd5b505190508062002bd057505062002c2a565b600062002c10836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b1580156200245457600080fd5b905062002c24858263ffffffff62002c7b16565b94505050505b60010162002b21565b3390565b600062000c2f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d78565b60008282018381101562000c2f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002ce75750600062000cc0565b8282028284828162002cf557fe5b041462000c2f5760405162461bcd60e51b81526004018080602001828103825260218152602001806200390f6021913960400191505060405180910390fd5b600062000c2f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002e13565b6000818484111562002e0b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002dcf57818101518382015260200162002db5565b50505050905090810190601f16801562002dfd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818362002e655760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002dcf57818101518382015260200162002db5565b50600083858162002e7257fe5b0495945050505050565b610a378062002e8b8339019056fe608060405234801561001057600080fd5b50604051610a37380380610a37833981810160405260a081101561003357600080fd5b508051602082015160408301516060840151608090940151600080546001600160a01b0319166001600160a01b03831617905592939192909190848484848461007e8585858561008d565b505050505050505050506102bc565b6100a7622014808561017060201b6105901790919060201c565b6002556100f66100c562201480836101c1602090811b61053717901c565b6100e4670de0b6b3a7640000866101c160201b6105371790919060201c565b61017060201b6105901790919060201c565b6001556101118262201480610170602090811b61059017901c565b60038190556004829055600254600154604080519283526020830191909152818101929092526060810183905290517f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9181900360800190a150505050565b60006101b883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061021a60201b60201c565b90505b92915050565b6000826101d0575060006101bb565b828202828482816101dd57fe5b04146101b85760405162461bcd60e51b8152600401808060200182810382526021815260200180610a166021913960400191505060405180910390fd5b600081836102a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561026b578181015183820152602001610253565b50505050905090810190601f1680156102985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816102b257fe5b0495945050505050565b61074b806102cb6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a385fb9611610066578063a385fb9614610164578063b81688161461016c578063b9f9850a1461019b578063f14039de146101a3578063fd2da339146101ab5761009e565b806315f24053146100a35780632037f3e7146100de5780636e71e2d81461010f5780638726bb89146101385780638da5cb5b14610140575b600080fd5b6100cc600480360360608110156100b957600080fd5b50803590602081013590604001356101b3565b60408051918252519081900360200190f35b61010d600480360360808110156100f457600080fd5b50803590602081013590604081013590606001356101ca565b005b6100cc6004803603606081101561012557600080fd5b5080359060208101359060400135610225565b6100cc61027b565b610148610281565b604080516001600160a01b039092168252519081900360200190f35b6100cc610290565b6100cc6004803603608081101561018257600080fd5b5080359060208101359060408101359060600135610297565b6100cc610316565b6100cc61031c565b6100cc610322565b60006101c0848484610328565b90505b9392505050565b6000546001600160a01b031633146102135760405162461bcd60e51b81526004018080602001828103825260268152602001806106f06026913960400191505060405180910390fd5b61021f848484846103f1565b50505050565b600082610234575060006101c3565b6101c06102578361024b878763ffffffff61049216565b9063ffffffff6104f516565b61026f85670de0b6b3a764000063ffffffff61053716565b9063ffffffff61059016565b60015481565b6000546001600160a01b031681565b6220148081565b6000806102b2670de0b6b3a76400008463ffffffff6104f516565b905060006102c1878787610328565b905060006102e1670de0b6b3a764000061026f848663ffffffff61053716565b905061030a670de0b6b3a764000061026f836102fe8c8c8c610225565b9063ffffffff61053716565b98975050505050505050565b60035481565b60025481565b60045481565b600080610336858585610225565b9050600454811161037c57610374600254610368670de0b6b3a764000061026f6001548661053790919063ffffffff16565b9063ffffffff61049216565b9150506101c3565b60006103a7600254610368670de0b6b3a764000061026f60015460045461053790919063ffffffff16565b905060006103c0600454846104f590919063ffffffff16565b90506103e782610368670de0b6b3a764000061026f6003548661053790919063ffffffff16565b93505050506101c3565b610404846220148063ffffffff61059016565b60025561041d610257622014808363ffffffff61053716565b600155610433826220148063ffffffff61059016565b60038190556004829055600254600154604080519283526020830191909152818101929092526060810183905290517f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9181900360800190a150505050565b6000828201838110156104ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60006104ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506105d2565b600082610546575060006104ef565b8282028284828161055357fe5b04146104ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806106cf6021913960400191505060405180910390fd5b60006104ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610669565b600081848411156106615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561062657818101518382015260200161060e565b50505050905090810190601f1680156106535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836106b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561062657818101518382015260200161060e565b5060008385816106c457fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776f6e6c7920746865206f776e6572206d61792063616c6c20746869732066756e6374696f6e2ea26469706673582212205f65e9e52539d0ff7de90544b865c4f14afc0816467eb10ea4c965b7234c764264736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373796f752063616e7420756772616465207965742c206c657373207468616e2074776f2064617973536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220bf17c465e8406b5b143ebd8c68b294e6d7852c76cd640f4f3eb1c58f1325bc1064736f6c634300060600330000000000000000000000004a224cd0517f08b26608a2f73bf390b01a6618c800000000000000000000000036c6bafb43718b776d32f2389cdf9c25823c19650000000000000000000000005cb611a4f27b4ba8ab8115375b8fb5d79e8afdce0000000000000000000000000efe54e77e5cc430342088da27ef73f42b482d33

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620002a45760003560e01c806388236b5a1162000171578063cf23073811620000d5578063ed6072f61162000093578063ed6072f614620008c2578063efdebdf514620008e2578063f24a534e14620008ec578063f2fde38b14620008f6578063f3c7f987146200091f578063faa8f7c2146200095057620002a4565b8063cf230738146200075a578063da4f7fb2146200079b578063e1535d1214620007bb578063e50f4a3014620007c5578063ea3f847f146200089957620002a4565b8063ab5e2c99116200012f578063ab5e2c991462000684578063acc9e5b114620006b5578063b042079214620006de578063bc64cd4e14620006fe578063bc816cac1462000727578063be9287e3146200073157620002a4565b806388236b5a14620005d057806388c342ea14620005f95780638ac5d4a314620006285780638da5cb5b1462000651578063a2b35d9d146200065b57620002a4565b80635cf5738911620002195780636af5f75211620001d75780636af5f7521462000506578063715018a6146200051057806377ca931c146200051a5780637a58dc9f14620005555780637af70ba6146200057e5780637c17d23714620005a757620002a4565b80635cf57389146200044d578063622263081462000457578063652b9b41146200047757806368f505ad14620004b4578063692d295d14620004dd57620002a4565b80631a2a16b511620002675780631a2a16b5146200038d5780631dbb0b8114620003bc5780632792bdd014620003c65780632f74020c146200041a5780634e590bee146200042457620002a4565b806302e0df2d14620002a95780630a55598914620002d45780630a8a4d3f14620003035780630c1e2b92146200031f578063169d4b141462000364575b600080fd5b620002d260048036036020811015620002c157600080fd5b50356001600160a01b031662000979565b005b620002d260048036036040811015620002ec57600080fd5b506001600160a01b03813516906020013562000a90565b6200030d62000bf3565b60408051918252519081900360200190f35b62000348600480360360208110156200033757600080fd5b50356001600160a01b031662000bf9565b604080516001600160a01b039092168252519081900360200190f35b6200030d600480360360208110156200037c57600080fd5b50356001600160a01b031662000c14565b6200030d60048036036040811015620003a557600080fd5b506001600160a01b03813516906020013562000c36565b6200030d62000cc6565b620002d26004803603610100811015620003df57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e001356001600160a01b031662000ccc565b6200034862000f0e565b6200030d600480360360208110156200043c57600080fd5b50356001600160a01b031662000f1d565b6200034862000fa3565b62000348600480360360208110156200046f57600080fd5b503562000fb2565b620004a0600480360360208110156200048f57600080fd5b50356001600160a01b031662000fda565b604080519115158252519081900360200190f35b620002d260048036036020811015620004cc57600080fd5b50356001600160a01b031662000fef565b6200030d60048036036020811015620004f557600080fd5b50356001600160a01b0316620011aa565b6200034862001212565b620002d262001221565b620002d2600480360360608110156200053257600080fd5b506001600160a01b038135811691602081013582169160409091013516620012c7565b620002d2600480360360208110156200056d57600080fd5b50356001600160a01b0316620013a0565b6200030d600480360360208110156200059657600080fd5b50356001600160a01b03166200142c565b6200030d60048036036020811015620005bf57600080fd5b50356001600160a01b03166200162c565b620002d260048036036020811015620005e857600080fd5b50356001600160a01b03166200163a565b6200030d600480360360408110156200061157600080fd5b506001600160a01b038135169060200135620017f5565b620002d2600480360360208110156200064057600080fd5b50356001600160a01b031662001864565b6200034862001c32565b6200030d600480360360208110156200067357600080fd5b50356001600160a01b031662001c41565b6200030d600480360360408110156200069c57600080fd5b506001600160a01b038135811691602001351662001d9a565b6200034860048036036020811015620006cd57600080fd5b50356001600160a01b031662001eaf565b6200034860048036036020811015620006f657600080fd5b503562001eca565b6200030d600480360360208110156200071657600080fd5b50356001600160a01b031662001ed8565b620002d2620020b4565b6200030d600480360360208110156200074957600080fd5b50356001600160a01b03166200235c565b620002d2600480360360a08110156200077257600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135620024ac565b6200030d60048036036020811015620007b357600080fd5b50356200263f565b6200030d6200265a565b620002d2600480360360a0811015620007dd57600080fd5b8135916001600160a01b03602082013581169260408301358216926060810135909216919081019060a0810160808201356401000000008111156200082157600080fd5b8201836020820111156200083457600080fd5b803590602001918460018302840111640100000000831117156200085757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062002660945050505050565b6200034860048036036020811015620008b157600080fd5b50356001600160a01b0316620028f6565b6200030d60048036036020811015620008da57600080fd5b503562002911565b620003486200293b565b620003486200294a565b620002d2600480360360208110156200090e57600080fd5b50356001600160a01b031662002959565b6200030d600480360360408110156200093757600080fd5b506001600160a01b038135811691602001351662002a57565b6200030d600480360360208110156200096857600080fd5b50356001600160a01b031662002b18565b6200098362002c33565b6000546001600160a01b03908116911614620009d5576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600854600480546001600160a01b0319166001600160a01b03841617905560005b8181101562000a8b5760006008828154811062000a0f57fe5b600091825260208220015460408051632c8fcd6560e21b81526001600160a01b0388811660048301529151919092169350839263b23f3594926024808201939182900301818387803b15801562000a6557600080fd5b505af115801562000a7a573d6000803e3d6000fd5b5050505050806001019050620009f6565b505050565b600062000a9d3362001c41565b9050600062000aac336200162c565b9050600062000ac2828463ffffffff62002c3716565b9050600062000ad28686620017f5565b90508082101562000b2a576040805162461bcd60e51b815260206004820152601b60248201527f426f72726f77696e67206d6f7265207468616e20616c6c6f7765640000000000604482015290519081900360640190fd5b6001600160a01b038087166000908152600a6020526040808220548151631196a36960e11b8152600481018a90523360248201529151931692839263232d46d2926044808201939182900301818387803b15801562000b8857600080fd5b505af115801562000b9d573d6000803e3d6000fd5b5050604080513381526001600160a01b038b1660208201528082018a905290517f39afaad37daff6f7a5998bf9de35bb3f46d51f73227bb182d92c016c981a82909350908190036060019150a150505050505050565b60065481565b600a602052600090815260409020546001600160a01b031681565b60008062000c228362001ed8565b905062000c2f8162002911565b9392505050565b60015460408051631a2a16b560e01b81526001600160a01b0385811660048301526024820185905291516000939290921691631a2a16b591604480820192602092909190829003018186803b15801562000c8f57600080fd5b505afa15801562000ca4573d6000803e3d6000fd5b505050506040513d602081101562000cbb57600080fd5b505190505b92915050565b60085490565b62000cd662002c33565b6000546001600160a01b0390811691161462000d28576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6000878787873060405162000d3d9062002e7c565b948552602085019390935260408085019290925260608401526001600160a01b039091166080830152519081900360a001906000f08015801562000d85573d6000803e3d6000fd5b506003546004805460408051630f10a94560e31b81526001600160a01b03808716948201949094528784166024820152918316604483015260648201899052608482018e905260a482018890525193945060009391909216916378854a289160c480830192602092919082900301818787803b15801562000e0557600080fd5b505af115801562000e1a573d6000803e3d6000fd5b505050506040513d602081101562000e3157600080fd5b50516001600160a01b038085166000818152600a6020908152604080832080548688166001600160a01b031991821681179092556008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054831684179055828652600c8552838620805460ff19169091179055600b845293829020805490941690941790925581519283529286169282019290925281519293507f2c3b5544df8032e6313fd1e59faede21004ab06bb69c1f6640a41566225cb00a929081900390910190a150505050505050505050565b6005546001600160a01b031681565b6001546040805163b04c6d3f60e01b81526001600160a01b0384811660048301529151600093929092169163b04c6d3f91602480820192602092909190829003018186803b15801562000f6f57600080fd5b505afa15801562000f84573d6000803e3d6000fd5b505050506040513d602081101562000f9b57600080fd5b505192915050565b6004546001600160a01b031681565b6007818154811062000fc057fe5b6000918252602090912001546001600160a01b0316905081565b600c6020526000908152604090205460ff1681565b62000ff962002c33565b6000546001600160a01b039081169116146200104b576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600c602052604090205460ff16156200107257600080fd5b60008190506000816001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b158015620010b357600080fd5b505afa158015620010c8573d6000803e3d6000fd5b505050506040513d6020811015620010df57600080fd5b50516001600160a01b038082166000818152600a6020908152604080832080546001600160a01b0319908116968b169687179091556008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507ff82a5541ca7d6caee68c834562b18f4b3e4228a200aae195fdf26770dd28cd1592918290030190a1505050565b6001546040805163fc57d4df60e01b81526001600160a01b0384811660048301529151600093929092169163fc57d4df9160248082019260209290919082900301818787803b158015620011fd57600080fd5b505af115801562000f84573d6000803e3d6000fd5b6002546001600160a01b031681565b6200122b62002c33565b6000546001600160a01b039081169116146200127d576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b620012d162002c33565b6000546001600160a01b0390811691161462001323576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b60015460408051634a42dd6d60e11b81526001600160a01b0386811660048301528581166024830152848116604483015291519190921691639485bada91606480830192600092919082900301818387803b1580156200138257600080fd5b505af115801562001397573d6000803e3d6000fd5b50505050505050565b620013aa62002c33565b6000546001600160a01b03908116911614620013fc576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b03831617905562001426426202a30062002c7b565b60065550565b60075460009081805b8281101562001609576000600782815481106200144e57fe5b6000918252602080832090910154604080516313082b1d60e21b815290516001600160a01b0390921694508492634c20ac7492600480840193829003018186803b1580156200149c57600080fd5b505afa158015620014b1573d6000803e3d6000fd5b505050506040513d6020811015620014c857600080fd5b50516001546040805163fc57d4df60e01b81526001600160a01b0380851660048301529151939450600093919092169163fc57d4df91602480830192602092919082900301818787803b1580156200151f57600080fd5b505af115801562001534573d6000803e3d6000fd5b505050506040513d60208110156200154b57600080fd5b50516040805163f919b4bf60e01b81526001600160a01b038b8116600483015291519293506000929186169163f919b4bf91602480820192602092909190829003018186803b1580156200159e57600080fd5b505afa158015620015b3573d6000803e3d6000fd5b505050506040513d6020811015620015ca57600080fd5b505190506000620015e2828463ffffffff62002cd616565b9050620015f6878263ffffffff62002c7b16565b9650505050505080600101905062001435565b506200162481670de0b6b3a764000063ffffffff62002d3416565b949350505050565b60008062000c22836200142c565b6200164462002c33565b6000546001600160a01b0390811691161462001696576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600c602052604090205460ff1615620016bd57600080fd5b60008190506000816001600160a01b0316634c20ac746040518163ffffffff1660e01b815260040160206040518083038186803b158015620016fe57600080fd5b505afa15801562001713573d6000803e3d6000fd5b505050506040513d60208110156200172a57600080fd5b50516001600160a01b03808216600081815260096020908152604080832080546001600160a01b0319908116968b169687179091556007805460018181019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507f0d4aa38d72aeeb4686737a96fec3064146b373b310127c39e9405ceabb0968bd92918290030190a1505050565b60015460408051634461a17560e11b81526001600160a01b03858116600483015260248201859052915160009392909216916388c342ea9160448082019260209290919082900301818787803b1580156200184f57600080fd5b505af115801562000ca4573d6000803e3d6000fd5b336001600160a01b0382161415620018c3576040805162461bcd60e51b815260206004820152601b60248201527f796f752063616e74206c697175696461746520796f757273656c660000000000604482015290519081900360640190fd5b600854600754600060608367ffffffffffffffff81118015620018e557600080fd5b5060405190808252806020026020018201604052801562001910578160200160208202803683370190505b50905060005b8481101562001a3d576000600882815481106200192f57fe5b6000918252602080832090910154604080516305eff7ef60e21b81526001600160a01b038c81166004830152915191909216945084936317bfdfbc93602480850194919392918390030190829087803b1580156200198c57600080fd5b505af1158015620019a1573d6000803e3d6000fd5b505050506040513d6020811015620019b857600080fd5b50518351849084908110620019c957fe5b6020908102919091018101919091526001600160a01b038083166000908152600b9092526040822054855162001a1992919091169086908690811062001a0b57fe5b602002602001015162000c36565b905062001a2d858263ffffffff62002c7b16565b9450505080600101905062001916565b50600062001a4b866200162c565b905082811162001c2a5760005b8581101562001b465760006008828154811062001a7157fe5b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663ab292f9b893387868151811062001aaf57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801562001b2057600080fd5b505af115801562001b35573d6000803e3d6000fd5b505050505080600101905062001a58565b5060005b8481101562001be55760006007828154811062001b6357fe5b600091825260208220015460408051633d2d78f960e21b81526001600160a01b038c811660048301523360248301529151919092169350839263f4b5e3e4926044808201939182900301818387803b15801562001bbf57600080fd5b505af115801562001bd4573d6000803e3d6000fd5b505050505080600101905062001b4a565b50604080516001600160a01b038816815233602082015281517fce054da468b0607d4d65949d7572acd17087e593b3e5be27ba665ba1a60ad75b929181900390910190a15b505050505050565b6000546001600160a01b031690565b60085460009081805b8281101562001d925760006008828154811062001c6357fe5b6000918252602080832090910154604080516305eff7ef60e21b81526001600160a01b038b81166004830152915191909216945084926317bfdfbc926024808201939182900301818787803b15801562001cbc57600080fd5b505af115801562001cd1573d6000803e3d6000fd5b505050506040513d602081101562001ce857600080fd5b505190508062001cfa57505062001d89565b600062001d6f836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b15801562001d3a57600080fd5b505afa15801562001d4f573d6000803e3d6000fd5b505050506040513d602081101562001d6657600080fd5b505183620017f5565b905062001d83858263ffffffff62002c7b16565b94505050505b60010162001c4a565b509392505050565b60008062001da88462001c41565b9050600062001db7856200142c565b9050600062001dc6836200263f565b90508082101562001dde576000935050505062000cc0565b600062001df2838363ffffffff62002c3716565b6001546040805163fc57d4df60e01b81526001600160a01b038a811660048301529151939450600093919092169163fc57d4df91602480830192602092919082900301818787803b15801562001e4757600080fd5b505af115801562001e5c573d6000803e3d6000fd5b505050506040513d602081101562001e7357600080fd5b5051905062001ea38162001e9684670de0b6b3a764000063ffffffff62002cd616565b9063ffffffff62002d3416565b98975050505050505050565b6009602052600090815260409020546001600160a01b031681565b6008818154811062000fc057fe5b60075460009081805b82811015620016095760006007828154811062001efa57fe5b6000918252602080832090910154604080516313082b1d60e21b815290516001600160a01b0390921694508492634c20ac7492600480840193829003018186803b15801562001f4857600080fd5b505afa15801562001f5d573d6000803e3d6000fd5b505050506040513d602081101562001f7457600080fd5b50516001546040805163b04c6d3f60e01b81526001600160a01b0380851660048301529151939450600093919092169163b04c6d3f916024808301926020929190829003018186803b15801562001fca57600080fd5b505afa15801562001fdf573d6000803e3d6000fd5b505050506040513d602081101562001ff657600080fd5b50516040805163f919b4bf60e01b81526001600160a01b038b8116600483015291519293506000929186169163f919b4bf91602480820192602092909190829003018186803b1580156200204957600080fd5b505afa1580156200205e573d6000803e3d6000fd5b505050506040513d60208110156200207557600080fd5b5051905060006200208d828463ffffffff62002cd616565b9050620020a1878263ffffffff62002c7b16565b9650505050505080600101905062001ee1565b620020be62002c33565b6000546001600160a01b0390811691161462002110576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600654421015620021535760405162461bcd60e51b8152600401808060200182810382526027815260200180620038e86027913960400191505060405180910390fd5b6005546001600160a01b0316620021b1576040805162461bcd60e51b815260206004820152601760248201527f6e6f206e6577207761727020636f6e74726f6c20736574000000000000000000604482015290519081900360640190fd5b6001546005546040805163f2fde38b60e01b81526001600160a01b0392831660048201529051919092169163f2fde38b91602480830192600092919082900301818387803b1580156200220357600080fd5b505af115801562002218573d6000803e3d6000fd5b5050600754600854909250905060005b82811015620022c0576000600782815481106200224157fe5b60009182526020822001546005546040805163133cf9e160e21b81526001600160a01b03928316600482015290519190921693508392634cf3e784926024808201939182900301818387803b1580156200229a57600080fd5b505af1158015620022af573d6000803e3d6000fd5b505050505080600101905062002228565b5060005b8181101562000a8b57600060088281548110620022dd57fe5b60009182526020822001546005546040805163133cf9e160e21b81526001600160a01b03928316600482015290519190921693508392634cf3e784926024808201939182900301818387803b1580156200233657600080fd5b505af11580156200234b573d6000803e3d6000fd5b5050505050806001019050620022c4565b60085460009081805b8281101562001d92576000600882815481106200237e57fe5b600091825260208083209091015460408051637746efab60e01b81526001600160a01b038b8116600483015291519190921694508492637746efab9260248082019391829003018186803b158015620023d657600080fd5b505afa158015620023eb573d6000803e3d6000fd5b505050506040513d60208110156200240257600080fd5b505190508062002414575050620024a3565b600062002489836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b1580156200245457600080fd5b505afa15801562002469573d6000803e3d6000fd5b505050506040513d60208110156200248057600080fd5b50518362000c36565b90506200249d858263ffffffff62002c7b16565b94505050505b60010162002365565b620024b662002c33565b6000546001600160a01b0390811691161462002508576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b600084848484306040516200251d9062002e7c565b948552602085019390935260408085019290925260608401526001600160a01b039091166080830152519081900360a001906000f08015801562002565573d6000803e3d6000fd5b506001600160a01b038088166000908152600a602052604080822054815163b1be82f160e01b815284861660048201529151949550909216928392839263b1be82f19260248084019382900301818387803b158015620025c457600080fd5b505af1158015620025d9573d6000803e3d6000fd5b5050604080516001600160a01b038c168152602081018b90528082018a9052606081018990526080810188905290517f84ddd88439c324a0a4e047ab99a95ca045be271ec642848c74029c99c328df5393509081900360a0019150a15050505050505050565b600062000cc0600262001e9684600363ffffffff62002cd616565b60075490565b6200266a62002c33565b6000546001600160a01b03908116911614620026bc576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b60015460408051634a42dd6d60e11b81526001600160a01b0386811660048301528581166024830152878116604483015291519190921691639485bada91606480830192600092919082900301818387803b1580156200271b57600080fd5b505af115801562002730573d6000803e3d6000fd5b505060025460405163a8edf11560e01b8152600481018981526001600160a01b0389811660248401526060604484019081528751606485015287516000975091909416945063a8edf115938b938b9389939092916084019060208501908083838d5b83811015620027ac57818101518382015260200162002792565b50505050905090810190601f168015620027da5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015620027fc57600080fd5b505af115801562002811573d6000803e3d6000fd5b505050506040513d60208110156200282857600080fd5b50516001600160a01b03868116600081815260096020908152604080832080546001600160a01b03199081169688169687179091556007805460018181019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054831688179055868552600c8452828520805460ff19169091179055600b8352928190208054909316909317909155815192835290519293507fe4136410250c225cb6546e2f16dccea79b35b32f295f337362d04375101342ff92918290030190a1505050505050565b600b602052600090815260409020546001600160a01b031681565b6000806200292783600363ffffffff62002d3416565b905062000c2f818063ffffffff62002c7b16565b6003546001600160a01b031681565b6001546001600160a01b031681565b6200296362002c33565b6000546001600160a01b03908116911614620029b5576040805162461bcd60e51b8152602060048201819052602482015260008051602062003930833981519152604482015290519081900360640190fd5b6001600160a01b038116620029fc5760405162461bcd60e51b8152600401808060200182810382526026815260200180620038c26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008062002a65846200235c565b9050600062002a748562001ed8565b9050600062002a83836200263f565b90508082101562002a9b576000935050505062000cc0565b600062002aaf838363ffffffff62002c3716565b6001546040805163b04c6d3f60e01b81526001600160a01b038a811660048301529151939450600093919092169163b04c6d3f916024808301926020929190829003018186803b15801562002b0357600080fd5b505afa15801562001e5c573d6000803e3d6000fd5b60085460009081805b8281101562001d925760006008828154811062002b3a57fe5b600091825260208083209091015460408051638f7bf4fd60e01b81526001600160a01b038b8116600483015291519190921694508492638f7bf4fd9260248082019391829003018186803b15801562002b9257600080fd5b505afa15801562002ba7573d6000803e3d6000fd5b505050506040513d602081101562002bbe57600080fd5b505190508062002bd057505062002c2a565b600062002c10836001600160a01b031663591cec866040518163ffffffff1660e01b815260040160206040518083038186803b1580156200245457600080fd5b905062002c24858263ffffffff62002c7b16565b94505050505b60010162002b21565b3390565b600062000c2f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062002d78565b60008282018381101562000c2f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008262002ce75750600062000cc0565b8282028284828162002cf557fe5b041462000c2f5760405162461bcd60e51b81526004018080602001828103825260218152602001806200390f6021913960400191505060405180910390fd5b600062000c2f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062002e13565b6000818484111562002e0b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002dcf57818101518382015260200162002db5565b50505050905090810190601f16801562002dfd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818362002e655760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831562002dcf57818101518382015260200162002db5565b50600083858162002e7257fe5b0495945050505050565b610a378062002e8b8339019056fe608060405234801561001057600080fd5b50604051610a37380380610a37833981810160405260a081101561003357600080fd5b508051602082015160408301516060840151608090940151600080546001600160a01b0319166001600160a01b03831617905592939192909190848484848461007e8585858561008d565b505050505050505050506102bc565b6100a7622014808561017060201b6105901790919060201c565b6002556100f66100c562201480836101c1602090811b61053717901c565b6100e4670de0b6b3a7640000866101c160201b6105371790919060201c565b61017060201b6105901790919060201c565b6001556101118262201480610170602090811b61059017901c565b60038190556004829055600254600154604080519283526020830191909152818101929092526060810183905290517f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9181900360800190a150505050565b60006101b883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061021a60201b60201c565b90505b92915050565b6000826101d0575060006101bb565b828202828482816101dd57fe5b04146101b85760405162461bcd60e51b8152600401808060200182810382526021815260200180610a166021913960400191505060405180910390fd5b600081836102a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561026b578181015183820152602001610253565b50505050905090810190601f1680156102985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816102b257fe5b0495945050505050565b61074b806102cb6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a385fb9611610066578063a385fb9614610164578063b81688161461016c578063b9f9850a1461019b578063f14039de146101a3578063fd2da339146101ab5761009e565b806315f24053146100a35780632037f3e7146100de5780636e71e2d81461010f5780638726bb89146101385780638da5cb5b14610140575b600080fd5b6100cc600480360360608110156100b957600080fd5b50803590602081013590604001356101b3565b60408051918252519081900360200190f35b61010d600480360360808110156100f457600080fd5b50803590602081013590604081013590606001356101ca565b005b6100cc6004803603606081101561012557600080fd5b5080359060208101359060400135610225565b6100cc61027b565b610148610281565b604080516001600160a01b039092168252519081900360200190f35b6100cc610290565b6100cc6004803603608081101561018257600080fd5b5080359060208101359060408101359060600135610297565b6100cc610316565b6100cc61031c565b6100cc610322565b60006101c0848484610328565b90505b9392505050565b6000546001600160a01b031633146102135760405162461bcd60e51b81526004018080602001828103825260268152602001806106f06026913960400191505060405180910390fd5b61021f848484846103f1565b50505050565b600082610234575060006101c3565b6101c06102578361024b878763ffffffff61049216565b9063ffffffff6104f516565b61026f85670de0b6b3a764000063ffffffff61053716565b9063ffffffff61059016565b60015481565b6000546001600160a01b031681565b6220148081565b6000806102b2670de0b6b3a76400008463ffffffff6104f516565b905060006102c1878787610328565b905060006102e1670de0b6b3a764000061026f848663ffffffff61053716565b905061030a670de0b6b3a764000061026f836102fe8c8c8c610225565b9063ffffffff61053716565b98975050505050505050565b60035481565b60025481565b60045481565b600080610336858585610225565b9050600454811161037c57610374600254610368670de0b6b3a764000061026f6001548661053790919063ffffffff16565b9063ffffffff61049216565b9150506101c3565b60006103a7600254610368670de0b6b3a764000061026f60015460045461053790919063ffffffff16565b905060006103c0600454846104f590919063ffffffff16565b90506103e782610368670de0b6b3a764000061026f6003548661053790919063ffffffff16565b93505050506101c3565b610404846220148063ffffffff61059016565b60025561041d610257622014808363ffffffff61053716565b600155610433826220148063ffffffff61059016565b60038190556004829055600254600154604080519283526020830191909152818101929092526060810183905290517f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9181900360800190a150505050565b6000828201838110156104ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60006104ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506105d2565b600082610546575060006104ef565b8282028284828161055357fe5b04146104ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806106cf6021913960400191505060405180910390fd5b60006104ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610669565b600081848411156106615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561062657818101518382015260200161060e565b50505050905090810190601f1680156106535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836106b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561062657818101518382015260200161060e565b5060008385816106c457fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776f6e6c7920746865206f776e6572206d61792063616c6c20746869732066756e6374696f6e2ea26469706673582212205f65e9e52539d0ff7de90544b865c4f14afc0816467eb10ea4c965b7234c764264736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373796f752063616e7420756772616465207965742c206c657373207468616e2074776f2064617973536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220bf17c465e8406b5b143ebd8c68b294e6d7852c76cd640f4f3eb1c58f1325bc1064736f6c63430006060033

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

0000000000000000000000004a224cd0517f08b26608a2f73bf390b01a6618c800000000000000000000000036c6bafb43718b776d32f2389cdf9c25823c19650000000000000000000000005cb611a4f27b4ba8ab8115375b8fb5d79e8afdce0000000000000000000000000efe54e77e5cc430342088da27ef73f42b482d33

-----Decoded View---------------
Arg [0] : _oracle (address): 0x4A224CD0517f08B26608a2f73bF390b01a6618c8
Arg [1] : _WVLPF (address): 0x36C6BAFB43718B776d32f2389CDf9c25823C1965
Arg [2] : _WVSCF (address): 0x5Cb611A4F27B4bA8aB8115375b8fB5D79e8AFdCE
Arg [3] : _warpTeam (address): 0x0EfE54e77e5Cc430342088DA27EF73f42B482D33

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004a224cd0517f08b26608a2f73bf390b01a6618c8
Arg [1] : 00000000000000000000000036c6bafb43718b776d32f2389cdf9c25823c1965
Arg [2] : 0000000000000000000000005cb611a4f27b4ba8ab8115375b8fb5d79e8afdce
Arg [3] : 0000000000000000000000000efe54e77e5cc430342088da27ef73f42b482d33


Deployed Bytecode Sourcemap

37095:27811:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37095:27811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;64592:311:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64592:311:0;-1:-1:-1;;;;;64592:311:0;;:::i;:::-;;57755:967;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;57755:967:0;;;;;;;;:::i;37408:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;37615:52;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37615:52:0;-1:-1:-1;;;;;37615:52:0;;:::i;:::-;;;;-1:-1:-1;;;;;37615:52:0;;;;;;;;;;;;;;57153:294;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57153:294:0;-1:-1:-1;;;;;57153:294:0;;:::i;50993:183::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;50993:183:0;;;;;;;;:::i;39847:100::-;;;:::i;43082:1385::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;43082:1385:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43082:1385:0;;:::i;37372:29::-;;;:::i;50191:171::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50191:171:0;-1:-1:-1;;;;;50191:171:0;;:::i;37342:23::-;;;:::i;37442:25::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37442:25:0;;:::i;37731:39::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37731:39:0;-1:-1:-1;;;;;37731:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;44475:547;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44475:547:0;-1:-1:-1;;;;;44475:547:0;;:::i;50599:132::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50599:132:0;-1:-1:-1;;;;;50599:132:0;;:::i;37262:32::-;;;:::i;2791:148::-;;;:::i;41932:204::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;41932:204:0;;;;;;;;;;;;;;;;;;;:::i;63407:159::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;63407:159:0;-1:-1:-1;;;;;63407:159:0;;:::i;47276:1269::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47276:1269:0;-1:-1:-1;;;;;47276:1269:0;;:::i;56696:248::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56696:248:0;-1:-1:-1;;;;;56696:248:0;;:::i;41516:408::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41516:408:0;-1:-1:-1;;;;;41516:408:0;;:::i;51460:167::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;51460:167:0;;;;;;;;:::i;58948:2735::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58948:2735:0;-1:-1:-1;;;;;58948:2735:0;;:::i;2149:79::-;;;:::i;54252:1006::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54252:1006:0;-1:-1:-1;;;;;54252:1006:0;;:::i;45349:629::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;45349:629:0;;;;;;;;;;:::i;37508:52::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37508:52:0;-1:-1:-1;;;;;37508:52:0;;:::i;37474:25::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37474:25:0;;:::i;48869:1106::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48869:1106:0;-1:-1:-1;;;;;48869:1106:0;;:::i;63703:712::-;;;:::i;52960:1043::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52960:1043:0;-1:-1:-1;;;;;52960:1043:0;;:::i;62346:820::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;62346:820:0;;;;;;;;;;;;;;;;;;;;;;;:::i;56318:170::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56318:170:0;;:::i;39631:100::-;;;:::i;40664:844::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;40664:844:0;;;-1:-1:-1;;;;;40664:844:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;40664:844:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40664:844:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40664:844:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40664:844:0;;-1:-1:-1;40664:844:0;;-1:-1:-1;;;;;40664:844:0:i;37674:50::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37674:50:0;-1:-1:-1;;;;;37674:50:0;;:::i;55756:381::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55756:381:0;;:::i;37301:32::-;;;:::i;37182:37::-;;;:::i;3094:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3094:244:0;-1:-1:-1;;;;;3094:244:0;;:::i;46333:647::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;46333:647:0;;;;;;;;;;:::i;51808:898::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51808:898:0;-1:-1:-1;;;;;51808:898:0;;:::i;64592:311::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;64686:8:::1;:15:::0;64712:8:::1;:19:::0;;-1:-1:-1;;;;;;64712:19:0::1;-1:-1:-1::0;;;;;64712:19:0;::::1;;::::0;;-1:-1:-1;64742:154:0::1;64766:11;64762:1;:15;64742:154;;;64799:17;64832:8;64841:1;64832:11;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;64859:25:::1;::::0;;-1:-1:-1;;;64859:25:0;;-1:-1:-1;;;;;64859:25:0;;::::1;;::::0;::::1;::::0;;;64832:11;;;::::1;::::0;-1:-1:-1;64832:11:0;;64859:15:::1;::::0;:25;;;;;;;;;;;64832:11;;64859:25;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;64859:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;64859:25:0;;;;64742:154;64779:3;;;;;64742:154;;;;2431:1;64592:311:::0;:::o;57755:967::-;57829:27;57859:33;57881:10;57859:21;:33::i;:::-;57829:63;;57903:25;57931:26;57946:10;57931:14;:26::i;:::-;57903:54;-1:-1:-1;57968:33:0;58004:66;57903:54;58040:19;58004:66;:21;:66;:::i;:::-;57968:102;;58083:26;58112:37;58128:11;58141:7;58112:15;:37::i;:::-;58083:66;;58319:18;58290:25;:47;;58268:124;;;;;-1:-1:-1;;;58268:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58520:30:0;;;58489:15;58520:30;;;:17;:30;;;;;;;58624:31;;-1:-1:-1;;;58624:31:0;;;;;;;;58644:10;58624:31;;;;;;58520:30;;;;;58624:10;;:31;;;;;;;;;;;58489:15;58520:30;58624:31;;;2:2:-1;;;;27:1;24;17:12;2:2;58624:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;58671:43:0;;;58681:10;58671:43;;-1:-1:-1;;;;;58671:43:0;;;;;;;;;;;;;;;;-1:-1:-1;58671:43:0;;;;;;;-1:-1:-1;58671:43:0;57755:967;;;;;;;:::o;37408:25::-;;;;:::o;37615:52::-;;;;;;;;;;;;-1:-1:-1;;;;;37615:52:0;;:::o;57153:294::-;57217:7;57237:32;57272:67;57320:8;57272:33;:67::i;:::-;57237:102;;57398:41;57414:24;57398:15;:41::i;:::-;57391:48;57153:294;-1:-1:-1;;;57153:294:0:o;50993:183::-;51130:6;;:38;;;-1:-1:-1;;;51130:38:0;;-1:-1:-1;;;;;51130:38:0;;;;;;;;;;;;;;;51098:7;;51130:6;;;;;:23;;:38;;;;;;;;;;;;;;;:6;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;51130:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51130:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51130:38:0;;-1:-1:-1;50993:183:0;;;;;:::o;39847:100::-;39924:8;:15;39847:100;:::o;43082:1385::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;43483:10:::1;43556:16;43591:18;43628:22;43669:8;43704:4;43518:206;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43518:206:0;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;43518:206:0::1;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;43803:5:0::1;::::0;43887:8:::1;::::0;;43803:199:::1;::::0;;-1:-1:-1;;;43803:199:0;;-1:-1:-1;;;;;43803:199:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;43887:8;;::::1;43803:199:::0;;;;;;;;;;;;;;;;;;;;;;;43483:252;;-1:-1:-1;43782:18:0::1;::::0;43803:5;;;::::1;::::0;:26:::1;::::0;:199;;;;;::::1;::::0;;;;;;;;43782:18;43803:5;:199;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43803:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43803:199:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;43803:199:0;-1:-1:-1;;;;;44104:30:0;;::::1;;::::0;;;:17:::1;43803:199;44104:30:::0;;;;;;;:43;;;;::::1;-1:-1:-1::0;;;;;;44104:43:0;;::::1;::::0;::::1;::::0;;;44216:8:::1;27:10:-1::0;;44104:43:0;23:18:-1;;::::1;45:23:::0;;;44216:25:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;44307:19;;;:7:::1;:19:::0;;;;;:26;;-1:-1:-1;;44307:26:0::1;::::0;;::::1;::::0;;44376:15:::1;:27:::0;;;;;;:41;;;;::::1;::::0;;::::1;::::0;;;44433:26;;;;;;;::::1;::::0;;::::1;::::0;;;;;;43803:199;;-1:-1:-1;44433:26:0::1;::::0;;;;;;;;;::::1;2431:1;;43082:1385:::0;;;;;;;;:::o;37372:29::-;;;-1:-1:-1;;;;;37372:29:0;;:::o;50191:171::-;50319:6;;:35;;;-1:-1:-1;;;50319:35:0;;-1:-1:-1;;;;;50319:35:0;;;;;;;;;50287:7;;50319:6;;;;;:26;;:35;;;;;;;;;;;;;;;:6;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;50319:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50319:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50319:35:0;;50191:171;-1:-1:-1;;50191:171:0:o;37342:23::-;;;-1:-1:-1;;;;;37342:23:0;;:::o;37442:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37442:25:0;;-1:-1:-1;37442:25:0;:::o;37731:39::-;;;;;;;;;;;;;;;:::o;44475:547::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44550:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;::::1;;:26;44542:35;;12:1:-1;9::::0;2:12:::1;44542:35:0;44590:19;44625:8;44590:44;;44645:14;44662:6;-1:-1:-1::0;;;;;44662:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;44662:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;44662:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;44662:21:0;-1:-1:-1;;;;;44729:25:0;;::::1;;::::0;;;:17:::1;44662:21;44729:25:::0;;;;;;;:36;;-1:-1:-1;;;;;;44729:36:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;44799:8:::1;27:10:-1::0;;-1:-1;23:18;;::::1;45:23:::0;;;44799::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;44871:17;;;:7:::1;:17:::0;;;;;:24;;-1:-1:-1;;44871:24:0::1;::::0;;::::1;::::0;;44939:15:::1;:25:::0;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;;44989:25;;;;;;;44662:21;;-1:-1:-1;44989:25:0::1;::::0;;;;;;;::::1;2431:1;;44475:547:::0;:::o;50599:132::-;50689:6;;:34;;;-1:-1:-1;;;50689:34:0;;-1:-1:-1;;;;;50689:34:0;;;;;;;;;50662:7;;50689:6;;;;;:25;;:34;;;;;;;;;;;;;;;50662:7;50689:6;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;50689:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;37262:32:0;;;-1:-1:-1;;;;;37262:32:0;;:::o;2791:148::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;2898:1:::1;2882:6:::0;;2861:40:::1;::::0;-1:-1:-1;;;;;2882:6:0;;::::1;::::0;2861:40:::1;::::0;2898:1;;2861:40:::1;2929:1;2912:19:::0;;-1:-1:-1;;;;;;2912:19:0::1;::::0;;2791:148::o;41932:204::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;42077:6:::1;::::0;:51:::1;::::0;;-1:-1:-1;;;42077:51:0;;-1:-1:-1;;;;;42077:51:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:6;;;::::1;::::0;:23:::1;::::0;:51;;;;;:6:::1;::::0;:51;;;;;;;:6;;:51;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42077:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42077:51:0;;;;41932:204:::0;;;:::o;63407:159::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;63487:14:::1;:32:::0;;-1:-1:-1;;;;;;63487:32:0::1;-1:-1:-1::0;;;;;63487:32:0;::::1;;::::0;;63543:15:::1;:3;63551:6;63543:7;:15::i;:::-;63530:10;:28:::0;-1:-1:-1;63407:159:0:o;47276:1269::-;47471:8;:15;47370:7;;;;47637:805;47661:9;47657:1;:13;47637:805;;;47747:18;47781:8;47790:1;47781:11;;;;;;;;;;;;;;;;;;;;47873:19;;;-1:-1:-1;;;47873:19:0;;;;-1:-1:-1;;;;;47781:11:0;;;;-1:-1:-1;47781:11:0;;47873:17;;:19;;;;;;;;;;47781:11;47873:19;;;2:2:-1;;;;27:1;24;17:12;2:2;47873:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47873:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47873:19:0;47976:6;;:32;;;-1:-1:-1;;;47976:32:0;;-1:-1:-1;;;;;47976:32:0;;;;;;;;;47873:19;;-1:-1:-1;47955:18:0;;47976:6;;;;;:25;;:32;;;;;47873:19;;47976:32;;;;;;;47955:18;47976:6;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;47976:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47976:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47976:32:0;48053:35;;;-1:-1:-1;;;48053:35:0;;-1:-1:-1;;;;;48053:35:0;;;;;;;;;47976:32;;-1:-1:-1;48025:25:0;;48053;;;;;;:35;;;;;47976:32;;48053:35;;;;;;;;:25;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;48053:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48053:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48053:35:0;;-1:-1:-1;48251:26:0;48280:33;48053:35;48302:10;48280:33;:21;:33;:::i;:::-;48251:62;-1:-1:-1;48391:39:0;:15;48251:62;48391:39;:19;:39;:::i;:::-;48373:57;;47637:805;;;;;47672:3;;;;;47637:805;;;-1:-1:-1;48512:25:0;:15;48532:4;48512:25;:19;:25;:::i;:::-;48505:32;47276:1269;-1:-1:-1;;;;47276:1269:0:o;56696:248::-;56754:7;56774:32;56809:66;56856:8;56809:32;:66::i;41516:408::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41591:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;::::1;;:26;41583:35;;12:1:-1;9::::0;2:12:::1;41583:35:0;41629:19;41664:8;41629:44;;41684:11;41698:6;-1:-1:-1::0;;;;;41698:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41698:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41698:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41698:20:0;-1:-1:-1;;;;;41731:22:0;;::::1;;::::0;;;:17:::1;41698:20;41731:22:::0;;;;;;;:33;;-1:-1:-1;;;;;;41731:33:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;41775:8:::1;27:10:-1::0;;-1:-1;23:18;;::::1;45:23:::0;;;41775::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;41809:17;;;:7:::1;:17:::0;;;;;:24;;-1:-1:-1;;41809:24:0::1;::::0;;::::1;::::0;;41844:15:::1;:25:::0;;;;;;:31;;;;::::1;::::0;;::::1;::::0;;;41891:25;;;;;;;41698:20;;-1:-1:-1;41891:25:0::1;::::0;;;;;;;::::1;2431:1;;41516:408:::0;:::o;51460:167::-;51582:6;;:37;;;-1:-1:-1;;;51582:37:0;;-1:-1:-1;;;;;51582:37:0;;;;;;;;;;;;;;;51550:7;;51582:6;;;;;:22;;:37;;;;;;;;;;;;;;;51550:7;51582:6;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;51582:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;58948:2735:0;59078:10;-1:-1:-1;;;;;59078:23:0;;;;59070:63;;;;;-1:-1:-1;;;59070:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59239:8;:15;59352:8;:15;59217:19;59544:27;59239:15;59574:26;;;2:2:-1;;;;27:1;24;17:12;2:2;59574:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;59574:26:0;-1:-1:-1;59544:56:0;-1:-1:-1;59690:9:0;59685:670;59709:11;59705:1;:15;59685:670;;;59817:20;59853:8;59862:1;59853:11;;;;;;;;;;;;;;;;;;;;60000:39;;;-1:-1:-1;;;60000:39:0;;-1:-1:-1;;;;;60000:39:0;;;;;;;;;59853:11;;;;;-1:-1:-1;59853:11:0;;60000:28;;:39;;;;;59853:11;;60000:39;;;;;;;;;59853:11;60000:39;;;2:2:-1;;;;27:1;24;17:12;2:2;60000:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60000:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60000:39:0;59984:13;;:10;;59995:1;;59984:13;;;;;;;;;;;;;;;;:55;;;;-1:-1:-1;;;;;60120:33:0;;;60054:28;60120:33;;;:15;:33;;;;;;;60172:13;;60085:115;;60120:33;;;;;60172:10;;60183:1;;60172:13;;;;;;;;;;;;60085:16;:115::i;:::-;60054:146;-1:-1:-1;60303:40:0;:14;60054:146;60303:40;:18;:40;:::i;:::-;60286:57;;59685:670;;59722:3;;;;;59685:670;;;;60423:19;60445:25;60460:9;60445:14;:25::i;:::-;60423:47;;60564:14;60549:11;:29;60545:1131;;60738:9;60733:436;60757:11;60753:1;:15;60733:436;;;60867:20;60903:8;60912:1;60903:11;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60903:11:0;60867:48;;61005:7;-1:-1:-1;;;;;61005:28:0;;61056:9;61088:10;61121;61132:1;61121:13;;;;;;;;;;;;;;61005:148;;;;;;;;;;;;;-1:-1:-1;;;;;61005:148:0;-1:-1:-1;;;;;61005:148:0;;;;;;-1:-1:-1;;;;;61005:148:0;-1:-1:-1;;;;;61005:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61005:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61005:148:0;;;;60733:436;60770:3;;;;;60733:436;;;-1:-1:-1;61284:9:0;61279:332;61303:11;61299:1;:15;61279:332;;;61413:20;61449:8;61458:1;61449:11;;;;;;;;;;;;;;;;;61547:48;;;-1:-1:-1;;;61547:48:0;;-1:-1:-1;;;;;61547:48:0;;;;;;;61584:10;61547:48;;;;;;61449:11;;;;;-1:-1:-1;61449:11:0;;61547:25;;:48;;;;;;;;;;;61449:11;;61547:48;;;2:2:-1;;;;27:1;24;17:12;2:2;61547:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61547:48:0;;;;61279:332;61316:3;;;;;61279:332;;;-1:-1:-1;61630:34:0;;;-1:-1:-1;;;;;61630:34:0;;;;61653:10;61630:34;;;;;;;;;;;;;;;;;60545:1131;58948:2735;;;;;;:::o;2149:79::-;2187:7;2214:6;-1:-1:-1;;;;;2214:6:0;2149:79;:::o;54252:1006::-;54359:8;:15;54317:7;;;;54535:641;54559:11;54555:1;:15;54535:641;;;54638:17;54671:8;54680:1;54671:11;;;;;;;;;;;;;;;;;;;;54810:35;;;-1:-1:-1;;;54810:35:0;;-1:-1:-1;;;;;54810:35:0;;;;;;;;;54671:11;;;;;-1:-1:-1;54671:11:0;;54810:25;;:35;;;;;;;;;;;54671:11;;54810:35;;;2:2:-1;;;;27:1;24;17:12;2:2;54810:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54810:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54810:35:0;;-1:-1:-1;54864:26:0;54860:75;;54911:8;;;;54860:75;54949:26;54978:108;55012:4;-1:-1:-1;;;;;55012:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55012:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55012:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55012:19:0;55050:21;54978:15;:108::i;:::-;54949:137;-1:-1:-1;55122:42:0;:18;54949:137;55122:42;:22;:42;:::i;:::-;55101:63;;54535:641;;;;54572:3;;54535:641;;;-1:-1:-1;55232:18:0;54252:1006;-1:-1:-1;;;54252:1006:0:o;45349:629::-;45448:7;45473:21;45497:30;45519:7;45497:21;:30::i;:::-;45473:54;;45538:23;45564:41;45597:7;45564:32;:41::i;:::-;45538:67;;45616:26;45645:37;45668:13;45645:22;:37::i;:::-;45616:66;;45715:18;45697:15;:36;45693:77;;;45757:1;45750:8;;;;;;;45693:77;45780:26;45809:39;:15;45829:18;45809:39;:19;:39;:::i;:::-;45877:6;;:34;;;-1:-1:-1;;;45877:34:0;;-1:-1:-1;;;;;45877:34:0;;;;;;;;;45780:68;;-1:-1:-1;45859:15:0;;45877:6;;;;;:25;;:34;;;;;;;;;;;;;;45859:15;45877:6;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;45877:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45877:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45877:34:0;;-1:-1:-1;45929:41:0;45877:34;45929:28;:18;45952:4;45929:28;:22;:28;:::i;:::-;:32;:41;:32;:41;:::i;:::-;45922:48;45349:629;-1:-1:-1;;;;;;;;45349:629:0:o;37508:52::-;;;;;;;;;;;;-1:-1:-1;;;;;37508:52:0;;:::o;37474:25::-;;;;;;;;;;48869:1106;49023:8;:15;48978:7;;;;49130:742;49154:9;49150:1;:13;49130:742;;;49240:18;49274:8;49283:1;49274:11;;;;;;;;;;;;;;;;;;;;49366:19;;;-1:-1:-1;;;49366:19:0;;;;-1:-1:-1;;;;;49274:11:0;;;;-1:-1:-1;49274:11:0;;49366:17;;:19;;;;;;;;;;49274:11;49366:19;;;2:2:-1;;;;27:1;24;17:12;2:2;49366:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49366:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49366:19:0;49469:6;;:33;;;-1:-1:-1;;;49469:33:0;;-1:-1:-1;;;;;49469:33:0;;;;;;;;;49366:19;;-1:-1:-1;49448:18:0;;49469:6;;;;;:26;;:33;;;;;49366:19;;49469:33;;;;;;;:6;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;49469:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49469:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49469:33:0;49547:35;;;-1:-1:-1;;;49547:35:0;;-1:-1:-1;;;;;49547:35:0;;;;;;;;;49469:33;;-1:-1:-1;49519:25:0;;49547;;;;;;:35;;;;;49469:33;;49547:35;;;;;;;;:25;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;49547:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49547:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49547:35:0;;-1:-1:-1;49681:26:0;49710:33;49547:35;49732:10;49710:33;:21;:33;:::i;:::-;49681:62;-1:-1:-1;49821:39:0;:15;49681:62;49821:39;:19;:39;:::i;:::-;49803:57;;49130:742;;;;;49165:3;;;;;49130:742;;63703:712;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;63769:10:::1;;63762:3;:17;;63754:69;;;;-1:-1:-1::0;;;63754:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63842:14;::::0;-1:-1:-1;;;;;63842:14:0::1;63834:64;;;::::0;;-1:-1:-1;;;63834:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;63911:6;::::0;63936:14:::1;::::0;63911:40:::1;::::0;;-1:-1:-1;;;63911:40:0;;-1:-1:-1;;;;;63936:14:0;;::::1;63911:40;::::0;::::1;::::0;;;:6;;;::::1;::::0;:24:::1;::::0;:40;;;;;:6:::1;::::0;:40;;;;;;;:6;;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;63911:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;63984:8:0::1;:15:::0;64032:8:::1;:15:::0;63984;;-1:-1:-1;64032:15:0;-1:-1:-1;63964:17:0::1;64060:167;64084:9;64080:1;:13;64060:167;;;64115:18;64149:8;64158:1;64149:11;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;64200:14:::1;::::0;64176:39:::1;::::0;;-1:-1:-1;;;64176:39:0;;-1:-1:-1;;;;;64200:14:0;;::::1;64176:39;::::0;::::1;::::0;;;64149:11;;;::::1;::::0;-1:-1:-1;64149:11:0;;64176:23:::1;::::0;:39;;;;;;;;;;;64149:11;;64176:39;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;64176:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;64176:39:0;;;;64060:167;64095:3;;;;;64060:167;;;-1:-1:-1::0;64244:9:0::1;64239:169;64263:11;64259:1;:15;64239:169;;;64296:18;64330:8;64339:1;64330:11;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;64381:14:::1;::::0;64357:39:::1;::::0;;-1:-1:-1;;;64357:39:0;;-1:-1:-1;;;;;64381:14:0;;::::1;64357:39;::::0;::::1;::::0;;;64330:11;;;::::1;::::0;-1:-1:-1;64330:11:0;;64357:23:::1;::::0;:39;;;;;;;;;;;64330:11;;64357:39;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;64357:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;64357:39:0;;;;64239:169;64276:3;;;;;64239:169;;52960:1043:::0;53105:8;:15;53058:7;;;;53281:640;53305:11;53301:1;:15;53281:640;;;53384:17;53417:8;53426:1;53417:11;;;;;;;;;;;;;;;;;;;;53556:33;;;-1:-1:-1;;;53556:33:0;;-1:-1:-1;;;;;53556:33:0;;;;;;;;;53417:11;;;;;-1:-1:-1;53417:11:0;;53556:23;;:33;;;;;;;;;;;53417:11;53556:33;;;2:2:-1;;;;27:1;24;17:12;2:2;53556:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53556:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53556:33:0;;-1:-1:-1;53608:26:0;53604:75;;53655:8;;;;53604:75;53693:26;53722:109;53757:4;-1:-1:-1;;;;;53757:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53757:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53757:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53757:19:0;53795:21;53722:16;:109::i;:::-;53693:138;-1:-1:-1;53867:42:0;:18;53693:138;53867:42;:22;:42;:::i;:::-;53846:63;;53281:640;;;;53318:3;;53281:640;;62346:820;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;62579:10:::1;62652:16;62687:18;62724:22;62765:8;62800:4;62614:206;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62614:206:0;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;62614:206:0::1;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;;;;;62858:25:0;;::::1;62842:13;62858:25:::0;;;:17:::1;:25;::::0;;;;;;62942:26;;-1:-1:-1;;;62942:26:0;;;;::::1;;::::0;::::1;::::0;;;62579:252;;-1:-1:-1;62858:25:0;;::::1;::::0;;;;;62942:22:::1;::::0;:26;;;;;;;;;;62842:13;62858:25;62942:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;62942:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;62984:174:0::1;::::0;;-1:-1:-1;;;;;62984:174:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;-1:-1:-1;62984:174:0;;;;;;;-1:-1:-1;62984:174:0::1;2431:1;;;62346:820:::0;;;;;:::o;56318:170::-;56421:7;56453:27;56478:1;56453:20;:13;56471:1;56453:20;:17;:20;:::i;39631:100::-;39708:8;:15;39631:100;:::o;40664:844::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;40905:6:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;40905:50:0;;-1:-1:-1;;;;;40905:50:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:6;;;::::1;::::0;:23:::1;::::0;:50;;;;;:6:::1;::::0;:50;;;;;;;:6;;:50;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;40905:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;41023:5:0::1;::::0;:48:::1;::::0;-1:-1:-1;;;41023:48:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;41023:48:0;;::::1;::::0;;;;;;;;;;;;;;;;;;;41002:18:::1;::::0;-1:-1:-1;41023:5:0;;;::::1;::::0;-1:-1:-1;41023:23:0::1;::::0;41047:9;;41058:3;;41063:7;;41023:48;;;;;;::::1;::::0;::::1;::::0;;;;41002:18;8:100:-1::1;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;41023:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41023:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41023:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41023:48:0;-1:-1:-1;;;;;41165:22:0;;::::1;;::::0;;;:17:::1;41023:48;41165:22:::0;;;;;;;:35;;-1:-1:-1;;;;;;41165:35:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;41269:8:::1;27:10:-1::0;;-1:-1;23:18;;::::1;45:23:::0;;;41269:25:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;41360:19;;;:7:::1;:19:::0;;;;;:26;;-1:-1:-1;;41360:26:0::1;::::0;;::::1;::::0;;41429:15:::1;:27:::0;;;;;;:33;;;;::::1;::::0;;::::1;::::0;;;41478:22;;;;;;;41023:48;;-1:-1:-1;41478:22:0::1;::::0;;;;;;;::::1;2431:1;40664:844:::0;;;;;:::o;37674:50::-;;;;;;;;;;;;-1:-1:-1;;;;;37674:50:0;;:::o;55756:381::-;55855:7;;55976:23;:16;55997:1;55976:23;:20;:23;:::i;:::-;55951:48;-1:-1:-1;56095:34:0;55951:48;;56095:34;:18;:34;:::i;37301:32::-;;;-1:-1:-1;;;;;37301:32:0;;:::o;37182:37::-;;;-1:-1:-1;;;;;37182:37:0;;:::o;3094:244::-;2371:12;:10;:12::i;:::-;2361:6;;-1:-1:-1;;;;;2361:6:0;;;:22;;;2353:67;;;;;-1:-1:-1;;;2353:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2353:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3183:22:0;::::1;3175:73;;;;-1:-1:-1::0;;;3175:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3285:6;::::0;;3264:38:::1;::::0;-1:-1:-1;;;;;3264:38:0;;::::1;::::0;3285:6;::::1;::::0;3264:38:::1;::::0;::::1;3313:6;:17:::0;;-1:-1:-1;;;;;;3313:17:0::1;-1:-1:-1::0;;;;;3313:17:0;;;::::1;::::0;;;::::1;::::0;;3094:244::o;46333:647::-;46447:7;46472:21;46496:31;46519:7;46496:22;:31::i;:::-;46472:55;;46538:23;46564:42;46598:7;46564:33;:42::i;:::-;46538:68;;46617:26;46646:37;46669:13;46646:22;:37::i;:::-;46617:66;;46716:18;46698:15;:36;46694:77;;;46758:1;46751:8;;;;;;;46694:77;46781:26;46810:39;:15;46830:18;46810:39;:19;:39;:::i;:::-;46878:6;;:35;;;-1:-1:-1;;;46878:35:0;;-1:-1:-1;;;;;46878:35:0;;;;;;;;;46781:68;;-1:-1:-1;46860:15:0;;46878:6;;;;;:26;;:35;;;;;;;;;;;;;;:6;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;46878:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;51808:898:0;51949:8;:15;51902:7;;;;52059:610;52083:11;52079:1;:15;52059:610;;;52162:17;52195:8;52204:1;52195:11;;;;;;;;;;;;;;;;;;;;52332:33;;;-1:-1:-1;;;52332:33:0;;-1:-1:-1;;;;;52332:33:0;;;;;;;;;52195:11;;;;;-1:-1:-1;52195:11:0;;52332:23;;:33;;;;;;;;;;;52195:11;52332:33;;;2:2:-1;;;;27:1;24;17:12;2:2;52332:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52332:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52332:33:0;;-1:-1:-1;52384:24:0;52380:73;;52429:8;;;;52380:73;52467:22;52492:107;52527:4;-1:-1:-1;;;;;52527:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;52492:107:0;52467:132;-1:-1:-1;52627:30:0;:10;52467:132;52627:30;:14;:30;:::i;:::-;52614:43;;52059:610;;;;52096:3;;52059:610;;670:106;758:10;670:106;:::o;4765:136::-;4823:7;4850:43;4854:1;4857;4850:43;;;;;;;;;;;;;;;;;:3;:43::i;4301:181::-;4359:7;4391:5;;;4415:6;;;;4407:46;;;;;-1:-1:-1;;;4407:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5655:471;5713:7;5958:6;5954:47;;-1:-1:-1;5988:1:0;5981:8;;5954:47;6025:5;;;6029:1;6025;:5;:1;6049:5;;;;;:10;6041:56;;;;-1:-1:-1;;;6041:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6602:132;6660:7;6687:39;6691:1;6694;6687:39;;;;;;;;;;;;;;;;;:3;:39::i;5204:192::-;5290:7;5326:12;5318:6;;;;5310:29;;;;-1:-1:-1;;;5310:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5310:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5362:5:0;;;5204:192::o;7230:278::-;7316:7;7351:12;7344:5;7336:28;;;;-1:-1:-1;;;7336:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7336:28:0;;7375:9;7391:1;7387;:5;;;;;;;7230:278;-1:-1:-1;;;;;7230:278:0:o;37095:27811::-;;;;;;;;:::o

Swarm Source

ipfs://bf17c465e8406b5b143ebd8c68b294e6d7852c76cd640f4f3eb1c58f1325bc10

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.