ETH Price: $2,046.86 (+0.51%)

Contract

0xD69a8934a8a6231B7233A1fbCA6e90D70D7Bce91
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Boost For129190362021-07-29 6:04:301686 days ago1627538670IN
DeFi Saver: MCD Monitor V2
0 ETH0.0250715130
Boost For129182572021-07-29 3:00:341686 days ago1627527634IN
DeFi Saver: MCD Monitor V2
0 ETH0.0181857726
Boost For129178632021-07-29 1:36:211687 days ago1627522581IN
DeFi Saver: MCD Monitor V2
0 ETH0.0331949730
Repay For129161512021-07-28 19:04:421687 days ago1627499082IN
DeFi Saver: MCD Monitor V2
0 ETH0.0516058370.42857092
Repay For129161512021-07-28 19:04:421687 days ago1627499082IN
DeFi Saver: MCD Monitor V2
0 ETH0.05631770.42857092
Repay For129161492021-07-28 19:04:291687 days ago1627499069IN
DeFi Saver: MCD Monitor V2
0 ETH0.0505959570.42857092
Boost For129156882021-07-28 17:24:221687 days ago1627493062IN
DeFi Saver: MCD Monitor V2
0 ETH0.0975289553
Boost For129156732021-07-28 17:20:461687 days ago1627492846IN
DeFi Saver: MCD Monitor V2
0 ETH0.0714345938.9
Repay For129153792021-07-28 16:08:201687 days ago1627488500IN
DeFi Saver: MCD Monitor V2
0 ETH0.039684654
Repay For129150182021-07-28 14:44:331687 days ago1627483473IN
DeFi Saver: MCD Monitor V2
0 ETH0.0268789841.975
Repay For129146972021-07-28 13:28:481687 days ago1627478928IN
DeFi Saver: MCD Monitor V2
0 ETH0.024128434
Repay For129146962021-07-28 13:28:301687 days ago1627478910IN
DeFi Saver: MCD Monitor V2
0 ETH0.0218305534
Boost For129146782021-07-28 13:24:241687 days ago1627478664IN
DeFi Saver: MCD Monitor V2
0 ETH0.0279992840
Boost For129146372021-07-28 13:13:081687 days ago1627477988IN
DeFi Saver: MCD Monitor V2
0 ETH0.0270146334
Boost For129146022021-07-28 13:04:451687 days ago1627477485IN
DeFi Saver: MCD Monitor V2
0 ETH0.0400451146
Boost For129146022021-07-28 13:04:451687 days ago1627477485IN
DeFi Saver: MCD Monitor V2
0 ETH0.039175846
Boost For129142212021-07-28 11:40:161687 days ago1627472416IN
DeFi Saver: MCD Monitor V2
0 ETH0.0340579939.75
Boost For129125152021-07-28 5:06:121687 days ago1627448772IN
DeFi Saver: MCD Monitor V2
0 ETH0.0195995221.84
Boost For129123752021-07-28 4:36:251687 days ago1627446985IN
DeFi Saver: MCD Monitor V2
0 ETH0.049278427
Boost For129123562021-07-28 4:32:251687 days ago1627446745IN
DeFi Saver: MCD Monitor V2
0 ETH0.0680202629.1000016
Repay For129122712021-07-28 4:12:201687 days ago1627445540IN
DeFi Saver: MCD Monitor V2
0 ETH0.020690232.51
Boost For129122322021-07-28 4:04:311687 days ago1627445071IN
DeFi Saver: MCD Monitor V2
0 ETH0.0205688633.5
Boost For129122322021-07-28 4:04:311687 days ago1627445071IN
DeFi Saver: MCD Monitor V2
0 ETH0.0262707633.5
Boost For129122312021-07-28 4:04:291687 days ago1627445069IN
DeFi Saver: MCD Monitor V2
0 ETH0.023571233.5
Boost For129119462021-07-28 3:04:391687 days ago1627441479IN
DeFi Saver: MCD Monitor V2
0 ETH0.022389432
View all transactions

Latest 16 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-128734322021-07-22 2:05:531693 days ago1626919553
DeFi Saver: MCD Monitor V2
0.004144 ETH
-123772462021-05-05 23:29:561771 days ago1620257396
DeFi Saver: MCD Monitor V2
0.006384 ETH
-123711422021-05-05 1:05:211772 days ago1620176721
DeFi Saver: MCD Monitor V2
0.005936 ETH
-123638032021-05-03 21:57:121773 days ago1620079032
DeFi Saver: MCD Monitor V2
0.01904 ETH
-123584192021-05-03 2:02:011773 days ago1620007321
DeFi Saver: MCD Monitor V2
0.003472 ETH
-123584172021-05-03 2:01:251773 days ago1620007285
DeFi Saver: MCD Monitor V2
0.003472 ETH
-123505672021-05-01 20:46:011775 days ago1619901961
DeFi Saver: MCD Monitor V2
0.00504 ETH
-123505292021-05-01 20:39:251775 days ago1619901565
DeFi Saver: MCD Monitor V2
0.005264 ETH
-122663552021-04-18 20:50:001788 days ago1618779000
DeFi Saver: MCD Monitor V2
0.01456 ETH
-121494982021-03-31 21:06:131806 days ago1617224773
DeFi Saver: MCD Monitor V2
0.082656 ETH
-121494952021-03-31 21:05:251806 days ago1617224725
DeFi Saver: MCD Monitor V2
0.076608 ETH
-120639622021-03-18 17:18:121819 days ago1616087892
DeFi Saver: MCD Monitor V2
0.027664 ETH
-120639362021-03-18 17:13:431819 days ago1616087623
DeFi Saver: MCD Monitor V2
0.028112 ETH
-120639112021-03-18 17:09:211819 days ago1616087361
DeFi Saver: MCD Monitor V2
0.028896 ETH
-120603802021-03-18 4:05:581819 days ago1616040358
DeFi Saver: MCD Monitor V2
0.017696 ETH
-120603802021-03-18 4:05:581819 days ago1616040358
DeFi Saver: MCD Monitor V2
0.018032 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MCDMonitorV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2021-02-25
*/

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

   abstract contract Manager {
    function last(address) virtual public returns (uint);
    function cdpCan(address, uint, address) virtual public view returns (uint);
    function ilks(uint) virtual public view returns (bytes32);
    function owns(uint) virtual public view returns (address);
    function urns(uint) virtual public view returns (address);
    function vat() virtual public view returns (address);
    function open(bytes32, address) virtual public returns (uint);
    function give(uint, address) virtual public;
    function cdpAllow(uint, address, uint) virtual public;
    function urnAllow(address, uint) virtual public;
    function frob(uint, int, int) virtual public;
    function flux(uint, address, uint) virtual public;
    function move(uint, address, uint) virtual public;
    function exit(address, uint, address, uint) virtual public;
    function quit(uint, address) virtual public;
    function enter(address, uint) virtual public;
    function shift(uint, uint) virtual public;
}   abstract contract Vat {

    struct Urn {
        uint256 ink;   // Locked Collateral  [wad]
        uint256 art;   // Normalised Debt    [wad]
    }

    struct Ilk {
        uint256 Art;   // Total Normalised Debt     [wad]
        uint256 rate;  // Accumulated Rates         [ray]
        uint256 spot;  // Price with Safety Margin  [ray]
        uint256 line;  // Debt Ceiling              [rad]
        uint256 dust;  // Urn Debt Floor            [rad]
    }

    mapping (bytes32 => mapping (address => Urn )) public urns;
    mapping (bytes32 => Ilk)                       public ilks;
    mapping (bytes32 => mapping (address => uint)) public gem;  // [wad]

    function can(address, address) virtual public view returns (uint);
    function dai(address) virtual public view returns (uint);
    function frob(bytes32, address, address, address, int, int) virtual public;
    function hope(address) virtual public;
    function move(address, address, uint) virtual public;
    function fork(bytes32, address, address, int, int) virtual public;
}   abstract contract PipInterface {
    function read() public virtual returns (bytes32);
}   abstract contract Spotter {
    struct Ilk {
        PipInterface pip;
        uint256 mat;
    }

    mapping (bytes32 => Ilk) public ilks;

    uint256 public par;

}   contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}   interface ERC20 {
    function totalSupply() external view returns (uint256 supply);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(address _from, address _to, uint256 _value)
        external
        returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function decimals() external view returns (uint256 digits);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}   library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}   library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}   library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     */
    function safeApprove(ERC20 token, address spender, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(ERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}   contract AdminAuth {

    using SafeERC20 for ERC20;

    address public owner;
    address public admin;

    modifier onlyOwner() {
        require(owner == msg.sender);
        _;
    }

    modifier onlyAdmin() {
        require(admin == msg.sender);
        _;
    }

    constructor() public {
        owner = msg.sender;
        admin = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9;
    }

    /// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner
    /// @param _admin Address of multisig that becomes admin
    function setAdminByOwner(address _admin) public {
        require(msg.sender == owner);
        require(admin == address(0));

        admin = _admin;
    }

    /// @notice Admin is able to set new admin
    /// @param _admin Address of multisig that becomes new admin
    function setAdminByAdmin(address _admin) public {
        require(msg.sender == admin);

        admin = _admin;
    }

    /// @notice Admin is able to change owner
    /// @param _owner Address of new owner
    function setOwnerByAdmin(address _owner) public {
        require(msg.sender == admin);

        owner = _owner;
    }

    /// @notice Destroy the contract
    function kill() public onlyOwner {
        selfdestruct(payable(owner));
    }

    /// @notice  withdraw stuck funds
    function withdrawStuckFunds(address _token, uint _amount) public onlyOwner {
        if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
            payable(owner).transfer(_amount);
        } else {
            ERC20(_token).safeTransfer(owner, _amount);
        }
    }
}   contract DefisaverLogger {
    event LogEvent(
        address indexed contractAddress,
        address indexed caller,
        string indexed logName,
        bytes data
    );

    // solhint-disable-next-line func-name-mixedcase
    function Log(address _contract, address _caller, string memory _logName, bytes memory _data)
        public
    {
        emit LogEvent(_contract, _caller, _logName, _data);
    }
}   abstract contract GasTokenInterface is ERC20 {
    function free(uint256 value) public virtual returns (bool success);

    function freeUpTo(uint256 value) public virtual returns (uint256 freed);

    function freeFrom(address from, uint256 value) public virtual returns (bool success);

    function freeFromUpTo(address from, uint256 value) public virtual returns (uint256 freed);
}   contract GasBurner {
    // solhint-disable-next-line const-name-snakecase
    GasTokenInterface public constant gasToken = GasTokenInterface(0x0000000000b3F879cb30FE243b4Dfee438691c04);

    modifier burnGas(uint _amount) {
        if (gasToken.balanceOf(address(this)) >= _amount) {
            gasToken.free(_amount);
        }

        _;
    }
}   contract BotRegistry is AdminAuth {

    mapping (address => bool) public botList;

    constructor() public {
        botList[0x776B4a13093e30B05781F97F6A4565B6aa8BE330] = true;

        botList[0xAED662abcC4FA3314985E67Ea993CAD064a7F5cF] = true;
        botList[0xa5d330F6619d6bF892A5B87D80272e1607b3e34D] = true;
        botList[0x5feB4DeE5150B589a7f567EA7CADa2759794A90A] = true;
        botList[0x7ca06417c1d6f480d3bB195B80692F95A6B66158] = true;
    }

    function setBot(address _botAddr, bool _state) public onlyOwner {
        botList[_botAddr] = _state;
    }

}      

contract DFSExchangeData {

    // first is empty to keep the legacy order in place
    enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX }

    enum ActionType { SELL, BUY }

    struct OffchainData {
        address wrapper;
        address exchangeAddr;
        address allowanceTarget;
        uint256 price;
        uint256 protocolFee;
        bytes callData;
    }

    struct ExchangeData {
        address srcAddr;
        address destAddr;
        uint256 srcAmount;
        uint256 destAmount;
        uint256 minPrice;
        uint256 dfsFeeDivider; // service fee divider
        address user; // user to check special fee
        address wrapper;
        bytes wrapperData;
        OffchainData offchainData;
    }

    function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) {
        return abi.encode(_exData);
    }

    function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) {
        _exData = abi.decode(_data, (ExchangeData));
    }
}   /// @title Implements enum Method
abstract contract StaticV2 {

    enum Method { Boost, Repay }

    struct CdpHolder {
        uint128 minRatio;
        uint128 maxRatio;
        uint128 optimalRatioBoost;
        uint128 optimalRatioRepay;
        address owner;
        uint cdpId;
        bool boostEnabled;
        bool nextPriceEnabled;
    }

    struct SubPosition {
        uint arrPos;
        bool subscribed;
    }
}      



abstract contract ISubscriptionsV2 is StaticV2 {

    function getOwner(uint _cdpId) external view virtual returns(address);
    function getSubscribedInfo(uint _cdpId) public view virtual returns(bool, uint128, uint128, uint128, uint128, address, uint coll, uint debt);
    function getCdpHolder(uint _cdpId) public view virtual returns (bool subscribed, CdpHolder memory);
}   abstract contract DSProxyInterface {

    /// Truffle wont compile if this isn't commented
    // function execute(bytes memory _code, bytes memory _data)
    //     public virtual
    //     payable
    //     returns (address, bytes32);

    function execute(address _target, bytes memory _data) public virtual payable returns (bytes32);

    function setCache(address _cacheAddr) public virtual payable returns (bool);

    function owner() public virtual returns (address);
}   /// @title Implements logic for calling MCDSaverProxy always from same contract
contract MCDMonitorProxyV2 is AdminAuth {

    uint public CHANGE_PERIOD;
    uint public MIN_CHANGE_PERIOD = 6 * 1 hours;
    address public monitor;
    address public newMonitor;
    address public lastMonitor;
    uint public changeRequestedTimestamp;

    event MonitorChangeInitiated(address oldMonitor, address newMonitor);
    event MonitorChangeCanceled();
    event MonitorChangeFinished(address monitor);
    event MonitorChangeReverted(address monitor);

    modifier onlyMonitor() {
        require (msg.sender == monitor);
        _;
    }

    constructor(uint _changePeriod) public {
        CHANGE_PERIOD = _changePeriod * 1 hours;
    }

    /// @notice Only monitor contract is able to call execute on users proxy
    /// @param _owner Address of cdp owner (users DSProxy address)
    /// @param _saverProxy Address of MCDSaverProxy
    /// @param _data Data to send to MCDSaverProxy
    function callExecute(address _owner, address _saverProxy, bytes memory _data) public payable onlyMonitor {
        // execute reverts if calling specific method fails
        DSProxyInterface(_owner).execute{value: msg.value}(_saverProxy, _data);

        // return if anything left
        if (address(this).balance > 0) {
            msg.sender.transfer(address(this).balance);
        }
    }

    /// @notice Allowed users are able to set Monitor contract without any waiting period first time
    /// @param _monitor Address of Monitor contract
    function setMonitor(address _monitor) public onlyOwner {
        require(monitor == address(0));
        monitor = _monitor;
    }

    /// @notice Allowed users are able to start procedure for changing monitor
    /// @dev after CHANGE_PERIOD needs to call confirmNewMonitor to actually make a change
    /// @param _newMonitor address of new monitor
    function changeMonitor(address _newMonitor) public onlyOwner {
        require(changeRequestedTimestamp == 0);

        changeRequestedTimestamp = now;
        lastMonitor = monitor;
        newMonitor = _newMonitor;

        emit MonitorChangeInitiated(lastMonitor, newMonitor);
    }

    /// @notice At any point allowed users are able to cancel monitor change
    function cancelMonitorChange() public onlyOwner {
        require(changeRequestedTimestamp > 0);

        changeRequestedTimestamp = 0;
        newMonitor = address(0);

        emit MonitorChangeCanceled();
    }

    /// @notice Anyone is able to confirm new monitor after CHANGE_PERIOD if process is started
    function confirmNewMonitor() public onlyOwner {
        require((changeRequestedTimestamp + CHANGE_PERIOD) < now);
        require(changeRequestedTimestamp != 0);
        require(newMonitor != address(0));

        monitor = newMonitor;
        newMonitor = address(0);
        changeRequestedTimestamp = 0;

        emit MonitorChangeFinished(monitor);
    }

    /// @notice Its possible to revert monitor to last used monitor
    function revertMonitor() public onlyOwner {
        require(lastMonitor != address(0));

        monitor = lastMonitor;

        emit MonitorChangeReverted(monitor);
    }

    function setChangePeriod(uint _periodInHours) public onlyOwner {
        require(_periodInHours * 1 hours > MIN_CHANGE_PERIOD);

        CHANGE_PERIOD = _periodInHours * 1 hours;
    }

}      

















/// @title Implements logic that allows bots to call Boost and Repay
contract MCDMonitorV2 is DSMath, AdminAuth, GasBurner, StaticV2 {

    uint public REPAY_GAS_TOKEN = 25;
    uint public BOOST_GAS_TOKEN = 25;

    uint public MAX_GAS_PRICE = 800000000000; // 800 gwei

    uint public REPAY_GAS_COST = 1000000;
    uint public BOOST_GAS_COST = 1000000;

    bytes4 public REPAY_SELECTOR = 0xf360ce20;
    bytes4 public BOOST_SELECTOR = 0x8ec2ae25;

    MCDMonitorProxyV2 public monitorProxyContract;
    ISubscriptionsV2 public subscriptionsContract;
    address public mcdSaverTakerAddress;

    address public constant BOT_REGISTRY_ADDRESS = 0x637726f8b08a7ABE3aE3aCaB01A80E2d8ddeF77B;

    address public constant PROXY_PERMISSION_ADDR = 0x5a4f877CA808Cca3cB7c2A194F80Ab8588FAE26B;

    Manager public manager = Manager(0x5ef30b9986345249bc32d8928B7ee64DE9435E39);
    Vat public vat = Vat(0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B);
    Spotter public spotter = Spotter(0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3);

    DefisaverLogger public constant logger = DefisaverLogger(0x5c55B921f590a89C1Ebe84dF170E655a82b62126);

    modifier onlyApproved() {
        require(BotRegistry(BOT_REGISTRY_ADDRESS).botList(msg.sender), "Not auth bot");
        _;
    }

    constructor(address _monitorProxy, address _subscriptions, address _mcdSaverTakerAddress) public {
        monitorProxyContract = MCDMonitorProxyV2(_monitorProxy);
        subscriptionsContract = ISubscriptionsV2(_subscriptions);
        mcdSaverTakerAddress = _mcdSaverTakerAddress;
    }

    /// @notice Bots call this method to repay for user when conditions are met
    /// @dev If the contract ownes gas token it will try and use it for gas price reduction
    function repayFor(
        DFSExchangeData.ExchangeData memory _exchangeData,
        uint _cdpId,
        uint _nextPrice,
        address _joinAddr
    ) public payable onlyApproved burnGas(REPAY_GAS_TOKEN) {

        (bool isAllowed, uint ratioBefore) = canCall(Method.Repay, _cdpId, _nextPrice);
        require(isAllowed);

        uint gasCost = calcGasCost(REPAY_GAS_COST);

        address owner = subscriptionsContract.getOwner(_cdpId);

        monitorProxyContract.callExecute{value: msg.value}(
            owner,
            mcdSaverTakerAddress,
            abi.encodeWithSelector(REPAY_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0));


        (bool isGoodRatio, uint ratioAfter) = ratioGoodAfter(Method.Repay, _cdpId, _nextPrice);
        require(isGoodRatio);

        returnEth();

        logger.Log(address(this), owner, "AutomaticMCDRepay", abi.encode(ratioBefore, ratioAfter));
    }

    /// @notice Bots call this method to boost for user when conditions are met
    /// @dev If the contract ownes gas token it will try and use it for gas price reduction
    function boostFor(
        DFSExchangeData.ExchangeData memory _exchangeData,
        uint _cdpId,
        uint _nextPrice,
        address _joinAddr
    ) public payable onlyApproved burnGas(BOOST_GAS_TOKEN)  {

        (bool isAllowed, uint ratioBefore) = canCall(Method.Boost, _cdpId, _nextPrice);
        require(isAllowed);

        uint gasCost = calcGasCost(BOOST_GAS_COST);

        address owner = subscriptionsContract.getOwner(_cdpId);

        monitorProxyContract.callExecute{value: msg.value}(
            owner,
            mcdSaverTakerAddress,
            abi.encodeWithSelector(BOOST_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0));

        (bool isGoodRatio, uint ratioAfter) = ratioGoodAfter(Method.Boost, _cdpId, _nextPrice);
        require(isGoodRatio);

        returnEth();

        logger.Log(address(this), owner, "AutomaticMCDBoost", abi.encode(ratioBefore, ratioAfter));
    }

/******************* INTERNAL METHODS ********************************/
    function returnEth() internal {
        // return if some eth left
        if (address(this).balance > 0) {
            msg.sender.transfer(address(this).balance);
        }
    }

/******************* STATIC METHODS ********************************/

    /// @notice Returns an address that owns the CDP
    /// @param _cdpId Id of the CDP
    function getOwner(uint _cdpId) public view returns(address) {
        return manager.owns(_cdpId);
    }

    /// @notice Gets CDP info (collateral, debt)
    /// @param _cdpId Id of the CDP
    /// @param _ilk Ilk of the CDP
    function getCdpInfo(uint _cdpId, bytes32 _ilk) public view returns (uint, uint) {
        address urn = manager.urns(_cdpId);

        (uint collateral, uint debt) = vat.urns(_ilk, urn);
        (,uint rate,,,) = vat.ilks(_ilk);

        return (collateral, rmul(debt, rate));
    }

    /// @notice Gets a price of the asset
    /// @param _ilk Ilk of the CDP
    function getPrice(bytes32 _ilk) public view returns (uint) {
        (, uint mat) = spotter.ilks(_ilk);
        (,,uint spot,,) = vat.ilks(_ilk);

        return rmul(rmul(spot, spotter.par()), mat);
    }

    /// @notice Gets CDP ratio
    /// @param _cdpId Id of the CDP
    /// @param _nextPrice Next price for user
    function getRatio(uint _cdpId, uint _nextPrice) public view returns (uint) {
        bytes32 ilk = manager.ilks(_cdpId);
        uint price = (_nextPrice == 0) ? getPrice(ilk) : _nextPrice;

        (uint collateral, uint debt) = getCdpInfo(_cdpId, ilk);

        if (debt == 0) return 0;

        return rdiv(wmul(collateral, price), debt) / (10 ** 18);
    }

    /// @notice Checks if Boost/Repay could be triggered for the CDP
    /// @dev Called by MCDMonitor to enforce the min/max check
    function canCall(Method _method, uint _cdpId, uint _nextPrice) public view returns(bool, uint) {
        bool subscribed;
        CdpHolder memory holder;
        (subscribed, holder) = subscriptionsContract.getCdpHolder(_cdpId);

        // check if cdp is subscribed
        if (!subscribed) return (false, 0);

        // check if using next price is allowed
        if (_nextPrice > 0 && !holder.nextPriceEnabled) return (false, 0);

        // check if boost and boost allowed
        if (_method == Method.Boost && !holder.boostEnabled) return (false, 0);

        // check if owner is still owner
        if (getOwner(_cdpId) != holder.owner) return (false, 0);

        uint currRatio = getRatio(_cdpId, _nextPrice);

        if (_method == Method.Repay) {
            return (currRatio < holder.minRatio, currRatio);
        } else if (_method == Method.Boost) {
            return (currRatio > holder.maxRatio, currRatio);
        }
    }

    /// @dev After the Boost/Repay check if the ratio doesn't trigger another call
    function ratioGoodAfter(Method _method, uint _cdpId, uint _nextPrice) public view returns(bool, uint) {
        CdpHolder memory holder;

        (, holder) = subscriptionsContract.getCdpHolder(_cdpId);

        uint currRatio = getRatio(_cdpId, _nextPrice);

        if (_method == Method.Repay) {
            return (currRatio < holder.maxRatio, currRatio);
        } else if (_method == Method.Boost) {
            return (currRatio > holder.minRatio, currRatio);
        }
    }

    /// @notice Calculates gas cost (in Eth) of tx
    /// @dev Gas price is limited to MAX_GAS_PRICE to prevent attack of draining user CDP
    /// @param _gasAmount Amount of gas used for the tx
    function calcGasCost(uint _gasAmount) public view returns (uint) {
        uint gasPrice = tx.gasprice <= MAX_GAS_PRICE ? tx.gasprice : MAX_GAS_PRICE;

        return mul(gasPrice, _gasAmount);
    }

/******************* OWNER ONLY OPERATIONS ********************************/

    /// @notice Allows owner to change gas cost for boost operation, but only up to 3 millions
    /// @param _gasCost New gas cost for boost method
    function changeBoostGasCost(uint _gasCost) public onlyOwner {
        require(_gasCost < 3000000);

        BOOST_GAS_COST = _gasCost;
    }

    /// @notice Allows owner to change gas cost for repay operation, but only up to 3 millions
    /// @param _gasCost New gas cost for repay method
    function changeRepayGasCost(uint _gasCost) public onlyOwner {
        require(_gasCost < 3000000);

        REPAY_GAS_COST = _gasCost;
    }

    /// @notice Allows owner to change max gas price
    /// @param _maxGasPrice New max gas price
    function changeMaxGasPrice(uint _maxGasPrice) public onlyOwner {
        require(_maxGasPrice < 1000000000000);

        MAX_GAS_PRICE = _maxGasPrice;
    }

    /// @notice Allows owner to change the amount of gas token burned per function call
    /// @param _gasAmount Amount of gas token
    /// @param _isRepay Flag to know for which function we are setting the gas token amount
    function changeGasTokenAmount(uint _gasAmount, bool _isRepay) public onlyOwner {
        if (_isRepay) {
            REPAY_GAS_TOKEN = _gasAmount;
        } else {
            BOOST_GAS_TOKEN = _gasAmount;
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_monitorProxy","type":"address"},{"internalType":"address","name":"_subscriptions","type":"address"},{"internalType":"address","name":"_mcdSaverTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BOOST_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_GAS_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOT_REGISTRY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROXY_PERMISSION_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_GAS_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"boostFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"calcGasCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"canCall","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeBoostGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"},{"internalType":"bool","name":"_isRepay","type":"bool"}],"name":"changeGasTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"}],"name":"changeMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeRepayGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasToken","outputs":[{"internalType":"contract GasTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getCdpInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"logger","outputs":[{"internalType":"contract DefisaverLogger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcdSaverTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monitorProxyContract","outputs":[{"internalType":"contract MCDMonitorProxyV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"ratioGoodAfter","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"repayFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spotter","outputs":[{"internalType":"contract Spotter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionsContract","outputs":[{"internalType":"contract ISubscriptionsV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract Vat","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526019600281905560035564ba43b74000600455620f4240600581905560065560078054678ec2ae250000000063ffffffff60201b1963ffffffff1990921663f360ce201791909116179055600a80546001600160a01b0319908116735ef30b9986345249bc32d8928b7ee64de9435e3917909155600b805482167335d1b3f3d7966a1dfe207aa4514c12a259a0492b179055600c80549091167365c79fcb50ca1594b025960e539ed7a9a6d434a3179055348015620000c257600080fd5b506040516200276238038062002762833981016040819052620000e59162000168565b600080546001600160a01b031990811633179091556001805482167325efa336886c74ea8e282ac466bdcd0199f85bb9179055600780546001600160a01b039586166801000000000000000002600160401b600160e01b0319909116179055600880549385169382169390931790925560098054919093169116179055620001d4565b6000806000606084860312156200017d578283fd5b83516200018a81620001bb565b60208501519093506200019d81620001bb565b6040850151909250620001b081620001bb565b809150509250925092565b6001600160a01b0381168114620001d157600080fd5b50565b61257e80620001e46000396000f3fe60806040526004361061021a5760003560e01c80637016722c11610123578063c41a360a116100ab578063deca5f881161006f578063deca5f8814610598578063e3bbb4f1146105b8578063f05def81146105cd578063f24ccbfe146105ed578063f851a440146106025761021a565b8063c41a360a14610500578063c42498ea14610520578063c91d59fe1461054e578063cf66a6bc14610563578063cff70001146105785761021a565b8063a56f9718116100f2578063a56f971814610481578063a7304bf714610496578063a8c90323146104b6578063b2f9e47f146104d6578063b6d5a156146104eb5761021a565b80637016722c1461043157806379521f02146104445780638da5cb5b14610459578063a564056c1461046e5761021a565b80633a128322116101a65780634d3f199e116101755780634d3f199e146103b0578063526d6461146103d057806358346f4b146103e55780635ea2a60914610407578063696806c01461041c5761021a565b80633a1283221461034657806341c0e1b514610366578063481c6a751461037b57806349a7ac67146103905761021a565b80632e77468d116101ed5780632e77468d146102ba57806331d98b3f146102dc57806336569e77146102fc57806336fc603f146103115780633816377e146103265761021a565b806305a2cded1461021f57806318bf60e1146102565780631e48907b146102785780632a56f6021461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a366004611ee3565b610617565b60405161024d9291906122b6565b60405180910390f35b34801561026257600080fd5b5061026b6107bb565b60405161024d91906122c6565b34801561028457600080fd5b50610298610293366004611d37565b6107c1565b005b3480156102a657600080fd5b5061026b6102b5366004611e86565b6107fa565b3480156102c657600080fd5b506102cf610824565b60405161024d91906121aa565b3480156102e857600080fd5b5061026b6102f7366004611e86565b610833565b34801561030857600080fd5b506102cf6109e2565b34801561031d57600080fd5b5061026b6109f1565b34801561033257600080fd5b50610298610341366004611e86565b6109f7565b34801561035257600080fd5b50610298610361366004611d6f565b610a24565b34801561037257600080fd5b50610298610abd565b34801561038757600080fd5b506102cf610ae2565b34801561039c57600080fd5b5061023f6103ab366004611ee3565b610af1565b3480156103bc57600080fd5b506102986103cb366004611e86565b610bf1565b3480156103dc57600080fd5b506102cf610c1c565b3480156103f157600080fd5b506103fa610c34565b60405161024d91906122e6565b34801561041357600080fd5b506102cf610c3d565b34801561042857600080fd5b5061026b610c58565b61029861043f366004611f1a565b610c5e565b34801561045057600080fd5b506102cf611076565b34801561046557600080fd5b506102cf611085565b61029861047c366004611f1a565b611094565b34801561048d57600080fd5b5061026b611464565b3480156104a257600080fd5b506102986104b1366004611d37565b61146a565b3480156104c257600080fd5b506102986104d1366004611e86565b6114a3565b3480156104e257600080fd5b506103fa6114ce565b3480156104f757600080fd5b506102cf6114df565b34801561050c57600080fd5b506102cf61051b366004611e86565b6114f7565b34801561052c57600080fd5b5061054061053b366004612076565b61157e565b60405161024d9291906124ab565b34801561055a57600080fd5b506102cf611733565b34801561056f57600080fd5b506102cf611746565b34801561058457600080fd5b5061026b610593366004612076565b611755565b3480156105a457600080fd5b506102986105b3366004611d37565b61184b565b3480156105c457600080fd5b5061026b611878565b3480156105d957600080fd5b506102986105e8366004612047565b61187e565b3480156105f957600080fd5b506102cf6118ab565b34801561060e57600080fd5b506102cf6118c3565b6000806000610624611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f906106549089906004016122c6565b6101206040518083038186803b15801561066d57600080fd5b505afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190611db6565b9092509050816106bd576000809350935050506107b3565b6000851180156106cf57508060e00151155b156106e2576000809350935050506107b3565b60008760018111156106f057fe5b1480156106ff57508060c00151155b15610712576000809350935050506107b3565b80608001516001600160a01b0316610729876114f7565b6001600160a01b031614610745576000809350935050506107b3565b60006107518787611755565b9050600188600181111561076157fe5b141561077f5790516001600160801b03168110935091506107b39050565b600088600181111561078d57fe5b14156107af576020909101516001600160801b03168111935091506107b39050565b5050505b935093915050565b60065481565b6001546001600160a01b031633146107d857600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806004543a111561080f57600454610811565b3a5b905061081d81846118d2565b9392505050565b600c546001600160a01b031681565b600c54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d36906108689086906004016122c6565b604080518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190611eb6565b600b54604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906108ec9087906004016122c6565b60a06040518083038186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c91906120ba565b5050925050506109da6109d482600c60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf9190611e9e565b6118f6565b836118f6565b949350505050565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610a0e57600080fd5b64e8d4a510008110610a1f57600080fd5b600455565b6000546001600160a01b03163314610a3b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610a9f57600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610a99573d6000803e3d6000fd5b50610ab9565b600054610ab9906001600160a01b03848116911683611937565b5050565b6000546001600160a01b03163314610ad457600080fd5b6000546001600160a01b0316ff5b600a546001600160a01b031681565b600080610afc611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610b2c9088906004016122c6565b6101206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611db6565b915060009050610b8d8686611755565b90506001876001811115610b9d57fe5b1415610bbd576020909101516001600160801b03168110925090506107b3565b6000876001811115610bcb57fe5b1415610be75790516001600160801b03168111925090506107b3565b5050935093915050565b6000546001600160a01b03163314610c0857600080fd5b622dc6c08110610c1757600080fd5b600555565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60075460e01b81565b6007546801000000000000000090046001600160a01b031681565b60035481565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610c959033906004016121aa565b60206040518083038186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611d9a565b610d0a5760405162461bcd60e51b8152600401610d0190612345565b60405180910390fd5b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a0823190610d419030906004016121aa565b60206040518083038186803b158015610d5957600080fd5b505afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190611e9e565b10610e1c5760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610dc89084906004016122c6565b602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611d9a565b505b600080610e2b60018787610617565b9150915081610e3957600080fd5b6000610e466005546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610e7c908b906004016122c6565b60206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760009054906101000a900460e01b8e8e898e6000604051602401610f349594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b9092168252610f7b9392916004016121be565b6000604051808303818588803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050600080610fbc60018b8b610af1565b9150915081610fca57600080fd5b610fd2611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce503085888560405160200161100a9291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611037939291906121f3565b600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b505050505050505050505050505050565b6008546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da906110cb9033906004016121aa565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611d9a565b6111375760405162461bcd60e51b8152600401610d0190612345565b6003546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061116e9030906004016121aa565b60206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190611e9e565b106112495760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906111f59084906004016122c6565b602060405180830381600087803b15801561120f57600080fd5b505af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112479190611d9a565b505b60008061125860008787610617565b915091508161126657600080fd5b60006112736006546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112a9908b906004016122c6565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760049054906101000a900460e01b8e8e898e60006040516024016113619594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113a89392916004016121be565b6000604051808303818588803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50505050506000806113e960008b8b610af1565b91509150816113f757600080fd5b6113ff611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308588856040516020016114379291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161103793929190612248565b60025481565b6001546001600160a01b0316331461148157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114ba57600080fd5b622dc6c081106114c957600080fd5b600655565b600754640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b600a5460405163040b0d8960e51b81526000916001600160a01b031690638161b120906115289085906004016122c6565b60206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190611d53565b92915050565b600a54604051632726b07360e01b8152600091829182916001600160a01b031690632726b073906115b39088906004016122c6565b60206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116039190611d53565b600b546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c9061163b90899087906004016122cf565b604080518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a9190612097565b600b54604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d36906116c3908a906004016122c6565b60a06040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171391906120ba565b5050509150508261172483836118f6565b95509550505050509250929050565b6eb3f879cb30fe243b4dfee438691c0481565b6009546001600160a01b031681565b600a54604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd9061178a9087906004016122c6565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da9190611e9e565b9050600083156117ea57836117f3565b6117f382610833565b9050600080611802878561157e565b91509150806000141561181c576000945050505050611578565b670de0b6b3a764000061183861183284866119c8565b836119f0565b8161183f57fe5b04979650505050505050565b6000546001600160a01b0316331461186257600080fd5b6001546001600160a01b03161561148157600080fd5b60045481565b6000546001600160a01b0316331461189557600080fd5b80156118a5576002829055610ab9565b50600355565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b60008115806118ed575050808202828282816118ea57fe5b04145b61157857600080fd5b60006b033b2e3c9fd0803ce800000061192861191285856118d2565b60026b033b2e3c9fd0803ce80000005b04611a14565b8161192f57fe5b049392505050565b61198d8363a9059cbb60e01b848460405160240161195692919061229d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a24565b505050565b47156119c65760405133904780156108fc02916000818181858888f193505050501580156119c4573d6000803e3d6000fd5b505b565b6000670de0b6b3a76400006119286119e085856118d2565b6002670de0b6b3a7640000611922565b600081611928611a0c856b033b2e3c9fd0803ce80000006118d2565b600285611922565b8082018281101561157857600080fd5b6060611a79826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ab39092919063ffffffff16565b80519091501561198d5780806020019051810190611a979190611d9a565b61198d5760405162461bcd60e51b8152600401610d019061236b565b60606109da84846000856060611ac885611b81565b611ae45760405162461bcd60e51b8152600401610d019061230e565b60006060866001600160a01b03168587604051611b01919061218e565b60006040518083038185875af1925050503d8060008114611b3e576040519150601f19603f3d011682016040523d82523d6000602084013e611b43565b606091505b50915091508115611b575791506109da9050565b805115611b675780518082602001fd5b8360405162461bcd60e51b8152600401610d0191906122fb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906109da575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803561157881612510565b805161157881612510565b805161157881612525565b600082601f830112611c2f578081fd5b813567ffffffffffffffff811115611c45578182fd5b611c58601f8201601f19166020016124b9565b9150808252836020828501011115611c6f57600080fd5b8060208401602084013760009082016020015292915050565b600060c08284031215611c99578081fd5b611ca360c06124b9565b90508135611cb081612510565b81526020820135611cc081612510565b60208201526040820135611cd381612510565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d0857600080fd5b611d1484828501611c1f565b60a08301525092915050565b80516001600160801b038116811461157857600080fd5b600060208284031215611d48578081fd5b813561081d81612510565b600060208284031215611d64578081fd5b815161081d81612510565b60008060408385031215611d81578081fd5b8235611d8c81612510565b946020939093013593505050565b600060208284031215611dab578081fd5b815161081d81612525565b600080828403610120811215611dca578283fd5b8351611dd581612525565b9250610100601f198201811315611dea578283fd5b611df3816124b9565b91506020850151611e0381612533565b8252611e128660408701611d20565b6020830152611e248660608701611d20565b6040830152611e368660808701611d20565b6060830152611e488660a08701611c09565b608083015260c085015160a0830152611e648660e08701611c14565b60c0830152611e7586828701611c14565b60e083015250809150509250929050565b600060208284031215611e97578081fd5b5035919050565b600060208284031215611eaf578081fd5b5051919050565b60008060408385031215611ec8578182fd5b8251611ed381612510565b6020939093015192949293505050565b600080600060608486031215611ef7578081fd5b833560028110611f05578182fd5b95602085013595506040909401359392505050565b60008060008060808587031215611f2f578182fd5b843567ffffffffffffffff80821115611f46578384fd5b818701915061014080838a031215611f5c578485fd5b611f65816124b9565b9050611f718984611bfe565b8152611f808960208501611bfe565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152611fba8960c08501611bfe565b60c0820152611fcc8960e08501611bfe565b60e08201526101008084013583811115611fe4578687fd5b611ff08b828701611c1f565b8284015250506101208084013583811115612009578687fd5b6120158b828701611c88565b828401525050809650505050602085013592506040850135915061203c8660608701611bfe565b905092959194509250565b60008060408385031215612059578182fd5b82359150602083013561206b81612525565b809150509250929050565b60008060408385031215612088578182fd5b50508035926020909101359150565b600080604083850312156120a9578182fd5b505080516020909101519092909150565b600080600080600060a086880312156120d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b6000815180845261211e8160208601602086016124e0565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526109da60c0850182612106565b600082516121a08184602087016124e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906121ea90830184612106565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b60006020825261081d6020830184612106565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526123c960a0830188516120f9565b60208701516123db60c08401826120f9565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b015193506124266101608701856120f9565b60e08b0151935061243b6101808701856120f9565b828b01519350806101a0870152506124576101e0860184612106565b908a0151858203609f19016101c087015290925090506124778282612139565b9250505085602083015284604083015261249460608301856120f9565b6124a16080830184612132565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156124d857600080fd5b604052919050565b60005b838110156124fb5781810151838201526020016124e3565b8381111561250a576000848401525b50505050565b6001600160a01b03811681146119c457600080fd5b80151581146119c457600080fd5b6001600160801b03811681146119c457600080fdfea26469706673582212202f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a664736f6c634300060c00330000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637016722c11610123578063c41a360a116100ab578063deca5f881161006f578063deca5f8814610598578063e3bbb4f1146105b8578063f05def81146105cd578063f24ccbfe146105ed578063f851a440146106025761021a565b8063c41a360a14610500578063c42498ea14610520578063c91d59fe1461054e578063cf66a6bc14610563578063cff70001146105785761021a565b8063a56f9718116100f2578063a56f971814610481578063a7304bf714610496578063a8c90323146104b6578063b2f9e47f146104d6578063b6d5a156146104eb5761021a565b80637016722c1461043157806379521f02146104445780638da5cb5b14610459578063a564056c1461046e5761021a565b80633a128322116101a65780634d3f199e116101755780634d3f199e146103b0578063526d6461146103d057806358346f4b146103e55780635ea2a60914610407578063696806c01461041c5761021a565b80633a1283221461034657806341c0e1b514610366578063481c6a751461037b57806349a7ac67146103905761021a565b80632e77468d116101ed5780632e77468d146102ba57806331d98b3f146102dc57806336569e77146102fc57806336fc603f146103115780633816377e146103265761021a565b806305a2cded1461021f57806318bf60e1146102565780631e48907b146102785780632a56f6021461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a366004611ee3565b610617565b60405161024d9291906122b6565b60405180910390f35b34801561026257600080fd5b5061026b6107bb565b60405161024d91906122c6565b34801561028457600080fd5b50610298610293366004611d37565b6107c1565b005b3480156102a657600080fd5b5061026b6102b5366004611e86565b6107fa565b3480156102c657600080fd5b506102cf610824565b60405161024d91906121aa565b3480156102e857600080fd5b5061026b6102f7366004611e86565b610833565b34801561030857600080fd5b506102cf6109e2565b34801561031d57600080fd5b5061026b6109f1565b34801561033257600080fd5b50610298610341366004611e86565b6109f7565b34801561035257600080fd5b50610298610361366004611d6f565b610a24565b34801561037257600080fd5b50610298610abd565b34801561038757600080fd5b506102cf610ae2565b34801561039c57600080fd5b5061023f6103ab366004611ee3565b610af1565b3480156103bc57600080fd5b506102986103cb366004611e86565b610bf1565b3480156103dc57600080fd5b506102cf610c1c565b3480156103f157600080fd5b506103fa610c34565b60405161024d91906122e6565b34801561041357600080fd5b506102cf610c3d565b34801561042857600080fd5b5061026b610c58565b61029861043f366004611f1a565b610c5e565b34801561045057600080fd5b506102cf611076565b34801561046557600080fd5b506102cf611085565b61029861047c366004611f1a565b611094565b34801561048d57600080fd5b5061026b611464565b3480156104a257600080fd5b506102986104b1366004611d37565b61146a565b3480156104c257600080fd5b506102986104d1366004611e86565b6114a3565b3480156104e257600080fd5b506103fa6114ce565b3480156104f757600080fd5b506102cf6114df565b34801561050c57600080fd5b506102cf61051b366004611e86565b6114f7565b34801561052c57600080fd5b5061054061053b366004612076565b61157e565b60405161024d9291906124ab565b34801561055a57600080fd5b506102cf611733565b34801561056f57600080fd5b506102cf611746565b34801561058457600080fd5b5061026b610593366004612076565b611755565b3480156105a457600080fd5b506102986105b3366004611d37565b61184b565b3480156105c457600080fd5b5061026b611878565b3480156105d957600080fd5b506102986105e8366004612047565b61187e565b3480156105f957600080fd5b506102cf6118ab565b34801561060e57600080fd5b506102cf6118c3565b6000806000610624611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f906106549089906004016122c6565b6101206040518083038186803b15801561066d57600080fd5b505afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190611db6565b9092509050816106bd576000809350935050506107b3565b6000851180156106cf57508060e00151155b156106e2576000809350935050506107b3565b60008760018111156106f057fe5b1480156106ff57508060c00151155b15610712576000809350935050506107b3565b80608001516001600160a01b0316610729876114f7565b6001600160a01b031614610745576000809350935050506107b3565b60006107518787611755565b9050600188600181111561076157fe5b141561077f5790516001600160801b03168110935091506107b39050565b600088600181111561078d57fe5b14156107af576020909101516001600160801b03168111935091506107b39050565b5050505b935093915050565b60065481565b6001546001600160a01b031633146107d857600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806004543a111561080f57600454610811565b3a5b905061081d81846118d2565b9392505050565b600c546001600160a01b031681565b600c54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d36906108689086906004016122c6565b604080518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190611eb6565b600b54604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906108ec9087906004016122c6565b60a06040518083038186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c91906120ba565b5050925050506109da6109d482600c60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf9190611e9e565b6118f6565b836118f6565b949350505050565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610a0e57600080fd5b64e8d4a510008110610a1f57600080fd5b600455565b6000546001600160a01b03163314610a3b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610a9f57600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610a99573d6000803e3d6000fd5b50610ab9565b600054610ab9906001600160a01b03848116911683611937565b5050565b6000546001600160a01b03163314610ad457600080fd5b6000546001600160a01b0316ff5b600a546001600160a01b031681565b600080610afc611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610b2c9088906004016122c6565b6101206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611db6565b915060009050610b8d8686611755565b90506001876001811115610b9d57fe5b1415610bbd576020909101516001600160801b03168110925090506107b3565b6000876001811115610bcb57fe5b1415610be75790516001600160801b03168111925090506107b3565b5050935093915050565b6000546001600160a01b03163314610c0857600080fd5b622dc6c08110610c1757600080fd5b600555565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60075460e01b81565b6007546801000000000000000090046001600160a01b031681565b60035481565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610c959033906004016121aa565b60206040518083038186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611d9a565b610d0a5760405162461bcd60e51b8152600401610d0190612345565b60405180910390fd5b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a0823190610d419030906004016121aa565b60206040518083038186803b158015610d5957600080fd5b505afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190611e9e565b10610e1c5760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610dc89084906004016122c6565b602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611d9a565b505b600080610e2b60018787610617565b9150915081610e3957600080fd5b6000610e466005546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610e7c908b906004016122c6565b60206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760009054906101000a900460e01b8e8e898e6000604051602401610f349594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b9092168252610f7b9392916004016121be565b6000604051808303818588803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050600080610fbc60018b8b610af1565b9150915081610fca57600080fd5b610fd2611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce503085888560405160200161100a9291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611037939291906121f3565b600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b505050505050505050505050505050565b6008546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da906110cb9033906004016121aa565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611d9a565b6111375760405162461bcd60e51b8152600401610d0190612345565b6003546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061116e9030906004016121aa565b60206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190611e9e565b106112495760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906111f59084906004016122c6565b602060405180830381600087803b15801561120f57600080fd5b505af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112479190611d9a565b505b60008061125860008787610617565b915091508161126657600080fd5b60006112736006546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112a9908b906004016122c6565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760049054906101000a900460e01b8e8e898e60006040516024016113619594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113a89392916004016121be565b6000604051808303818588803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50505050506000806113e960008b8b610af1565b91509150816113f757600080fd5b6113ff611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308588856040516020016114379291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161103793929190612248565b60025481565b6001546001600160a01b0316331461148157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114ba57600080fd5b622dc6c081106114c957600080fd5b600655565b600754640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b600a5460405163040b0d8960e51b81526000916001600160a01b031690638161b120906115289085906004016122c6565b60206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190611d53565b92915050565b600a54604051632726b07360e01b8152600091829182916001600160a01b031690632726b073906115b39088906004016122c6565b60206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116039190611d53565b600b546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c9061163b90899087906004016122cf565b604080518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a9190612097565b600b54604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d36906116c3908a906004016122c6565b60a06040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171391906120ba565b5050509150508261172483836118f6565b95509550505050509250929050565b6eb3f879cb30fe243b4dfee438691c0481565b6009546001600160a01b031681565b600a54604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd9061178a9087906004016122c6565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da9190611e9e565b9050600083156117ea57836117f3565b6117f382610833565b9050600080611802878561157e565b91509150806000141561181c576000945050505050611578565b670de0b6b3a764000061183861183284866119c8565b836119f0565b8161183f57fe5b04979650505050505050565b6000546001600160a01b0316331461186257600080fd5b6001546001600160a01b03161561148157600080fd5b60045481565b6000546001600160a01b0316331461189557600080fd5b80156118a5576002829055610ab9565b50600355565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b60008115806118ed575050808202828282816118ea57fe5b04145b61157857600080fd5b60006b033b2e3c9fd0803ce800000061192861191285856118d2565b60026b033b2e3c9fd0803ce80000005b04611a14565b8161192f57fe5b049392505050565b61198d8363a9059cbb60e01b848460405160240161195692919061229d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a24565b505050565b47156119c65760405133904780156108fc02916000818181858888f193505050501580156119c4573d6000803e3d6000fd5b505b565b6000670de0b6b3a76400006119286119e085856118d2565b6002670de0b6b3a7640000611922565b600081611928611a0c856b033b2e3c9fd0803ce80000006118d2565b600285611922565b8082018281101561157857600080fd5b6060611a79826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ab39092919063ffffffff16565b80519091501561198d5780806020019051810190611a979190611d9a565b61198d5760405162461bcd60e51b8152600401610d019061236b565b60606109da84846000856060611ac885611b81565b611ae45760405162461bcd60e51b8152600401610d019061230e565b60006060866001600160a01b03168587604051611b01919061218e565b60006040518083038185875af1925050503d8060008114611b3e576040519150601f19603f3d011682016040523d82523d6000602084013e611b43565b606091505b50915091508115611b575791506109da9050565b805115611b675780518082602001fd5b8360405162461bcd60e51b8152600401610d0191906122fb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906109da575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803561157881612510565b805161157881612510565b805161157881612525565b600082601f830112611c2f578081fd5b813567ffffffffffffffff811115611c45578182fd5b611c58601f8201601f19166020016124b9565b9150808252836020828501011115611c6f57600080fd5b8060208401602084013760009082016020015292915050565b600060c08284031215611c99578081fd5b611ca360c06124b9565b90508135611cb081612510565b81526020820135611cc081612510565b60208201526040820135611cd381612510565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d0857600080fd5b611d1484828501611c1f565b60a08301525092915050565b80516001600160801b038116811461157857600080fd5b600060208284031215611d48578081fd5b813561081d81612510565b600060208284031215611d64578081fd5b815161081d81612510565b60008060408385031215611d81578081fd5b8235611d8c81612510565b946020939093013593505050565b600060208284031215611dab578081fd5b815161081d81612525565b600080828403610120811215611dca578283fd5b8351611dd581612525565b9250610100601f198201811315611dea578283fd5b611df3816124b9565b91506020850151611e0381612533565b8252611e128660408701611d20565b6020830152611e248660608701611d20565b6040830152611e368660808701611d20565b6060830152611e488660a08701611c09565b608083015260c085015160a0830152611e648660e08701611c14565b60c0830152611e7586828701611c14565b60e083015250809150509250929050565b600060208284031215611e97578081fd5b5035919050565b600060208284031215611eaf578081fd5b5051919050565b60008060408385031215611ec8578182fd5b8251611ed381612510565b6020939093015192949293505050565b600080600060608486031215611ef7578081fd5b833560028110611f05578182fd5b95602085013595506040909401359392505050565b60008060008060808587031215611f2f578182fd5b843567ffffffffffffffff80821115611f46578384fd5b818701915061014080838a031215611f5c578485fd5b611f65816124b9565b9050611f718984611bfe565b8152611f808960208501611bfe565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152611fba8960c08501611bfe565b60c0820152611fcc8960e08501611bfe565b60e08201526101008084013583811115611fe4578687fd5b611ff08b828701611c1f565b8284015250506101208084013583811115612009578687fd5b6120158b828701611c88565b828401525050809650505050602085013592506040850135915061203c8660608701611bfe565b905092959194509250565b60008060408385031215612059578182fd5b82359150602083013561206b81612525565b809150509250929050565b60008060408385031215612088578182fd5b50508035926020909101359150565b600080604083850312156120a9578182fd5b505080516020909101519092909150565b600080600080600060a086880312156120d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b6000815180845261211e8160208601602086016124e0565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526109da60c0850182612106565b600082516121a08184602087016124e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906121ea90830184612106565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b60006020825261081d6020830184612106565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526123c960a0830188516120f9565b60208701516123db60c08401826120f9565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b015193506124266101608701856120f9565b60e08b0151935061243b6101808701856120f9565b828b01519350806101a0870152506124576101e0860184612106565b908a0151858203609f19016101c087015290925090506124778282612139565b9250505085602083015284604083015261249460608301856120f9565b6124a16080830184612132565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156124d857600080fd5b604052919050565b60005b838110156124fb5781810151838201526020016124e3565b8381111561250a576000848401525b50505050565b6001600160a01b03811681146119c457600080fd5b80151581146119c457600080fd5b6001600160801b03811681146119c457600080fdfea26469706673582212202f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a664736f6c634300060c0033

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

0000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca

-----Decoded View---------------
Arg [0] : _monitorProxy (address): 0x1816A86C4DA59395522a42b871bf11A4E96A1C7a
Arg [1] : _subscriptions (address): 0xC45d4f6B6bf41b6EdAA58B01c4298B8d9078269a
Arg [2] : _mcdSaverTakerAddress (address): 0x1739e1E5bB8be51bB6b1982dB9578fa61E67d6cA

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a
Arg [1] : 000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a
Arg [2] : 0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca


Deployed Bytecode Sourcemap

21828:9058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27495:972;;;;;;;;;;-1:-1:-1;27495:972:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22085:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13449:122::-;;;;;;;;;;-1:-1:-1;13449:122:0;;;;;:::i;:::-;;:::i;:::-;;29261:203;;;;;;;;;;-1:-1:-1;29261:203:0;;;;;:::i;:::-;;:::i;22727:76::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26650:210::-;;;;;;;;;;-1:-1:-1;26650:210:0;;;;;:::i;:::-;;:::i;22656:64::-;;;;;;;;;;;;;:::i;22042:36::-;;;;;;;;;;;;;:::i;30259:160::-;;;;;;;;;;-1:-1:-1;30259:160:0;;;;;:::i;:::-;;:::i;13744:285::-;;;;;;;;;;-1:-1:-1;13744:285:0;;;;;:::i;:::-;;:::i;13617:80::-;;;;;;;;;;;;;:::i;22573:76::-;;;;;;;;;;;;;:::i;28559:494::-;;;;;;;;;;-1:-1:-1;28559:494:0;;;;;:::i;:::-;;:::i;30006:144::-;;;;;;;;;;-1:-1:-1;30006:144:0;;;;;:::i;:::-;;:::i;22376:89::-;;;;;;;;;;;;;:::i;22130:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22228:45::-;;;;;;;;;;;;;:::i;21940:32::-;;;;;;;;;;;;;:::i;23537:941::-;;;;;;:::i;:::-;;:::i;22280:45::-;;;;;;;;;;;;;:::i;12407:20::-;;;;;;;;;;;;;:::i;24660:940::-;;;;;;:::i;:::-;;:::i;21901:32::-;;;;;;;;;;;;;:::i;13228:122::-;;;;;;;;;;-1:-1:-1;13228:122:0;;;;;:::i;:::-;;:::i;29703:144::-;;;;;;;;;;-1:-1:-1;29703:144:0;;;;;:::i;:::-;;:::i;22178:41::-;;;;;;;;;;;;;:::i;22474:90::-;;;;;;;;;;;;;:::i;26037:106::-;;;;;;;;;;-1:-1:-1;26037:106:0;;;;;:::i;:::-;;:::i;26274:289::-;;;;;;;;;;-1:-1:-1;26274:289:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;14946:106::-;;;;;;;;;;;;;:::i;22332:35::-;;;;;;;;;;;;;:::i;26984:369::-;;;;;;;;;;-1:-1:-1;26984:369:0;;;;;:::i;:::-;;:::i;12945:161::-;;;;;;;;;;-1:-1:-1;12945:161:0;;;;;:::i;:::-;;:::i;21981:40::-;;;;;;;;;;;;;:::i;30656:227::-;;;;;;;;;;-1:-1:-1;30656:227:0;;;;;:::i;:::-;;:::i;22812:100::-;;;;;;;;;;;;;:::i;12434:20::-;;;;;;;;;;;;;:::i;27495:972::-;27578:4;27584;27601:15;27627:23;;:::i;:::-;27684:21;;:42;;-1:-1:-1;;;27684:42:0;;-1:-1:-1;;;;;27684:21:0;;;;:34;;:42;;27719:6;;27684:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27661:65;;-1:-1:-1;27661:65:0;-1:-1:-1;27661:65:0;27778:34;;27803:5;27810:1;27795:17;;;;;;;;27778:34;27891:1;27878:10;:14;:42;;;;;27897:6;:23;;;27896:24;27878:42;27874:65;;;27930:5;27937:1;27922:17;;;;;;;;27874:65;28012:12;28001:7;:23;;;;;;;;;:47;;;;;28029:6;:19;;;28028:20;28001:47;27997:70;;;28058:5;28065:1;28050:17;;;;;;;;27997:70;28146:6;:12;;;-1:-1:-1;;;;;28126:32:0;:16;28135:6;28126:8;:16::i;:::-;-1:-1:-1;;;;;28126:32:0;;28122:55;;28168:5;28175:1;28160:17;;;;;;;;28122:55;28190:14;28207:28;28216:6;28224:10;28207:8;:28::i;:::-;28190:45;-1:-1:-1;28263:12:0;28252:7;:23;;;;;;;;;28248:212;;;28312:15;;-1:-1:-1;;;;;28300:27:0;;;;-1:-1:-1;28300:9:0;-1:-1:-1;28292:47:0;;-1:-1:-1;28292:47:0;28248:212;28372:12;28361:7;:23;;;;;;;;;28357:103;;;28421:15;;;;;-1:-1:-1;;;;;28409:27:0;;;;-1:-1:-1;28409:9:0;-1:-1:-1;28401:47:0;;-1:-1:-1;28401:47:0;28357:103;27495:972;;;;;;;;;;:::o;22085:36::-;;;;:::o;13449:122::-;13530:5;;-1:-1:-1;;;;;13530:5:0;13516:10;:19;13508:28;;;;;;13549:5;:14;;-1:-1:-1;;;;;;13549:14:0;-1:-1:-1;;;;;13549:14:0;;;;;;;;;;13449:122::o;29261:203::-;29320:4;29337:13;29368;;29353:11;:28;;:58;;29398:13;;29353:58;;;29384:11;29353:58;29337:74;;29431:25;29435:8;29445:10;29431:3;:25::i;:::-;29424:32;29261:203;-1:-1:-1;;;29261:203:0:o;22727:76::-;;;-1:-1:-1;;;;;22727:76:0;;:::o;26650:210::-;26735:7;;:18;;-1:-1:-1;;;26735:18:0;;26703:4;;;;-1:-1:-1;;;;;26735:7:0;;;;:12;;:18;;26748:4;;26735:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26782:3;;:14;;-1:-1:-1;;;26782:14:0;;26720:33;;-1:-1:-1;26767:9:0;;-1:-1:-1;;;;;;26782:3:0;;:8;;:14;;26791:4;;26782:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26764:32;;;;;;26816:36;26821:25;26826:4;26832:7;;;;;;;;;-1:-1:-1;;;;;26832:7:0;-1:-1:-1;;;;;26832:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26821:4;:25::i;:::-;26848:3;26816:4;:36::i;:::-;26809:43;26650:210;-1:-1:-1;;;;26650:210:0:o;22656:64::-;;;-1:-1:-1;;;;;22656:64:0;;:::o;22042:36::-;;;;:::o;30259:160::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30356:13:::1;30341:12;:28;30333:37;;;::::0;::::1;;30383:13;:28:::0;30259:160::o;13744:285::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;13844:42:::1;-1:-1:-1::0;;;;;13834:52:0;::::1;;13830:192;;;13911:5;::::0;;13903:32:::1;::::0;-1:-1:-1;;;;;13911:5:0;;::::1;::::0;13903:32;::::1;;;::::0;13927:7;;13903:32;13911:5;13903:32;13927:7;13911:5;13903:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13830:192;;;13995:5;::::0;13968:42:::1;::::0;-1:-1:-1;;;;;13968:26:0;;::::1;::::0;13995:5:::1;14002:7:::0;13968:26:::1;:42::i;:::-;13744:285:::0;;:::o;13617:80::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;13682:5:::1;::::0;-1:-1:-1;;;;;13682:5:0::1;13661:28;22573:76:::0;;;-1:-1:-1;;;;;22573:76:0;;:::o;28559:494::-;28649:4;28655;28672:23;;:::i;:::-;28721:21;;:42;;-1:-1:-1;;;28721:42:0;;-1:-1:-1;;;;;28721:21:0;;;;:34;;:42;;28756:6;;28721:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28708:55;-1:-1:-1;28776:14:0;;-1:-1:-1;28793:28:0;28802:6;28810:10;28793:8;:28::i;:::-;28776:45;-1:-1:-1;28849:12:0;28838:7;:23;;;;;;;;;28834:212;;;28898:15;;;;;-1:-1:-1;;;;;28886:27:0;;;;-1:-1:-1;28886:9:0;-1:-1:-1;28878:47:0;;28834:212;28958:12;28947:7;:23;;;;;;;;;28943:103;;;29007:15;;-1:-1:-1;;;;;28995:27:0;;;;-1:-1:-1;28995:9:0;-1:-1:-1;28987:47:0;;28943:103;28559:494;;;;;;;;:::o;30006:144::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30096:7:::1;30085:8;:18;30077:27;;;::::0;::::1;;30117:14;:25:::0;30006:144::o;22376:89::-;22423:42;22376:89;:::o;22130:41::-;;;;;;:::o;22228:45::-;;;;;;-1:-1:-1;;;;;22228:45:0;;:::o;21940:32::-;;;;:::o;23537:941::-;22964:53;;-1:-1:-1;;;22964:53:0;;22423:42;;22964:41;;:53;;23006:10;;22964:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22956:78;;;;-1:-1:-1;;;22956:78:0;;;;;;;:::i;:::-;;;;;;;;;23734:15:::1;::::0;15107:33:::1;::::0;-1:-1:-1;;;15107:33:0;;23734:15;;15009:42:::1;::::0;15107:18:::1;::::0;:33:::1;::::0;15134:4:::1;::::0;15107:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15103:99;;15168:22;::::0;-1:-1:-1;;;15168:22:0;;15009:42:::1;::::0;15168:13:::1;::::0;:22:::1;::::0;15182:7;;15168:22:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15103:99;23765:14:::2;23781:16:::0;23801:41:::2;23809:12;23823:6;23831:10;23801:7;:41::i;:::-;23764:78;;;;23861:9;23853:18;;;::::0;::::2;;23884:12;23899:27;23911:14;;23899:11;:27::i;:::-;23955:21;::::0;:38:::2;::::0;-1:-1:-1;;;23955:38:0;;23884:42;;-1:-1:-1;23939:13:0::2;::::0;-1:-1:-1;;;;;23955:21:0;;::::2;::::0;:30:::2;::::0;:38:::2;::::0;23986:6;;23955:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23939:54;;24006:20;;;;;;;;;-1:-1:-1::0;;;;;24006:20:0::2;-1:-1:-1::0;;;;;24006:32:0::2;;24046:9;24071:5;24091:20;;;;;;;;;-1:-1:-1::0;;;;;24091:20:0::2;24149:14;;;;;;;;;;;24165:13;24180:6;24188:7;24197:9;24208:1;24126:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;24126:84:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;24126:84:0::2;-1:-1:-1::0;;;;;;24126:84:0;;::::2;;::::0;;24006:205;::::2;::::0;;;;;;;;::::2;::::0;;;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;24227:16;24245:15:::0;24264:48:::2;24279:12;24293:6;24301:10;24264:14;:48::i;:::-;24226:86;;;;24331:11;24323:20;;;::::0;::::2;;24356:11;:9;:11::i;:::-;22869:42;-1:-1:-1::0;;;;;24380:10:0::2;;24399:4;24406:5;24445:11;24458:10;24434:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24380:90;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15214:1;;;;;;23045::::1;23537:941:::0;;;;:::o;22280:45::-;;;-1:-1:-1;;;;;22280:45:0;;:::o;12407:20::-;;;-1:-1:-1;;;;;12407:20:0;;:::o;24660:940::-;22964:53;;-1:-1:-1;;;22964:53:0;;22423:42;;22964:41;;:53;;23006:10;;22964:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22956:78;;;;-1:-1:-1;;;22956:78:0;;;;;;;:::i;:::-;24857:15:::1;::::0;15107:33:::1;::::0;-1:-1:-1;;;15107:33:0;;24857:15;;15009:42:::1;::::0;15107:18:::1;::::0;:33:::1;::::0;15134:4:::1;::::0;15107:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15103:99;;15168:22;::::0;-1:-1:-1;;;15168:22:0;;15009:42:::1;::::0;15168:13:::1;::::0;:22:::1;::::0;15182:7;;15168:22:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15103:99;24889:14:::2;24905:16:::0;24925:41:::2;24933:12;24947:6;24955:10;24925:7;:41::i;:::-;24888:78;;;;24985:9;24977:18;;;::::0;::::2;;25008:12;25023:27;25035:14;;25023:11;:27::i;:::-;25079:21;::::0;:38:::2;::::0;-1:-1:-1;;;25079:38:0;;25008:42;;-1:-1:-1;25063:13:0::2;::::0;-1:-1:-1;;;;;25079:21:0;;::::2;::::0;:30:::2;::::0;:38:::2;::::0;25110:6;;25079:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25063:54;;25130:20;;;;;;;;;-1:-1:-1::0;;;;;25130:20:0::2;-1:-1:-1::0;;;;;25130:32:0::2;;25170:9;25195:5;25215:20;;;;;;;;;-1:-1:-1::0;;;;;25215:20:0::2;25273:14;;;;;;;;;;;25289:13;25304:6;25312:7;25321:9;25332:1;25250:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;25250:84:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;25250:84:0::2;-1:-1:-1::0;;;;;;25250:84:0;;::::2;;::::0;;25130:205;::::2;::::0;;;;;;;;::::2;::::0;;;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;25349:16;25367:15:::0;25386:48:::2;25401:12;25415:6;25423:10;25386:14;:48::i;:::-;25348:86;;;;25453:11;25445:20;;;::::0;::::2;;25478:11;:9;:11::i;:::-;22869:42;-1:-1:-1::0;;;;;25502:10:0::2;;25521:4;25528:5;25567:11;25580:10;25556:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25502:90;;;;;;;;;;;;;;;;;:::i;21901:32::-:0;;;;:::o;13228:122::-;13309:5;;-1:-1:-1;;;;;13309:5:0;13295:10;:19;13287:28;;;;;;13328:5;:14;;-1:-1:-1;;;;;;13328:14:0;-1:-1:-1;;;;;13328:14:0;;;;;;;;;;13228:122::o;29703:144::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;29793:7:::1;29782:8;:18;29774:27;;;::::0;::::1;;29814:14;:25:::0;29703:144::o;22178:41::-;;;;;;;;;:::o;22474:90::-;22522:42;22474:90;:::o;26037:106::-;26115:7;;:20;;-1:-1:-1;;;26115:20:0;;26088:7;;-1:-1:-1;;;;;26115:7:0;;:12;;:20;;26128:6;;26115:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26108:27;26037:106;-1:-1:-1;;26037:106:0:o;26274:289::-;26379:7;;:20;;-1:-1:-1;;;26379:20:0;;26342:4;;;;;;-1:-1:-1;;;;;26379:7:0;;:12;;:20;;26392:6;;26379:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26443:3;;:19;;-1:-1:-1;;;26443:19:0;;26365:34;;-1:-1:-1;26413:15:0;;;;-1:-1:-1;;;;;26443:3:0;;:8;;:19;;26452:4;;26365:34;;26443:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26491:3;;:14;;-1:-1:-1;;;26491:14:0;;26412:50;;-1:-1:-1;26412:50:0;;-1:-1:-1;26475:9:0;;-1:-1:-1;;;;;26491:3:0;;;;:8;;:14;;26500:4;;26491:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26473:32;;;;;;26526:10;26538:16;26543:4;26549;26538;:16::i;:::-;26518:37;;;;;;;;26274:289;;;;;:::o;14946:106::-;15009:42;14946:106;:::o;22332:35::-;;;-1:-1:-1;;;;;22332:35:0;;:::o;26984:369::-;27084:7;;:20;;-1:-1:-1;;;27084:20:0;;27053:4;;;;-1:-1:-1;;;;;27084:7:0;;;;:12;;:20;;27097:6;;27084:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27070:34;-1:-1:-1;27115:10:0;27129:15;;27128:46;;27164:10;27128:46;;;27148:13;27157:3;27148:8;:13::i;:::-;27115:59;;27188:15;27205:9;27218:23;27229:6;27237:3;27218:10;:23::i;:::-;27187:54;;;;27258:4;27266:1;27258:9;27254:23;;;27276:1;27269:8;;;;;;;;27254:23;27336:8;27297:35;27302:23;27307:10;27319:5;27302:4;:23::i;:::-;27327:4;27297;:35::i;:::-;:48;;;;;;;26984:369;-1:-1:-1;;;;;;;26984:369:0:o;12945:161::-;13026:5;;-1:-1:-1;;;;;13026:5:0;13012:10;:19;13004:28;;;;;;13051:5;;-1:-1:-1;;;;;13051:5:0;:19;13043:28;;;;;21981:40;;;;:::o;30656:227::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30750:8:::1;30746:130;;;30775:15;:28:::0;;;30746:130:::1;;;-1:-1:-1::0;30836:15:0::1;:28:::0;30656:227::o;22812:100::-;22869:42;22812:100;:::o;12434:20::-;;;-1:-1:-1;;;;;12434:20:0;;:::o;2718:127::-;2776:9;2806:6;;;:30;;-1:-1:-1;;2821:5:0;;;2835:1;2830;2821:5;2830:1;2816:15;;;;;:20;2806:30;2798:39;;;;;3629:122;3688:9;3484:6;3714:23;3718:9;3722:1;3725;3718:3;:9::i;:::-;3735:1;3484:6;3729:7;;3714:3;:23::i;:::-;:29;;;;;;;3629:122;-1:-1:-1;;;3629:122:0:o;10451:176::-;10533:86;10553:5;10583:23;;;10608:2;10612:5;10560:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10560:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10560:58:0;-1:-1:-1;;;;;;10560:58:0;;;;;;;;;;10533:19;:86::i;:::-;10451:176;;;:::o;25681:184::-;25762:21;:25;25758:100;;25804:42;;:10;;25824:21;25804:42;;;;;;;;;25824:21;25804:10;:42;;;;;;;;;;;;;;;;;;;;;25758:100;25681:184::o;3499:122::-;3558:9;3448:6;3584:23;3588:9;3592:1;3595;3588:3;:9::i;:::-;3605:1;3448:6;3599:7;;3887:120;3946:9;3998:1;3972:23;3976:11;3980:1;3484:6;3976:3;:11::i;:::-;3993:1;3989;:5;;2476:113;2569:5;;;2564:16;;;;2556:25;;;;;11920:419;12002:23;12028:69;12056:4;12028:69;;;;;;;;;;;;;;;;;12036:5;-1:-1:-1;;;;;12028:27:0;;;:69;;;;;:::i;:::-;12112:17;;12002:95;;-1:-1:-1;12112:21:0;12108:224;;12254:10;12243:30;;;;;;;;;;;;:::i;:::-;12235:85;;;;-1:-1:-1;;;12235:85:0;;;;;;;:::i;6840:196::-;6943:12;6975:53;6998:6;7006:4;7012:1;7015:12;7732;7765:18;7776:6;7765:10;:18::i;:::-;7757:60;;;;-1:-1:-1;;;7757:60:0;;;;;;;:::i;:::-;7891:12;7905:23;7932:6;-1:-1:-1;;;;;7932:11:0;7952:8;7963:4;7932:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7890:78;;;;7983:7;7979:595;;;8014:10;-1:-1:-1;8007:17:0;;-1:-1:-1;8007:17:0;7979:595;8128:17;;:21;8124:439;;8391:10;8385:17;8452:15;8439:10;8435:2;8431:19;8424:44;8339:148;8534:12;8527:20;;-1:-1:-1;;;8527:20:0;;;;;;;;:::i;5627:619::-;5687:4;6155:20;;5998:66;6195:23;;;;;;:42;;-1:-1:-1;;6222:15:0;;;5627:619;-1:-1:-1;;5627:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;142:134::-;220:13;;238:33;220:13;238:33;:::i;414:128::-;489:13;;507:30;489:13;507:30;:::i;828:440::-;;929:3;922:4;914:6;910:17;906:27;896:2;;-1:-1;;937:12;896:2;984:6;971:20;31984:18;31976:6;31973:30;31970:2;;;-1:-1;;32006:12;31970:2;1006:64;32079:9;32060:17;;-1:-1;;32056:33;32147:4;32137:15;1006:64;:::i;:::-;997:73;;1090:6;1083:5;1076:21;1194:3;32147:4;1185:6;1118;1176:16;;1173:25;1170:2;;;1211:1;;1201:12;1170:2;36743:6;32147:4;1118:6;1114:17;32147:4;1152:5;1148:16;36720:30;36799:1;36781:16;;;32147:4;36781:16;36774:27;1152:5;889:379;-1:-1;;889:379::o;5134:1179::-;;5253:4;5241:9;5236:3;5232:19;5228:30;5225:2;;;-1:-1;;5261:12;5225:2;5289:20;5253:4;5289:20;:::i;:::-;5280:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5369:75;;5513:2;5567:22;;72:20;97:33;72:20;97:33;:::i;:::-;5513:2;5528:16;;5521:75;5668:2;5722:22;;72:20;97:33;72:20;97:33;:::i;:::-;5701:49;5668:2;5687:5;5683:16;5676:75;;5813:2;5871:9;5867:22;6528:20;5813:2;5832:5;5828:16;5821:75;5964:3;6023:9;6019:22;6528:20;5964:3;5984:5;5980:16;5973:75;6141:3;6130:9;6126:19;6113:33;6166:18;6158:6;6155:30;6152:2;;;-1:-1;;6188:12;6152:2;6233:58;6287:3;6278:6;6267:9;6263:22;6233:58;:::i;:::-;6141:3;6219:5;6215:16;6208:84;;5219:1094;;;;:::o;6320:134::-;6398:13;;-1:-1;;;;;33683:46;;37898:35;;37888:2;;37947:1;;37937:12;6739:241;;6843:2;6831:9;6822:7;6818:23;6814:32;6811:2;;;-1:-1;;6849:12;6811:2;85:6;72:20;97:33;124:5;97:33;:::i;6987:263::-;;7102:2;7090:9;7081:7;7077:23;7073:32;7070:2;;;-1:-1;;7108:12;7070:2;226:6;220:13;238:33;265:5;238:33;:::i;7257:366::-;;;7378:2;7366:9;7357:7;7353:23;7349:32;7346:2;;;-1:-1;;7384:12;7346:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7436:63;7536:2;7575:22;;;;6528:20;;-1:-1;;;7340:283::o;7630:257::-;;7742:2;7730:9;7721:7;7717:23;7713:32;7710:2;;;-1:-1;;7748:12;7710:2;495:6;489:13;507:30;531:5;507:30;:::i;7894:448::-;;;8038:9;8029:7;8025:23;8050:3;8025:23;8021:33;8018:2;;;-1:-1;;8057:12;8018:2;495:6;489:13;507:30;531:5;507:30;:::i;:::-;8109:71;-1:-1;1775:6;-1:-1;;1754:19;;1750:32;-1:-1;1747:2;;;-1:-1;;1785:12;1747:2;1813:22;1775:6;1813:22;:::i;:::-;1804:31;;8217:2;8298:9;8294:22;6398:13;6416:33;6443:5;6416:33;:::i;:::-;1896:86;;2080:60;2136:3;2112:22;;;2080:60;:::i;:::-;8217:2;2066:5;2062:16;2055:86;2248:60;2304:3;2280:22;8298:9;2280:22;2248:60;:::i;:::-;2112:22;2234:5;2230:16;2223:86;2416:60;2472:3;2448:22;8298:9;2448:22;2416:60;:::i;:::-;2280:22;2402:5;2398:16;2391:86;2573:60;2629:3;2605:22;8298:9;2605:22;2573:60;:::i;:::-;2448:22;2559:5;2555:16;2548:86;2762:22;8298:9;2762:22;6676:13;2605:22;2716:5;2712:16;2705:86;2894:57;2947:3;2923:22;8298:9;2923:22;2894:57;:::i;:::-;2762:22;2880:5;2876:16;2869:83;3059:57;3112:3;1775:6;8298:9;3088:22;3059:57;:::i;:::-;2923:22;3045:5;3041:16;3034:83;;8225:101;;;;8012:330;;;;;:::o;8349:241::-;;8453:2;8441:9;8432:7;8428:23;8424:32;8421:2;;;-1:-1;;8459:12;8421:2;-1:-1;616:20;;8415:175;-1:-1;8415:175::o;8597:263::-;;8712:2;8700:9;8691:7;8687:23;8683:32;8680:2;;;-1:-1;;8718:12;8680:2;-1:-1;764:13;;8674:186;-1:-1;8674:186::o;8867:439::-;;;9019:2;9007:9;8998:7;8994:23;8990:32;8987:2;;;-1:-1;;9025:12;8987:2;1380:6;1374:13;1392:53;1439:5;1392:53;:::i;:::-;9208:2;9258:22;;;;6676:13;9077:94;;6676:13;;-1:-1;;;8981:325::o;9313:513::-;;;;9462:2;9450:9;9441:7;9437:23;9433:32;9430:2;;;-1:-1;;9468:12;9430:2;1548:6;1535:20;37807:1;37800:5;37797:12;37787:2;;-1:-1;;37813:12;37787:2;9520:74;9631:2;9670:22;;6528:20;;-1:-1;9739:2;9778:22;;;6528:20;;9424:402;-1:-1;;;9424:402::o;9833:763::-;;;;;10018:3;10006:9;9997:7;9993:23;9989:33;9986:2;;;-1:-1;;10025:12;9986:2;10083:17;10070:31;10121:18;;10113:6;10110:30;10107:2;;;-1:-1;;10143:12;10107:2;10239:6;10228:9;10224:22;;;3306:6;;3294:9;3289:3;3285:19;3281:32;3278:2;;;-1:-1;;3316:12;3278:2;3344:22;3306:6;3344:22;:::i;:::-;3335:31;;3451:49;3496:3;3472:22;3451:49;:::i;:::-;3433:16;3426:75;3599:49;3644:3;3566:2;3624:9;3620:22;3599:49;:::i;:::-;3566:2;3585:5;3581:16;3574:75;3715:2;3773:9;3769:22;6528:20;3715:2;3734:5;3730:16;3723:75;3865:2;3923:9;3919:22;6528:20;3865:2;3884:5;3880:16;3873:75;10018:3;4072:9;4068:22;6528:20;10018:3;4033:5;4029:16;4022:75;4167:3;4226:9;4222:22;6528:20;4167:3;4187:5;4183:16;4176:75;4346:49;4391:3;4312;4371:9;4367:22;4346:49;:::i;:::-;4312:3;4332:5;4328:16;4321:75;4494:49;4539:3;4460;4519:9;4515:22;4494:49;:::i;:::-;4460:3;4480:5;4476:16;4469:75;4640:3;;4629:9;4625:19;4612:33;10121:18;4657:6;4654:30;4651:2;;;-1:-1;;4687:12;4651:2;4734:58;4788:3;4779:6;4768:9;4764:22;4734:58;:::i;:::-;4640:3;4718:5;4714:18;4707:86;;;4890:3;;4879:9;4875:19;4862:33;10121:18;4907:6;4904:30;4901:2;;;-1:-1;;4937:12;4901:2;4984:79;5059:3;5050:6;5039:9;5035:22;4984:79;:::i;:::-;4890:3;4968:5;4964:18;4957:107;;;10163:93;;;;;;3566:2;10336:9;10332:22;6528:20;10301:63;;3715:2;10444:9;10440:22;6528:20;10409:63;;10527:53;10572:7;3865:2;10552:9;10548:22;10527:53;:::i;:::-;10517:63;;9980:616;;;;;;;:::o;11121:360::-;;;11239:2;11227:9;11218:7;11214:23;11210:32;11207:2;;;-1:-1;;11245:12;11207:2;6541:6;6528:20;11297:63;;11397:2;11437:9;11433:22;347:20;372:30;396:5;372:30;:::i;:::-;11405:60;;;;11201:280;;;;;:::o;11488:366::-;;;11609:2;11597:9;11588:7;11584:23;11580:32;11577:2;;;-1:-1;;11615:12;11577:2;-1:-1;;6528:20;;;11767:2;11806:22;;;616:20;;-1:-1;11571:283::o;12234:399::-;;;12366:2;12354:9;12345:7;12341:23;12337:32;12334:2;;;-1:-1;;12372:12;12334:2;-1:-1;;6676:13;;12535:2;12585:22;;;6676:13;;;;;-1:-1;12328:305::o;12640:809::-;;;;;;12823:3;12811:9;12802:7;12798:23;12794:33;12791:2;;;-1:-1;;12830:12;12791:2;-1:-1;;6676:13;;12993:2;13043:22;;6676:13;13112:2;13162:22;;6676:13;13231:2;13281:22;;6676:13;13350:3;13401:22;;;6676:13;;;;;-1:-1;6676:13;;-1:-1;6676:13;;-1:-1;12785:664;-1:-1;12785:664::o;13605:103::-;-1:-1;;;;;33803:54;13666:37;;13660:48::o;14183:323::-;;14315:5;32256:12;32531:6;32526:3;32519:19;14398:52;14443:6;32568:4;32563:3;32559:14;32568:4;14424:5;14420:16;14398:52;:::i;:::-;32079:9;37160:14;-1:-1;;37156:28;14462:39;;;;32568:4;14462:39;;14263:243;-1:-1;;14263:243::o;16441:138::-;34019:4;34008:16;16518:56;;16512:67::o;20794:1219::-;;31984:18;;33814:42;;;;21020:16;21014:23;33803:54;13673:3;13666:37;33814:42;21193:4;21186:5;21182:16;21176:23;33803:54;21193:4;21257:3;21253:14;13666:37;33814:42;21358:4;21351:5;21347:16;21341:23;33803:54;21358:4;21422:3;21418:14;13666:37;;21513:4;21506:5;21502:16;21496:23;21513:4;21577:3;21573:14;14017:37;21674:4;21667:5;21663:16;21657:23;21674:4;21738:3;21734:14;14017:37;21832:4;21825:5;21821:16;21815:23;20945:4;21832;21862:3;21858:14;21851:38;21904:71;20945:4;20940:3;20936:14;21956:12;21904:71;:::i;22250:271::-;;15023:5;32256:12;15134:52;15179:6;15174:3;15167:4;15160:5;15156:16;15134:52;:::i;:::-;15198:16;;;;;22384:137;-1:-1;;22384:137::o;22528:222::-;-1:-1;;;;;33803:54;;;;13666:37;;22655:2;22640:18;;22626:124::o;23002:528::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;23367:2;23352:18;;13666:37;23203:2;23404;23389:18;;23382:48;;;23002:528;;23444:76;;23188:18;;23506:6;23444:76;:::i;:::-;23436:84;23174:356;-1:-1;;;;;23174:356::o;23537:834::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;24004:2;23989:18;;13666:37;23839:3;24041:2;24026:18;;24019:48;;;17165:2;23824:19;;;32519;-1:-1;;;33814:42;32559:14;;17181:40;17240:12;24245:2;24230:18;;24223:48;;;23537:834;;24285:76;;17240:12;;24347:6;24285:76;:::i;24378:834::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;24845:2;24830:18;;13666:37;24680:3;24882:2;24867:18;;24860:48;;;17491:2;24665:19;;;32519;-1:-1;;;33814:42;32559:14;;17507:40;17566:12;25086:2;25071:18;;25064:48;;;24378:834;;25126:76;;17566:12;;25188:6;25126:76;:::i;25219:333::-;-1:-1;;;;;33803:54;;;;13666:37;;25538:2;25523:18;;14017:37;25374:2;25359:18;;25345:207::o;25559:321::-;33247:13;;33240:21;13900:34;;25866:2;25851:18;;14017:37;25708:2;25693:18;;25679:201::o;25887:222::-;14017:37;;;26014:2;25999:18;;25985:124::o;26116:333::-;14017:37;;;-1:-1;;;;;33803:54;26435:2;26420:18;;13666:37;26271:2;26256:18;;26242:207::o;26456:218::-;-1:-1;;;;;;33413:78;;;;14135:36;;26581:2;26566:18;;26552:122::o;28568:310::-;;28715:2;28736:17;28729:47;28790:78;28715:2;28704:9;28700:18;28854:6;28790:78;:::i;28885:416::-;29085:2;29099:47;;;17817:2;29070:18;;;32519:19;17853:31;32559:14;;;17833:52;17904:12;;;29056:245::o;29308:416::-;29508:2;29522:47;;;18155:2;29493:18;;;32519:19;-1:-1;;;32559:14;;;18171:35;18225:12;;;29479:245::o;29731:416::-;29931:2;29945:47;;;18476:2;29916:18;;;32519:19;18512:34;32559:14;;;18492:55;-1:-1;;;18567:12;;;18560:34;18613:12;;;29902:245::o;30154:848::-;;30459:3;30481:17;30474:47;18981:63;30459:3;30448:9;30444:19;18958:16;18952:23;18981:63;:::i;:::-;19127:4;19120:5;19116:16;19110:23;19139:63;19187:14;30448:9;19187:14;19173:12;19139:63;:::i;:::-;;19286:4;19279:5;19275:16;19269:23;19346:14;30448:9;19346:14;14017:37;19446:4;19439:5;19435:16;19429:23;19506:14;19429:23;19506:14;30448:9;19506:14;14017:37;19604:4;19597:5;19593:16;19587:23;;;19664:14;19587:23;19664:14;30448:9;19664:14;14017:37;30459:3;19760:5;19756:16;19750:23;;;18881:6;19750:23;18881:6;30448:9;19827:14;14017:37;19187:14;19914:5;19910:16;19904:23;19884:43;;19933:63;19981:14;30448:9;19981:14;19967:12;19933:63;:::i;:::-;19346:14;20071:5;20067:16;20061:23;20041:43;;20090:63;20138:14;30448:9;20138:14;20124:12;20090:63;:::i;:::-;19506:14;20232:5;20228:18;20222:25;20202:45;;18881:6;20267:16;30448:9;20267:16;20260:40;;20315:71;18872:16;30448:9;18872:16;20367:12;20315:71;:::i;:::-;20468:18;;;20462:25;20525:14;;;-1:-1;;20525:14;20507:16;;;20500:40;20307:79;;-1:-1;20462:25;-1:-1;20555:113;20307:79;20462:25;20555:113;:::i;:::-;30527:126;;;;14047:5;19127:4;30721:9;30717:18;14017:37;14047:5;19286:4;30804:9;30800:18;14017:37;30830:72;19446:4;30887:9;30883:18;30874:6;30830:72;:::i;:::-;30913:79;19604:4;30976:9;30972:19;30963:6;30913:79;:::i;:::-;30430:572;;;;;;;;:::o;31238:333::-;14017:37;;;31557:2;31542:18;;14017:37;31393:2;31378:18;;31364:207::o;31578:256::-;31640:2;31634:9;31666:17;;;31741:18;31726:34;;31762:22;;;31723:62;31720:2;;;31798:1;;31788:12;31720:2;31640;31807:22;31618:216;;-1:-1;31618:216::o;36816:268::-;36881:1;36888:101;36902:6;36899:1;36896:13;36888:101;;;36969:11;;;36963:18;36950:11;;;36943:39;36924:2;36917:10;36888:101;;;37004:6;37001:1;36998:13;36995:2;;;36881:1;37060:6;37055:3;37051:16;37044:27;36995:2;;36865:219;;;:::o;37197:117::-;-1:-1;;;;;33803:54;;37256:35;;37246:2;;37305:1;;37295:12;37321:111;37402:5;33247:13;33240:21;37380:5;37377:32;37367:2;;37423:1;;37413:12;37839:117;-1:-1;;;;;37926:5;33683:46;37901:5;37898:35;37888:2;;37947:1;;37937:12

Swarm Source

ipfs://2f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a6

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

OVERVIEW

Contract of DeFi Saver's MCD Monitor V2

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.