ETH Price: $2,250.50 (+4.92%)

Contract

0xB6e50B658020583ea41B568c8781Cfd77Ed41C18
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Slippage Pro...147584862022-05-12 2:16:071024 days ago1652321767IN
0xB6e50B65...77Ed41C18
0 ETH0.0024018777.42999426
Set Min Ratio147584832022-05-12 2:15:251024 days ago1652321725IN
0xB6e50B65...77Ed41C18
0 ETH0.0019773468.99068896
Keep Min Ratio147552392022-05-11 13:58:581024 days ago1652277538IN
0xB6e50B65...77Ed41C18
0 ETH0.39496854406.20707499
Set Harvest Rese...147481662022-05-10 10:57:431025 days ago1652180263IN
0xB6e50B65...77Ed41C18
0 ETH0.001151429.58323992
Keep Min Ratio147419912022-05-09 10:49:171026 days ago1652093357IN
0xB6e50B65...77Ed41C18
0 ETH0.0610364864
Keep Min Ratio147372812022-05-08 17:04:511027 days ago1652029491IN
0xB6e50B65...77Ed41C18
0 ETH0.0685904472
Set Harvest Rese...147337392022-05-08 3:31:511027 days ago1651980711IN
0xB6e50B65...77Ed41C18
0 ETH0.0009151623.52074467
Keep Min Ratio147238402022-05-06 13:38:201029 days ago1651844300IN
0xB6e50B65...77Ed41C18
0 ETH0.0785493481
Keep Min Ratio147181302022-05-05 15:52:241030 days ago1651765944IN
0xB6e50B65...77Ed41C18
0 ETH0.051262254
Keep Min Ratio147178282022-05-05 14:43:491030 days ago1651761829IN
0xB6e50B65...77Ed41C18
0 ETH0.0911847396
Keep Min Ratio146614132022-04-26 17:17:541039 days ago1650993474IN
0xB6e50B65...77Ed41C18
0 ETH0.0599604961
Keep Min Ratio146070382022-04-18 4:26:551047 days ago1650256015IN
0xB6e50B65...77Ed41C18
0 ETH0.0837898585
Keep Min Ratio145662562022-04-11 19:30:131054 days ago1649705413IN
0xB6e50B65...77Ed41C18
0 ETH0.0598832562
Keep Min Ratio145637442022-04-11 10:01:071054 days ago1649671267IN
0xB6e50B65...77Ed41C18
0 ETH0.0493354652
Keep Min Ratio145354062022-04-06 23:54:321059 days ago1649289272IN
0xB6e50B65...77Ed41C18
0 ETH0.0493354652
Keep Min Ratio145291102022-04-06 0:23:391060 days ago1649204619IN
0xB6e50B65...77Ed41C18
0 ETH0.1318775139
Set Harvest Rese...145051812022-04-02 6:32:421063 days ago1648881162IN
0xB6e50B65...77Ed41C18
0 ETH0.0015193842.06382294
Harvest145051602022-04-02 6:28:521063 days ago1648880932IN
0xB6e50B65...77Ed41C18
0 ETH0.0901500350.28875488
Harvest144529562022-03-25 3:16:471071 days ago1648178207IN
0xB6e50B65...77Ed41C18
0 ETH0.0776892842.72449921
Keep Min Ratio143627362022-03-11 1:57:041086 days ago1646963824IN
0xB6e50B65...77Ed41C18
0 ETH0.0534687957
Keep Min Ratio143569412022-03-10 4:35:451086 days ago1646886945IN
0xB6e50B65...77Ed41C18
0 ETH0.045964449
Set Harvest Rese...143374412022-03-07 3:51:471089 days ago1646625107IN
0xB6e50B65...77Ed41C18
0 ETH0.0009213825.50837761
Set Min Ratio143374382022-03-07 3:51:221089 days ago1646625082IN
0xB6e50B65...77Ed41C18
0 ETH0.0007094124.7518892
Keep Min Ratio142906472022-02-27 21:26:121097 days ago1645997172IN
0xB6e50B65...77Ed41C18
0 ETH0.20888186220
Harvest142724292022-02-25 1:52:061100 days ago1645753926IN
0xB6e50B65...77Ed41C18
0 ETH0.097544654.18193334
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyMakerWBTCV3

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-23
*/

pragma solidity 0.6.12;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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 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);
            }
        }
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

    function safeTransferFrom(IERC20 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.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 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(IERC20 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));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

interface UniswapRouterV2 {
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IController {
    function vaults(address) external view returns (address);

    function devfund() external view returns (address);

    function treasury() external view returns (address);
}

interface IMasterchef {
    function notifyBuybackReward(uint256 _amount) external;
}

// Strategy Contract Basics
abstract contract StrategyBase {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;
    
    // caller whom this strategy trust 
    mapping(address => bool) public benignCallers;

    // Perfomance fee 30% to buyback
    uint256 public performanceFee = 30000;
    uint256 public constant performanceMax = 100000;

    // Withdrawal fee 0.00% to buyback
    // - 0.00% to treasury
    // - 0.00% to dev fund
    uint256 public treasuryFee = 0;
    uint256 public constant treasuryMax = 100000;

    uint256 public devFundFee = 0;
    uint256 public constant devFundMax = 100000;

    // delay yield profit realization
    uint256 public delayBlockRequired = 1000;
    uint256 public lastHarvestBlock;
    uint256 public lastHarvestInWant;

    // buyback ready
    bool public buybackEnabled = true;
    address public mmToken = 0xa283aA7CfBB27EF0cfBcb2493dD9F4330E0fd304;
    address public masterChef = 0xf8873a6080e8dbF41ADa900498DE0951074af577;

    // Tokens
    address public want;
    address public constant weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    // User accounts
    address public governance;
    address public controller;
    address public strategist;
    address public timelock;

    // Dex
    address public univ2Router2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //Sushi
    address public sushiRouter = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    
    // child strategy should emit this event in harvest() implementation
    event Harvest(uint256 _reinvested);

    constructor(
        address _want,
        address _governance,
        address _strategist,
        address _controller,
        address _timelock
    ) public {
        want = _want;
        governance = _governance;
        strategist = _strategist;
        controller = _controller;
        timelock = _timelock;
    }

    // **** Modifiers **** //

    modifier onlyBenevolent {
        // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3074.md#allowing-txorigin-as-signer
        require(msg.sender == governance || msg.sender == strategist);
        _;
    }
    
    modifier onlyBenignCallers {
        require(msg.sender == governance || msg.sender == strategist || benignCallers[msg.sender]);
        _;
    }

    // **** Views **** //

    function balanceOfWant() public view returns (uint256) {
        return IERC20(want).balanceOf(address(this));
    }

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

    function balanceOf() public view returns (uint256) {
        uint256 delayReduction = 0;
        uint256 currentBlock = block.number;
        if (delayBlockRequired > 0 && lastHarvestInWant > 0 && currentBlock.sub(lastHarvestBlock) < delayBlockRequired){
            uint256 diffBlock = lastHarvestBlock.add(delayBlockRequired).sub(currentBlock);
            delayReduction = lastHarvestInWant.mul(diffBlock).mul(1e18).div(delayBlockRequired).div(1e18);
        }
        return balanceOfWant().add(balanceOfPool()).sub(delayReduction);
    }

    function getName() external virtual pure returns (string memory);

    // **** Setters **** //

    function setBenignCallers(address _caller, bool _enabled) external{
        require(msg.sender == governance, "!governance");
        benignCallers[_caller] = _enabled;
    }

    function setDelayBlockRequired(uint256 _delayBlockRequired) external {
        require(msg.sender == governance, "!governance");
        delayBlockRequired = _delayBlockRequired;
    }

    function setDevFundFee(uint256 _devFundFee) external {
        require(msg.sender == timelock, "!timelock");
        devFundFee = _devFundFee;
    }

    function setTreasuryFee(uint256 _treasuryFee) external {
        require(msg.sender == timelock, "!timelock");
        treasuryFee = _treasuryFee;
    }

    function setPerformanceFee(uint256 _performanceFee) external {
        require(msg.sender == timelock, "!timelock");
        performanceFee = _performanceFee;
    }

    function setStrategist(address _strategist) external {
        require(msg.sender == governance, "!governance");
        strategist = _strategist;
    }

    function setGovernance(address _governance) external {
        require(msg.sender == governance, "!governance");
        governance = _governance;
    }

    function setTimelock(address _timelock) external {
        require(msg.sender == timelock, "!timelock");
        timelock = _timelock;
    }

    function setController(address _controller) external {
        require(msg.sender == timelock, "!timelock");
        controller = _controller;
    }

    function setBuybackEnabled(bool _buybackEnabled) external {
        require(msg.sender == governance, "!governance");
        buybackEnabled = _buybackEnabled;
    }

    function setMasterChef(address _masterChef) external {
        require(msg.sender == governance, "!governance");
        masterChef = _masterChef;
    }

    // **** State mutations **** //
    function deposit() public virtual;

    function withdraw(IERC20 _asset) external virtual returns (uint256 balance);

    // Controller only function for creating additional rewards from dust
    function _withdrawNonWantAsset(IERC20 _asset) internal returns (uint256 balance) {
        require(msg.sender == controller, "!controller");
        require(want != address(_asset), "want");
        balance = _asset.balanceOf(address(this));
        _asset.safeTransfer(controller, balance);
    }

    // Withdraw partial funds, normally used with a vault withdrawal
    function withdraw(uint256 _amount) external {
        require(msg.sender == controller, "!controller");
        uint256 _balance = IERC20(want).balanceOf(address(this));
        if (_balance < _amount) {
            _amount = _withdrawSome(_amount.sub(_balance));
            _amount = _amount.add(_balance);
        }
				
        uint256 _feeDev = devFundFee > 0? _amount.mul(devFundFee).div(devFundMax) : 0;
        uint256 _feeTreasury = treasuryFee > 0? _amount.mul(treasuryFee).div(treasuryMax) : 0;

        address _vault = IController(controller).vaults(address(want));

        if (buybackEnabled == true && (_feeDev > 0 || _feeTreasury > 0)) {
            (address _buybackPrinciple, uint256 _buybackAmount) = _convertWantToBuyback(_feeDev.add(_feeTreasury));
            buybackAndNotify(_buybackPrinciple, _buybackAmount);
        } 

        _amount = _feeDev > 0 ? _amount.sub(_feeDev) : _amount;
        _amount = _feeTreasury > 0 ? _amount.sub(_feeTreasury) : _amount;
        IERC20(want).safeTransfer(_vault, _amount);
    }
	
    // buyback MM and notify MasterChef
    function buybackAndNotify(address _buybackPrinciple, uint256 _buybackAmount) internal {
        if (buybackEnabled == true && _buybackAmount > 0) {
            _swapUniswap(_buybackPrinciple, mmToken, _buybackAmount);
            uint256 _mmBought = IERC20(mmToken).balanceOf(address(this));
            IERC20(mmToken).safeTransfer(masterChef, _mmBought);
            IMasterchef(masterChef).notifyBuybackReward(_mmBought);
        }
    }

    // Withdraw all funds, normally used when migrating strategies
    function withdrawAll() external returns (uint256 balance) {
        require(msg.sender == controller, "!controller");
        _withdrawAll();

        balance = IERC20(want).balanceOf(address(this));

        address _vault = IController(controller).vaults(address(want));
        IERC20(want).safeTransfer(_vault, balance);
    }

    function _withdrawAll() internal {
        _withdrawSome(balanceOfPool());
    }

    function _withdrawSome(uint256 _amount) internal virtual returns (uint256);	
	
    // convert LP to buyback principle token
    function _convertWantToBuyback(uint256 _lpAmount) internal virtual returns (address, uint256);

    // each harvest need to update `lastHarvestBlock=block.number` and `lastHarvestInWant=yield profit converted to want for re-invest`
    // add modifier onlyBenignCallers
    function harvest() public virtual;

    // **** Emergency functions ****

    // **** Internal functions ****
	
    function figureOutPath(address _from, address _to, uint256 _amount) public view returns (bool useSushi, address[] memory swapPath){
        address[] memory path;
        address[] memory sushipath;

        path = new address[](2);
        path[0] = _from;
        path[1] = _to;

        sushipath = new address[](2);
        sushipath[0] = _from;
        sushipath[1] = _to;

        uint256 _sushiOut = sushipath.length > 0? UniswapRouterV2(sushiRouter).getAmountsOut(_amount, sushipath)[sushipath.length - 1] : 0;
        uint256 _uniOut = sushipath.length > 0? UniswapRouterV2(univ2Router2).getAmountsOut(_amount, path)[path.length - 1] : 1;

        bool useSushi = _sushiOut > _uniOut? true : false;		
        address[] memory swapPath = useSushi ? sushipath : path;
		
        return (useSushi, swapPath);
    }
	
    function _swapUniswap(
        address _from,
        address _to,
        uint256 _amount
    ) internal {
        if (_amount > 0){
            (bool useSushi, address[] memory swapPath) = figureOutPath(_from, _to, _amount);		
            _swapUniswapWithDetailConfig(_from, _to, _amount, 1, swapPath, (useSushi? sushiRouter : univ2Router2));		
        }
    }
	
    function _swapUniswapWithDetailConfig(
        address _from,
        address _to,
        uint256 _amount,
        uint256 _amountOutMin,
        address[] memory _swapPath,
        address _router
    ) internal {
        if (_amount > 0){			
            IERC20(_from).safeApprove(_router, 0);
            IERC20(_from).safeApprove(_router, _amount);

            UniswapRouterV2(_router).swapExactTokensForTokens(
                _amount,
                _amountOutMin,
                _swapPath,
                address(this),
                now
            );
        }
    }

}

interface AggregatorV3Interface {
  
  function latestRoundData() external view returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
  );

}

interface ManagerLike {
    function ilks(uint256) external view returns (bytes32);
    function owns(uint256) external view returns (address);
    function urns(uint256) external view returns (address);
    function vat() external view returns (address);
    function open(bytes32, address) external returns (uint256);
    function give(uint256, address) external;
    function frob(uint256, int256, int256) external;
    function flux(uint256, address, uint256) external;
    function move(uint256, address, uint256) external;
    function exit(address, uint256, address, uint256) external;
    function quit(uint256, address) external;
    function enter(address, uint256) external;
}

interface VatLike {
    function can(address, address) external view returns (uint256);
    function ilks(bytes32) external view returns (uint256, uint256, uint256, uint256, uint256);
    function dai(address) external view returns (uint256);
    function urns(bytes32, address) external view returns (uint256, uint256);
    function frob(bytes32, address, address, address, int256, int256) external;
    function hope(address) external;
    function move(address, address, uint256) external;
}

interface GemJoinLike {
    function dec() external returns (uint256);
    function join(address, uint256) external payable;
    function exit(address, uint256) external;
}

interface DaiJoinLike {
    function join(address, uint256) external payable;
    function exit(address, uint256) external;
}

interface JugLike {
    function drip(bytes32) external returns (uint256);
}


// Base contract for MakerDAO based DAI-minting strategies
abstract contract StrategyMakerBase is StrategyBase {
    // MakerDAO modules
    address public constant dssCdpManager = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39;
    address public constant daiJoin = 0x9759A6Ac90977b93B58547b4A71c78317f391A28;
    address public constant jug = 0x19c0976f590D67707E62397C87829d896Dc0f1F1;
    address public constant vat = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B;
    address public constant debtToken = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    uint256 public minDebt = 15001000000000000000000;
    address public constant eth_usd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;

    // sub-strategy related constants
    address public collateral;
    uint256 public collateralDecimal = 1e18;
    address public gemJoin;
    address public collateralOracle;
    bytes32 public collateralIlk;
    AggregatorV3Interface internal priceFeed;
    uint256 public collateralPriceDecimal = 1;
    bool public collateralPriceEth = false;
	
    // singleton CDP for this strategy
    uint256 public cdpId = 0;
	
    // configurable minimum collateralization percent this strategy would hold for CDP
    uint256 public minRatio = 150;
    // collateralization percent buffer in CDP debt actions
    uint256 public ratioBuff = 150;
    uint256 public constant ratioBuffMax = 10000;
    uint256 constant RAY = 10 ** 27;

    constructor(
        address _collateralJoin,
        bytes32 _collateralIlk,
        address _collateral,
        uint256 _collateralDecimal,
        address _collateralOracle,
        uint256 _collateralPriceDecimal,
        bool _collateralPriceEth,
        address _want,
        address _governance,
        address _strategist,
        address _controller,
        address _timelock
    )
        public
        StrategyBase(_want, _governance, _strategist, _controller, _timelock)
    {
        require(_want == _collateral, '!mismatchWant');
		
        gemJoin = _collateralJoin;
        collateralIlk = _collateralIlk;		    
        collateral = _collateral;   
        collateralDecimal = _collateralDecimal;
        collateralOracle = _collateralOracle;
        priceFeed = AggregatorV3Interface(collateralOracle);
        collateralPriceDecimal = _collateralPriceDecimal;
        collateralPriceEth = _collateralPriceEth;
    }

    // **** Modifiers **** //
	
    modifier onlyCDPInitiated {        
        require(cdpId > 0, '!noCDP');	
        _;
    }
    
    modifier onlyAboveMinDebt(uint256 _daiAmt) {  
        uint256 debtAmt = getDebtBalance();   
        require((_daiAmt < debtAmt && (debtAmt.sub(_daiAmt) >= minDebt)) || debtAmt <= _daiAmt, '!minDebt');
        _;
    }
	
    function getCollateralBalance() public view returns (uint256) {
        (uint256 ink, ) = VatLike(vat).urns(collateralIlk, ManagerLike(dssCdpManager).urns(cdpId));
        return ink.mul(collateralDecimal).div(1e18);
    }
	
    function getDebtBalance() public view returns (uint256) {
        address urnHandler = ManagerLike(dssCdpManager).urns(cdpId);
        (, uint256 art) = VatLike(vat).urns(collateralIlk, urnHandler);
        (, uint256 rate, , , ) = VatLike(vat).ilks(collateralIlk);
        uint rad = mul(art, rate);
        if (rad == 0) {
            return 0;
        }
        uint256 wad = rad / RAY;
        return mul(wad, RAY) < rad ? wad + 1 : wad;
    }	
    
    function ilkDebts() public view returns(uint256, uint256, bool){
        (uint256 Art, uint256 rate,,uint256 line,) = VatLike(vat).ilks(collateralIlk);
        uint256 currentDebt = Art.mul(rate).div(RAY);
        uint256 maxDebt = line.div(RAY);
        return (currentDebt, maxDebt, maxDebt > currentDebt);
    }

    // **** Getters ****
	
    function balanceOfPool() public override view returns (uint256){
        return getCollateralBalance();
    }

    function collateralValue(uint256 collateralAmt) public view returns (uint256){
        uint256 collateralPrice = getLatestCollateralPrice();
        return collateralAmt.mul(collateralPrice).mul(1e18).div(collateralDecimal).div(collateralPriceDecimal);
    }

    function currentRatio() public view returns (uint256) {	
        uint256 _collateral = cdpId > 0? getCollateralBalance() : 0;
        if (_collateral > 0){
            uint256 collateralAmt = collateralValue(_collateral).mul(100);
            uint256 debtAmt = getDebtBalance();		
            return collateralAmt.div(debtAmt);
        }else{
            return 0;
        }
    } 
    
    // if borrow is true (for lockAndDraw): return (maxDebt - currentDebt) if positive value, otherwise return 0
    // if borrow is false (for redeemAndFree): return (currentDebt - maxDebt) if positive value, otherwise return 0
    function calculateDebtFor(uint256 collateralAmt, bool borrow) public view returns (uint256) {
        uint256 maxDebt = collateralAmt > 0? collateralValue(collateralAmt).mul(ratioBuffMax).div(_getBufferedMinRatio(ratioBuffMax)) : 0;
		
        uint256 debtAmt = getDebtBalance();
		
        uint256 debt = 0;
        
        if (borrow && maxDebt >= debtAmt){
            debt = maxDebt.sub(debtAmt);
        } else if (!borrow && debtAmt >= maxDebt){
            debt = debtAmt.sub(maxDebt);
        }
        
        return (debt > 0)? debt : 0;
    }
	
    function _getBufferedMinRatio(uint256 _multiplier) internal view returns (uint256){
        return _multiplier.mul(minRatio).mul(ratioBuffMax.add(ratioBuff)).div(ratioBuffMax).div(100);
    }

    function borrowableDebt() public view returns (uint256) {
        uint256 collateralAmt = getCollateralBalance();
        return calculateDebtFor(collateralAmt, true);
    }

    function requiredPaidDebt(uint256 _redeemCollateralAmt) public view returns (uint256) {
        uint256 totalCollateral = getCollateralBalance();
        uint256 collateralAmt = _redeemCollateralAmt >= totalCollateral? 0 : totalCollateral.sub(_redeemCollateralAmt);
        return calculateDebtFor(collateralAmt, false);
    }

    // **** sub-strategy implementation ****
    function _convertWantToBuyback(uint256 _lpAmount) internal virtual override returns (address, uint256);
	
    function _depositDAI(uint256 _daiAmt) internal virtual;
	
    function _withdrawDAI(uint256 _daiAmt) internal virtual;
	
    // **** Oracle (using chainlink) ****
	
    function getLatestCollateralPrice() public view returns (uint256){
        require(collateralOracle != address(0), '!_collateralOracle');	
        (
            uint80 roundID, 
            int price,
            uint startedAt,
            uint timeStamp,
            uint80 answeredInRound
        ) = priceFeed.latestRoundData();
		
        if (price > 0){		
            int ethPrice = 1;
            if (collateralPriceEth){
               (,ethPrice,,,) = AggregatorV3Interface(eth_usd).latestRoundData();			
            }
            return uint256(price).mul(collateralPriceDecimal).mul(uint256(ethPrice)).div(1e8).div(collateralPriceEth? 1e18 : 1);
        } else{
            return 0;
        }
    }

    // **** Setters ****
 
    function setMinDebt(uint256 _minDebt) external onlyBenevolent {
        minDebt = _minDebt;
    }	
 
    function setMinRatio(uint256 _minRatio) external onlyBenevolent {
        minRatio = _minRatio;
    }	
	
    function setRatioBuff(uint256 _ratioBuff) external onlyBenevolent {
        ratioBuff = _ratioBuff;
    }
	
    // **** MakerDAO CDP actions ****

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "mul-overflow");
    }
	
    function toRad(uint256 wad) internal pure returns (uint256 rad) {
        rad = mul(wad, RAY);
    }
	
    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "sub-overflow");
    }
	
    function toInt(uint256 x) internal pure returns (int256 y) {
        y = int256(x);
        require(y >= 0, "int-overflow");
    }
	
    function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) {
        wad = mul(amt, 10 ** (18 - GemJoinLike(gemJoin).dec()));
    }
	
    function _getDrawDart(address vat, address jug, address urn, bytes32 ilk, uint wad) internal returns (int256 dart) {
        uint256 rate = JugLike(jug).drip(ilk);
        uint256 dai = VatLike(vat).dai(urn);
        if (dai < toRad(wad)) {
            dart = toInt(sub(toRad(wad), dai).div(rate));
            dart = mul(uint256(dart), rate) < toRad(wad) ? dart + 1 : dart;
        }
    }
	
    function _getWipeDart(address vat, uint dai, address urn, bytes32 ilk) internal view returns (int256 dart) {
        (, uint256 rate,,,) = VatLike(vat).ilks(ilk);
        (, uint256 art) = VatLike(vat).urns(ilk, urn);
        dart = toInt(dai.div(rate));
        dart = uint256(dart) <= art ? - dart : - toInt(art);
    }
	
    function openCDP() external onlyBenevolent{
        require(cdpId <= 0, "!cdpAlreadyOpened");
		
        cdpId = ManagerLike(dssCdpManager).open(collateralIlk, address(this));		
		
        IERC20(collateral).approve(gemJoin, uint256(-1));
        IERC20(debtToken).approve(daiJoin, uint256(-1));
    }
	
    function getUrnVatIlk() internal returns (address, address, bytes32){
        return (ManagerLike(dssCdpManager).urns(cdpId), ManagerLike(dssCdpManager).vat(), ManagerLike(dssCdpManager).ilks(cdpId));
    }
	
    function addCollateralAndBorrow(uint256 _collateralAmt, uint256 _daiAmt) internal onlyCDPInitiated {   
        require(_daiAmt.add(getDebtBalance()) >= minDebt, '!minDebt');
        (address urn, address vat, bytes32 ilk) = getUrnVatIlk();		
		GemJoinLike(gemJoin).join(urn, _collateralAmt);  
		ManagerLike(dssCdpManager).frob(cdpId, toInt(convertTo18(gemJoin, _collateralAmt)), _getDrawDart(vat, jug, urn, ilk, _daiAmt));
		ManagerLike(dssCdpManager).move(cdpId, address(this), toRad(_daiAmt));
        if (VatLike(vat).can(address(this), address(daiJoin)) == 0) {
            VatLike(vat).hope(daiJoin);
        }
        DaiJoinLike(daiJoin).exit(address(this), _daiAmt);
    } 
	
    function repayAndRedeemCollateral(uint256 _collateralAmt, uint _daiAmt) internal onlyCDPInitiated onlyAboveMinDebt(_daiAmt) { 
        (address urn, address vat, bytes32 ilk) = getUrnVatIlk();
        if (_daiAmt > 0){
            DaiJoinLike(daiJoin).join(urn, _daiAmt);
        }
        uint256 wad18 = _collateralAmt > 0? convertTo18(gemJoin, _collateralAmt) : 0;
        ManagerLike(dssCdpManager).frob(cdpId, -toInt(wad18),  _getWipeDart(vat, VatLike(vat).dai(urn), urn, ilk));
        if (_collateralAmt > 0){
            ManagerLike(dssCdpManager).flux(cdpId, address(this), wad18);
            GemJoinLike(gemJoin).exit(address(this), _collateralAmt);
        }
    } 

    // **** State Mutation functions ****
	
    function keepMinRatio() external onlyBenignCallers {		
        uint256 requiredPaidback = requiredPaidDebt(0);
        if (requiredPaidback > 0){
            _withdrawDAI(requiredPaidback);
            uint256 wad = IERC20(debtToken).balanceOf(address(this));
            require(wad >= requiredPaidback, '!keepMinRatioRedeem');
			
            repayAndRedeemCollateral(0, requiredPaidback);
            uint256 goodRatio = currentRatio();
            require(goodRatio >= minRatio.sub(1), '!stillBelowMinRatio');
        }
    }
	
    function deposit() public override {
        uint256 _want = balanceOfWant();
        (,,bool roomForNewMint) = ilkDebts();
        if (_want > 0 && roomForNewMint) {	
            uint256 _newDebt = calculateDebtFor(_want.add(getCollateralBalance()), true);
            if(_newDebt > 0 && _newDebt.add(getDebtBalance()) >= minDebt){
               addCollateralAndBorrow(_want, _newDebt);
               uint256 wad = IERC20(debtToken).balanceOf(address(this));
               _depositDAI(_newDebt > wad? wad : _newDebt);
            }
        }
    }

    function _withdrawSome(uint256 _amount) internal override returns (uint256) {
        bool _full = _amount >= getCollateralBalance();
        
        if (_full && _amount > 0){
            _withdrawDAI(uint256(-1));
            uint256 _debtOwe = getDebtBalance();
            require(IERC20(debtToken).balanceOf(address(this)) >= _debtOwe, '!mismatchAfterWithdrawAll');	
            repayAndRedeemCollateral(_amount, _debtOwe);
        } else{
            uint256 requiredPaidback = requiredPaidDebt(_amount);
            if (requiredPaidback > 0){
                _withdrawDAI(requiredPaidback);
                require(IERC20(debtToken).balanceOf(address(this)) >= requiredPaidback, '!mismatchAfterWithdraw');			
            }
            repayAndRedeemCollateral(_amount, requiredPaidback);		
        }		
        
        return _amount;
    }
    
}

// for Curve LP staking mining
interface ICvxBaseRewardPool {
    function getReward(address _account, bool _claimExtras) external returns(bool);
    function earned(address account) external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool);
    function pid() external view returns (uint256);
}

// for Curve LP staking
interface ICvxBooster {
    function depositAll(uint256 _pid, bool _stake) external returns(bool);
    function withdraw(uint256 _pid, uint256 _amount) external returns(bool);
    function withdrawAll(uint256 _pid) external returns(bool);
}

interface ICurveZap_4 {
    function calc_withdraw_one_coin(address _pool, uint256 _token_amount, int128 i) external view returns (uint256);
    function add_liquidity(address _pool, uint256[4] calldata _deposit_amounts, uint256 _min_mint_amount) external;
    function remove_liquidity_one_coin(address _pool, uint256 _burn_amount, int128 i, uint256 _min_amount) external;
    function calc_token_amount(address _pool, uint256[4] calldata _amounts, bool _is_deposit) external view returns (uint256);
}

interface ICurveFi_3 {
    function exchange(int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount) external;
    function get_virtual_price() external view returns (uint256);
}

interface ICurveFi_2 {
    function get_virtual_price() external view returns (uint256);
}

contract StrategyMakerWBTCV3 is StrategyMakerBase {
    // strategy specific: https://github.com/makerdao/mcd-changelog	
    address public wbtc_collateral = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599;
    address public link_btc_usd = 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c;
    uint256 public wbtc_collateral_decimal = 1e8;
    bytes32 public wbtc_ilk = "WBTC-A";
    address public wbtc_apt = 0xBF72Da2Bd84c5170618Fbe5914B0ECA9638d5eb5;
    uint256 public constant wbtc_price_decimal = 1;
    bool public constant wbtc_price_eth = false;
    
    address public constant curve3crvPool = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7;
		
    // convex staking constants
    address public stakingPool = 0xF403C135812408BFbE8713b5A23a04b3D48AAE31;
    address public constant rewardTokenCRV = 0xD533a949740bb3306d119CC777fa900bA034cd52; 
    address public constant rewardTokenCVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B;
    address public constant curveZap = 0xA79828DF1850E8a3A3064576f380D90aECDD3359;
    
    // convex staking configurable
    uint256 public stakingPoolId = 59;//ust-worm
    address public rewardPool = 0x7e2b9B5244bcFa5108A76D5E7b507CFD5581AD4A;//ust-worm
	
    // curve LP configurable
    address public curvePool = 0xCEAF7747579696A2F0bb206a14210e3c9e6fB269;
    address public curveLpToken = 0xCEAF7747579696A2F0bb206a14210e3c9e6fB269;
		
    // slippage protection for one-sided ape in/out
    uint256 public harvestReserveDebt = 2500; // reserved for debt repayment
    uint256 public harvestReserveIL = 2500; // reserved for LP IL
    uint256 public harvestReserve = 5000; 
    uint256 public removeLiquidityBuffer = 300; // remove liquidity buffer
    uint256 public slippageProtectionIn = 50; // max 0.5%
    uint256 public slippageProtectionOut = 50; // max 0.5%
    uint256 public constant DENOMINATOR = 10000;

    constructor(address _governance, address _strategist, address _controller, address _timelock) 
        public StrategyMakerBase(
            wbtc_apt,
            wbtc_ilk,
            wbtc_collateral,
            wbtc_collateral_decimal,			
            link_btc_usd,
            wbtc_price_decimal,
            wbtc_price_eth,
            wbtc_collateral,
            _governance,
            _strategist,
            _controller,
            _timelock
        )
    {
        IERC20(debtToken).safeApprove(curveZap, uint256(-1));
        _setupPoolApprovals(); 	
    }
	
    // **** Setters ****
    
    function setSlippageProtection(uint256 _in, uint256 _out) public onlyBenevolent{
        slippageProtectionIn = _in;
        slippageProtectionOut = _out;
    }
    
    function setHarvestReserves(uint256 _debtReserve, uint256 _ilReserve) public onlyBenevolent{
        harvestReserveDebt = _debtReserve;
        harvestReserveIL = _ilReserve;
        harvestReserve = harvestReserveDebt.add(harvestReserveIL);
    }
    
    function setRemoveLiquidityBuffer(uint256 _rlpBuffer) public onlyBenevolent{
        removeLiquidityBuffer = _rlpBuffer;
    }
	
    // **** State Mutation functions ****
    
    function _setupPoolApprovals() internal {
        IERC20(curveLpToken).safeApprove(curveZap, 0);
        IERC20(curveLpToken).safeApprove(curveZap, uint256(-1));
        
        IERC20(curveLpToken).safeApprove(stakingPool, 0); 
        IERC20(curveLpToken).safeApprove(stakingPool, uint256(-1)); 
    }
    
    function migratePool(address _newCurvePool, address _newCurveLp, address _newConvexPool) public {
        require(msg.sender == timelock, '!timelock');
        
        // withdraw all debt token if needed
        if (ICvxBaseRewardPool(rewardPool).balanceOf(address(this)) > 0){
            _withdrawDAI(uint256(-1));
            require(ICvxBaseRewardPool(rewardPool).balanceOf(address(this)) == 0, '!stillGotSomeInConvex');
            require(IERC20(curveLpToken).balanceOf(address(this)) == 0, '!stillGotSomeInCurve');
        }
	    
        // migrate to new destination
        curvePool = _newCurvePool;
        curveLpToken = _newCurveLp;
        rewardPool = _newConvexPool;
        stakingPoolId = ICvxBaseRewardPool(rewardPool).pid();
        
        // setup for new pool
        _setupPoolApprovals(); 
        
        // reinvest to new pool
        _depositDAI(IERC20(debtToken).balanceOf(address(this)));
    }
	
    function harvest() public override onlyBenevolent {
        // Collects reward tokens
        ICvxBaseRewardPool(rewardPool).getReward(address(this), true);
		
        uint256 _rewardCRV = IERC20(rewardTokenCRV).balanceOf(address(this));
        uint256 _rewardCVX = IERC20(rewardTokenCVX).balanceOf(address(this));

        if (_rewardCRV > 0) {
            _convertWithSushi(rewardTokenCRV, weth, _rewardCRV);
        }

        if (_rewardCVX > 0) {
            _convertWithSushi(rewardTokenCVX, weth, _rewardCVX);
        }
		
        uint256 _wethAmount = IERC20(weth).balanceOf(address(this));
        if (_wethAmount > 0){
            // repay debt
            uint256 _debtBal = IERC20(debtToken).balanceOf(address(this));
            _convertWithSushi(weth, debtToken, _wethAmount.mul(harvestReserve).div(DENOMINATOR));
            uint256 _debtBalAfter= IERC20(debtToken).balanceOf(address(this));
            repayAndRedeemCollateral(0, (_debtBalAfter.sub(_debtBal)).mul(harvestReserveDebt).div(harvestReserve));
            
            // Buyback and Reinvest
            if (buybackEnabled == true){
                uint256 _buybackLpAmount = _wethAmount.mul(performanceFee).div(performanceMax);
                buybackAndNotify(weth, _buybackLpAmount);
            }
             
            _swapUniswap(weth, want, IERC20(weth).balanceOf(address(this)));
            uint256 _wantBal = balanceOfWant();
            if (_wantBal > 0){
                lastHarvestBlock = block.number;
                lastHarvestInWant = _wantBal;
                deposit();	
                emit Harvest(_wantBal);
            }
        }
    }
    
    function _convertWithSushi(address _from, address _to, uint256 _inAmt) internal {
        address[] memory _swapPath = new address[](2);
        _swapPath[0] = _from;
        _swapPath[1] = _to;
        _swapUniswapWithDetailConfig(_from, _to, _inAmt, 1, _swapPath, sushiRouter);
    }
	
    function _convertWantToBuyback(uint256 _lpAmount) internal override returns (address, uint256){
        if (_lpAmount <= 0){
            return (weth, 0);
        }		
        _swapUniswap(want, weth, _lpAmount);		
        return (weth, IERC20(weth).balanceOf(address(this)));
    }
	
    function _depositDAI(uint256 _daiAmt) internal override{
        uint256 _debt = IERC20(debtToken).balanceOf(address(this));
        if (_debt == 0){
            return;
        }
        
        uint256 _debtAmt = IERC20(debtToken).balanceOf(address(this));
        uint256 _expectedOut = estimateRequiredLP(_debtAmt);
        uint256 _maxSlip = _expectedOut.mul(DENOMINATOR.sub(slippageProtectionIn)).div(DENOMINATOR);
        if (_debtAmt > 0 && checkDepositSlip(_debtAmt, _maxSlip)) {
            uint256[4] memory amounts = [0, _debtAmt, 0, 0];
            ICurveZap_4(curveZap).add_liquidity(curvePool, amounts, _maxSlip);
        }
		
        uint256 _lpAmt = IERC20(curveLpToken).balanceOf(address(this));
        require(_lpAmt > 0, "!_lpAmt");
        ICvxBooster(stakingPool).depositAll(stakingPoolId, true);
    }
	
    function _withdrawDAI(uint256 _daiAmt) internal override{
        if (_daiAmt == 0){
            return;
        } else if(_daiAmt >= uint256(-1)){            
            ICvxBaseRewardPool(rewardPool).withdrawAndUnwrap(ICvxBaseRewardPool(rewardPool).balanceOf(address(this)), false);
            _removeLpFromCurve(IERC20(curveLpToken).balanceOf(address(this)));
            return;
        }
	    
        uint256 requiredLP = estimateRequiredLP(_daiAmt);
        requiredLP = requiredLP.mul(DENOMINATOR.add(removeLiquidityBuffer)).div(DENOMINATOR);// try to remove bit more
		
        uint256 _lpAmount = IERC20(curveLpToken).balanceOf(address(this));
        uint256 _withdrawFromStaking = _lpAmount < requiredLP? requiredLP.sub(_lpAmount) : 0;
			
        if (_withdrawFromStaking > 0){
            uint256 maxInStaking = ICvxBaseRewardPool(rewardPool).balanceOf(address(this));
            uint256 _toWithdraw = maxInStaking < _withdrawFromStaking? maxInStaking : _withdrawFromStaking;		
            ICvxBaseRewardPool(rewardPool).withdrawAndUnwrap(_toWithdraw, false);			
        }
		    	
        _removeLpFromCurve(requiredLP);
    }
	
    function _removeLpFromCurve(uint256 requiredLP) internal{	
        uint256 _lpAmount = IERC20(curveLpToken).balanceOf(address(this));
        if (_lpAmount > 0){
            requiredLP = requiredLP > _lpAmount?  _lpAmount : requiredLP;
            uint256 maxSlippage = requiredLP.mul(DENOMINATOR.sub(slippageProtectionOut)).div(DENOMINATOR);
            ICurveZap_4(curveZap).remove_liquidity_one_coin(curvePool, requiredLP, 1, maxSlippage);
        }
    }

    // Controller only function for creating additional rewards from dust
    function withdraw(IERC20 _asset) external override returns (uint256 balance) {
        require(address(_asset) != curveLpToken, '!curveLpToken');
        _withdrawNonWantAsset(_asset);
    }

    // **** Views ****
	
    function balanceOfDebtToken() public view returns (uint256){
        uint256 lpAmt = ICvxBaseRewardPool(rewardPool).balanceOf(address(this));
        lpAmt = lpAmt.add(IERC20(curveLpToken).balanceOf(address(this)));
        return IERC20(debtToken).balanceOf(address(this)).add(crvLPToDebt(lpAmt));
    }
	
    function virtualPriceToDebt() public view returns (uint256) {
        return ICurveFi_2(curvePool).get_virtual_price().mul(ICurveFi_3(curve3crvPool).get_virtual_price()).div(1e18);
    }
	
    function estimateRequiredLP(uint256 _debtAmt) public view returns (uint256) {
        return _debtAmt.mul(1e18).div(virtualPriceToDebt());
    }
	
    function checkDepositSlip(uint256 _debtAmt, uint256 _maxSlip) public view returns (bool){
        uint256[4] memory amounts = [0, _debtAmt, 0, 0];
        return ICurveZap_4(curveZap).calc_token_amount(curvePool, amounts, true) >= _maxSlip;
    }
	
    function crvLPToDebt(uint256 _lpAmount) public view returns (uint256) {
        if (_lpAmount == 0){
            return 0;
        }
        uint256 virtualOut = virtualPriceToDebt().mul(_lpAmount).div(1e18);
        return virtualOut; 
    }

    // only include CRV earned
    function getHarvestable() public view returns (uint256) {
        return ICvxBaseRewardPool(rewardPool).earned(address(this));
    }

    function getName() external override pure returns (string memory) {
        return "StrategyMakerWBTCV3";
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_reinvested","type":"uint256"}],"name":"Harvest","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfDebtToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"benignCallers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowableDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"},{"internalType":"bool","name":"borrow","type":"bool"}],"name":"calculateDebtFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdpId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtAmt","type":"uint256"},{"internalType":"uint256","name":"_maxSlip","type":"uint256"}],"name":"checkDepositSlip","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralIlk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralPriceDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralPriceEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"}],"name":"collateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpAmount","type":"uint256"}],"name":"crvLPToDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve3crvPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveLpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curvePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveZap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBlockRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dssCdpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtAmt","type":"uint256"}],"name":"estimateRequiredLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth_usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"figureOutPath","outputs":[{"internalType":"bool","name":"useSushi","type":"bool"},{"internalType":"address[]","name":"swapPath","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDebtBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestCollateralPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReserveDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReserveIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilkDebts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jug","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastHarvestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestInWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"link_btc_usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newCurvePool","type":"address"},{"internalType":"address","name":"_newCurveLp","type":"address"},{"internalType":"address","name":"_newConvexPool","type":"address"}],"name":"migratePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mmToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openCDP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuffMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLiquidityBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redeemCollateralAmt","type":"uint256"}],"name":"requiredPaidDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenCRV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenCVX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBenignCallers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_buybackEnabled","type":"bool"}],"name":"setBuybackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delayBlockRequired","type":"uint256"}],"name":"setDelayBlockRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFundFee","type":"uint256"}],"name":"setDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtReserve","type":"uint256"},{"internalType":"uint256","name":"_ilReserve","type":"uint256"}],"name":"setHarvestReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"}],"name":"setMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minDebt","type":"uint256"}],"name":"setMinDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minRatio","type":"uint256"}],"name":"setMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratioBuff","type":"uint256"}],"name":"setRatioBuff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rlpBuffer","type":"uint256"}],"name":"setRemoveLiquidityBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"setSlippageProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageProtectionIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slippageProtectionOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualPriceToDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_apt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_collateral_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_price_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_price_eth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

608060405261753060019081556000600281905560038190556103e86004556007805474a283aa7cfbb27ef0cfbcb2493dd9f4330e0fd30400610100600160a81b031960ff1992831686171617909155600880546001600160a01b031990811673f8873a6080e8dbf41ada900498de0951074af57717909155600e80548216737a250d5630b4cf539739df2c5dacb4c659f2488d179055600f8054821673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f17905569032d34b1e54bb2c40000601055670de0b6b3a76400006012556017939093556018805490911690556019556096601a819055601b55601c80548216732260fac5e5542a773aa44fbcfedf7c193bc2c599179055601d8054821673f4030086522a5beea4988f8ca5b36dbc97bee88c1790556305f5e100601e5565574254432d4160d01b601f5560208054821673bf72da2bd84c5170618fbe5914b0eca9638d5eb517905560218054821673f403c135812408bfbe8713b5a23a04b3d48aae31179055603b602255602380548216737e2b9b5244bcfa5108a76d5e7b507cfd5581ad4a17905560248054821673ceaf7747579696a2f0bb206a14210e3c9e6fb269908117909155602580549092161790556109c4602681905560275561138860285561012c6029556032602a819055602b55348015620001f357600080fd5b50604051620066ef380380620066ef833981810160405260808110156200021957600080fd5b50805160208083015160408401516060909401518254601f54601c54601e54601d54600980546001600160a01b03199081166001600160a01b03958616908117909255600a8054868d16908316179055600c8054868b16908316179055600b8054868e16908316179055600d8054868a1690831617905560138054821697861697909717909655601594909455601180548616909417909355601255601480548416928216929092179182905560168054909316911617905560016017556018805460ff191690559293909290916200032b90736b175474e89094c44da98b954eedeac495271d0f9073a79828df1850e8a3a3064576f380d90aecdd33599060001990620039d76200033f821b17901c565b6200033562000463565b50505050620007fa565b801580620003c9575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200039957600080fd5b505afa158015620003ae573d6000803e3d6000fd5b505050506040513d6020811015620003c557600080fd5b5051155b620004065760405162461bcd60e51b8152600401808060200182810382526036815260200180620066b96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200045e9185916200053316565b505050565b6025546200049d906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006200033f602090811b620039d717901c565b602554620004d8906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196200033f602090811b620039d717901c565b60215460255462000504916001600160a01b03918216911660006200033f602090811b620039d717901c565b60215460255462000531916001600160a01b0391821691166000196200033f602090811b620039d717901c565b565b60606200058f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620005ef60201b62003aea179092919060201c565b8051909150156200045e57808060200190516020811015620005b057600080fd5b50516200045e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806200668f602a913960400191505060405180910390fd5b606062000600848460008562000608565b949350505050565b60606200061585620007c0565b62000667576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620006a85780518252601f19909201916020918201910162000687565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146200070c576040519150601f19603f3d011682016040523d82523d6000602084013e62000711565b606091505b5091509150811562000727579150620006009050565b805115620007385780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007845781810151838201526020016200076a565b50505050905090810190601f168015620007b25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000600575050151592915050565b615e85806200080a6000396000f3fe608060405234801561001057600080fd5b50600436106106595760003560e01c806386d8745b11610351578063b635b8ae116101c3578063d8dfeb451161010f578063eb319441116100ad578063f17336d711610087578063f17336d714610d83578063f6ff935214610d8b578063f77c479114610db0578063f8d8989814610db857610659565b8063eb31944114610d56578063ec029a4414610d5e578063ef55105014610d7b57610659565b8063e13f8513116100e9578063e13f851314610ce3578063e3a58e1814610d09578063e420557614610d26578063e4c01d3714610d4e57610659565b8063d8dfeb4514610ccb578063df1b27ac14610cd3578063e0c9cf0614610cdb57610659565b8063c7b9d5301161017c578063cc32d17611610156578063cc32d17614610cab578063d0e30db014610cb3578063d33219b414610cbb578063d89281e814610cc357610659565b8063c7b9d53014610c75578063c90b65de14610c9b578063c954e5cc14610ca357610659565b8063b635b8ae14610c0c578063b78e0c5a14610c14578063b9e3748914610c37578063bdacb30314610c3f578063c11645bc14610c65578063c1a3d44c14610c6d57610659565b8063a0e2c3411161029d578063a8e879951161023b578063ab43be7111610215578063ab43be7114610bec578063af4f170514610bf4578063b0fd087114610bfc578063b131da4014610c0457610659565b8063a8e8799514610b2b578063aa87484c14610b33578063ab033ea914610bc657610659565b8063a36f063e11610277578063a36f063e14610b0b578063a46c850514610b13578063a6d09de614610b1b578063a890dd9014610b2357610659565b8063a0e2c34114610aa5578063a217d5ce14610add578063a2d9f4dc14610ae557610659565b80639658e68f1161030a5780639a9b567d116102e45780639a9b567d14610a535780639aa5f0d214610a725780639ac9752c14610a955780639d1e73cb14610a9d57610659565b80639658e68f14610a26578063981879a614610a2e5780639868607c14610a3657610659565b806386d8745b146109e057806387788782146109e85780638ce47ff0146109f0578063918f86741461086957806392eefe9b146109f857806394d0737b14610a1e57610659565b80633fc8cef3116104ea5780635ffe27b41161043657806370897b23116103d45780637b756553116103ae5780637b756553146109c85780637cc79113146106e357806384718d89146109d0578063853828b6146109d857610659565b806370897b2314610986578063722713f7146109a357806377e741c7146109ab57610659565b80636480b8ad116104105780636480b8ad1461095157806366666aa9146109595780636765d6fb146109615780636d13582c1461097e57610659565b80635ffe27b4146109095780636234dc211461092c578063646780df1461094957610659565b806351cff8d9116104a3578063596b93e41161047d578063596b93e4146108d45780635aa6e675146108f15780635ccbbdf1146108f95780635d1583501461090157610659565b806351cff8d91461089e578063561c20dc146108c4578063575a86b2146108cc57610659565b80633fc8cef31461085957806344015ed41461086157806345d3bdff146108695780634641257d14610871578063475411ab146108795780634a1a066b1461089657610659565b8063160d0da5116105a9578063218751b21161056257806331e635c81161053c57806331e635c8146108135780633203d5611461081b57806335eb11861461084957806336569e771461085157610659565b8063218751b2146107e65780632e1a7d4d146107ee5780632eba33f61461080b57610659565b8063160d0da51461071857806317d7de7c1461073457806319ec5df5146107b15780631ba89442146107ce5780631f1fcd51146107d65780631fe4a686146107de57610659565b8063115880861161061657806314a1fe02116105f057806314a1fe02146106e357806314b74d9a146106eb57806314e6ac09146106f35780631529a6391461071057610659565b806311588086146106d35780631378e347146106db57806313bd4b95146106e357610659565b806301664f661461065e5780630547104d14610682578063057d66a21461069c5780630872b81d146106a457806308d50063146106ac5780630c56ae3b146106cb575b600080fd5b610666610dc0565b604080516001600160a01b039092168252519081900360200190f35b61068a610dcf565b60408051918252519081900360200190f35b61068a610e4a565b610666610e68565b6106c9600480360360208110156106c257600080fd5b5035610e80565b005b610666610eb1565b61068a610ec0565b61068a610ecf565b61068a610ed5565b61068a610edc565b6106c96004803603602081101561070957600080fd5b5035610ee2565b61068a610f32565b61072061107b565b604080519115158252519081900360200190f35b61073c611084565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561077657818101518382015260200161075e565b50505050905090810190601f1680156107a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61068a600480360360208110156107c757600080fd5b50356110b1565b61068a6110d8565b6106666110de565b6106666110ed565b6106666110fc565b6106c96004803603602081101561080457600080fd5b503561110b565b61068a61137c565b610666611382565b6106c96004803603604081101561083157600080fd5b506001600160a01b0381351690602001351515611391565b61068a611409565b61066661140e565b610666611426565b61068a61143e565b61068a6115ca565b6106c96115d0565b61068a6004803603602081101561088f57600080fd5b5035611b2f565b61068a611b6e565b61068a600480360360208110156108b457600080fd5b50356001600160a01b0316611b74565b610720611bd9565b610666611bde565b61068a600480360360208110156108ea57600080fd5b5035611bed565b610666611c2b565b61068a611c3a565b61068a611e4a565b6106c96004803603604081101561091f57600080fd5b5080359060200135611e50565b6106c96004803603602081101561094257600080fd5b5035611e87565b610666611eb8565b610666611ec7565b610666611edf565b6106c96004803603602081101561097757600080fd5b5035611eee565b610666611f1f565b6106c96004803603602081101561099c57600080fd5b5035611f2e565b61068a611f7e565b6106c9600480360360208110156109c157600080fd5b5035612037565b61068a612087565b61066661208d565b61068a6120a5565b61068a612214565b61068a61221a565b61068a612220565b6106c960048036036020811015610a0e57600080fd5b50356001600160a01b0316612226565b6106c9612293565b61068a612431565b610666612437565b61068a60048036036020811015610a4c57600080fd5b503561244f565b6106c960048036036020811015610a6957600080fd5b50351515612478565b61072060048036036040811015610a8857600080fd5b50803590602001356124d8565b6106c96125ef565b61066661280d565b6106c960048036036060811015610abb57600080fd5b506001600160a01b03813581169160208101358216916040909101351661281c565b610666612b9f565b6106c960048036036020811015610afb57600080fd5b50356001600160a01b0316612bae565b61068a612c1d565b61068a612e12565b610720612e18565b610666612e21565b61068a612e35565b610b6960048036036060811015610b4957600080fd5b506001600160a01b03813581169160208101359091169060400135612e3b565b60405180831515815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bb1578181015183820152602001610b99565b50505050905001935050505060405180910390f35b6106c960048036036020811015610bdc57600080fd5b50356001600160a01b031661326e565b6106666132dd565b61068a6132f5565b6106666132fb565b61068a613313565b61068a613373565b6106c960048036036040811015610c2a57600080fd5b5080359060200135613379565b6106666133c0565b6106c960048036036020811015610c5557600080fd5b50356001600160a01b03166133cf565b61066661343c565b61068a613454565b6106c960048036036020811015610c8b57600080fd5b50356001600160a01b031661349f565b61068a61350e565b61068a613514565b61068a613615565b6106c961361b565b610666613733565b610666613742565b61066661375a565b610666613769565b61068a613778565b61072060048036036020811015610cf957600080fd5b50356001600160a01b031661377e565b6106c960048036036020811015610d1f57600080fd5b5035613793565b610d2e6137e5565b604080519384526020840192909252151582820152519081900360600190f35b61068a6138d0565b61068a6138d6565b6106c960048036036020811015610d7457600080fd5b50356138dc565b61068a61390d565b61068a613913565b61068a60048036036040811015610da157600080fd5b50803590602001351515613919565b6106666139b6565b6106666139c5565b6013546001600160a01b031681565b602354604080516246613160e11b815230600482015290516000926001600160a01b031691628cc262916024808301926020929190829003018186803b158015610e1857600080fd5b505afa158015610e2c573d6000803e3d6000fd5b505050506040513d6020811015610e4257600080fd5b505190505b90565b600080610e55610f32565b9050610e62816001613919565b91505090565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600a546001600160a01b0316331480610ea35750600c546001600160a01b031633145b610eac57600080fd5b602955565b6021546001600160a01b031681565b6000610eca610f32565b905090565b60295481565b620186a081565b60055481565b600d546001600160a01b03163314610f2d576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600355565b6000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316632424be5c601554735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301528051604480840193829003018186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d604081101561105457600080fd5b5051601254909150610e6290670de0b6b3a764000090611075908490613af9565b90613b52565b60075460ff1681565b60408051808201909152601381527253747261746567794d616b657257425443563360681b602082015290565b60006110d06110be613514565b61107584670de0b6b3a7640000613af9565b90505b919050565b60125481565b6009546001600160a01b031681565b600c546001600160a01b031681565b6024546001600160a01b031681565b600b546001600160a01b03163314611158576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50519050818110156111fa576111eb6111e68383613b94565b613bd6565b91506111f78282613de1565b91505b6000806003541161120c576000611228565b611228620186a061107560035486613af990919063ffffffff16565b90506000806002541161123c576000611258565b611258620186a061107560025487613af990919063ffffffff16565b600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505160075490915060ff16151560011480156112fe575060008311806112fe5750600082115b15611329576000806113186113138686613de1565b613e3b565b915091506113268282613f1b565b50505b600083116113375784611341565b6113418584613b94565b945060008211611351578461135b565b61135b8583613b94565b600954909550611375906001600160a01b0316828761405f565b5050505050565b601e5481565b601d546001600160a01b031681565b600a546001600160a01b031633146113de576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b600181565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b602354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561148e57600080fd5b505afa1580156114a2573d6000803e3d6000fd5b505050506040513d60208110156114b857600080fd5b5051602554604080516370a0823160e01b8152306004820152905192935061153f926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50518290613de1565b9050610e6261154d8261244f565b604080516370a0823160e01b81523060048201529051600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505190613de1565b61271081565b600a546001600160a01b03163314806115f35750600c546001600160a01b031633145b6115fc57600080fd5b60235460408051637050ccd960e01b81523060048201526001602482015290516001600160a01b0390921691637050ccd9916044808201926020929091908290030181600087803b15801561165057600080fd5b505af1158015611664573d6000803e3d6000fd5b505050506040513d602081101561167a57600080fd5b5050604080516370a0823160e01b8152306004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d60208110156116fb57600080fd5b5051604080516370a0823160e01b81523060048201529051919250600091734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b916370a08231916024808301926020929190829003018186803b15801561175457600080fd5b505afa158015611768573d6000803e3d6000fd5b505050506040513d602081101561177e57600080fd5b5051905081156117bb576117bb73d533a949740bb3306d119cc777fa900ba034cd5273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2846140b1565b80156117f4576117f4734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836140b1565b604080516370a0823160e01b8152306004820152905160009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a0823191602480820192602092909190829003018186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b505190508015611b2a57604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d60208110156118f657600080fd5b50516028549091506119409073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600080516020615daf8339815191529061193b9061271090611075908890613af9565b6140b1565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d60208110156119b957600080fd5b50516028546026549192506119e8916000916119e391611075906119dd8789613b94565b90613af9565b61413b565b60075460ff16151560011415611a38576000611a16620186a061107560015487613af990919063ffffffff16565b9050611a3673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282613f1b565b505b600954604080516370a0823160e01b81523060048201529051611acf9273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2926001600160a01b039091169183916370a08231916024808301926020929190829003018186803b158015611a9e57600080fd5b505afa158015611ab2573d6000803e3d6000fd5b505050506040513d6020811015611ac857600080fd5b50516144b2565b6000611ad9613454565b90508015611b2657436005556006819055611af261361b565b6040805182815290517f80f97f878e16410266694f134ddf012f2be424f54f8b5cafa107eccc51d00d589181900360200190a15b5050505b505050565b600080611b3a612c1d565b9050611b67601754611075601254611075670de0b6b3a76400006119dd878a613af990919063ffffffff16565b9392505050565b60195481565b6025546000906001600160a01b0383811691161415611bca576040805162461bcd60e51b815260206004820152600d60248201526c10b1bab93b32a6382a37b5b2b760991b604482015290519081900360640190fd5b611bd3826144fc565b50919050565b600081565b6008546001600160a01b031681565b600080611bf8610f32565b9050600081841015611c1357611c0e8285613b94565b611c16565b60005b9050611c23816000613919565b949350505050565b600a546001600160a01b031681565b600080735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c9757600080fd5b505afa158015611cab573d6000803e3d6000fd5b505050506040513d6020811015611cc157600080fd5b5051601554604080516309092f9760e21b815260048101929092526001600160a01b038316602483015280519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c926044808301939192829003018186803b158015611d2b57600080fd5b505afa158015611d3f573d6000803e3d6000fd5b505050506040513d6040811015611d5557600080fd5b506020015160155460408051636cb1c69b60e11b81526004810192909252519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d60a0811015611ddf57600080fd5b506020015190506000611df28383614627565b905080611e06576000945050505050610e47565b60006b033b2e3c9fd0803ce80000008204905081611e30826b033b2e3c9fd0803ce8000000614627565b10611e3b5780611e40565b806001015b9550505050505090565b60045481565b600a546001600160a01b0316331480611e735750600c546001600160a01b031633145b611e7c57600080fd5b602a91909155602b55565b600a546001600160a01b0316331480611eaa5750600c546001600160a01b031633145b611eb357600080fd5b601055565b6025546001600160a01b031681565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6023546001600160a01b031681565b600a546001600160a01b0316331480611f115750600c546001600160a01b031633145b611f1a57600080fd5b601b55565b600f546001600160a01b031681565b600d546001600160a01b03163314611f79576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b6004546000908190439015801590611f9857506000600654115b8015611fb25750600454600554611fb0908390613b94565b105b15612013576000611fda82611fd4600454600554613de190919063ffffffff16565b90613b94565b905061200f670de0b6b3a7640000611075600454611075670de0b6b3a76400006119dd87600654613af990919063ffffffff16565b9250505b61203082611fd4612022610ec0565b61202a613454565b90613de1565b9250505090565b600d546001600160a01b03163314612082576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b60065481565b7319c0976f590d67707e62397c87829d896dc0f1f181565b600b546000906001600160a01b031633146120f5576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6120fd614682565b600954604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d60208110156121f457600080fd5b5051600954909150612210906001600160a01b0316828461405f565b5090565b601a5481565b60015481565b60275481565b600d546001600160a01b03163314612271576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806122b65750600c546001600160a01b031633145b806122d057503360009081526020819052604090205460ff165b6122d957600080fd5b60006122e56000611bed565b9050801561242e576122f68161468d565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561234557600080fd5b505afa158015612359573d6000803e3d6000fd5b505050506040513d602081101561236f57600080fd5b50519050818110156123be576040805162461bcd60e51b8152602060048201526013602482015272216b6565704d696e526174696f52656465656d60681b604482015290519081900360640190fd5b6123c960008361413b565b60006123d3613313565b601a549091506123e4906001613b94565b811015611b2a576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b50565b60285481565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60008161245e575060006110d3565b6000611b67670de0b6b3a7640000611075856119dd613514565b600a546001600160a01b031633146124c5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60006124e2615d90565b60405180608001604052806000815260200185815260200160008152602001600081525090508273a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0602460009054906101000a90046001600160a01b03168460016040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b8381101561258b578181015183820152602001612573565b505050509050018215158152602001935050505060206040518083038186803b1580156125b757600080fd5b505afa1580156125cb573d6000803e3d6000fd5b505050506040513d60208110156125e157600080fd5b505110159150505b92915050565b600a546001600160a01b03163314806126125750600c546001600160a01b031633145b61261b57600080fd5b60195415612664576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b60155460408051636090dec560e01b8152600481019290925230602483015251735ef30b9986345249bc32d8928b7ee64de9435e3991636090dec59160448083019260209291908290030181600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b505050506040513d60208110156126eb57600080fd5b50516019556011546013546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051600080516020615daf8339815191529163095ea7b39160448083019260209291908290030181600087803b1580156127df57600080fd5b505af11580156127f3573d6000803e3d6000fd5b505050506040513d602081101561280957600080fd5b5050565b6020546001600160a01b031681565b600d546001600160a01b03163314612867576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156128b257600080fd5b505afa1580156128c6573d6000803e3d6000fd5b505050506040513d60208110156128dc57600080fd5b50511115612a70576128ef60001961468d565b602354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051156129b0576040805162461bcd60e51b8152602060048201526015602482015274042e6e8d2d8d88edee8a6dedaca92dc86dedceccaf605b1b604482015290519081900360640190fd5b602554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156129fb57600080fd5b505afa158015612a0f573d6000803e3d6000fd5b505050506040513d6020811015612a2557600080fd5b505115612a70576040805162461bcd60e51b8152602060048201526014602482015273217374696c6c476f74536f6d65496e437572766560601b604482015290519081900360640190fd5b602480546001600160a01b038086166001600160a01b03199283161790925560258054858416908316179055602380548484169216919091179081905560408051633c41a11560e21b81529051919092169163f1068454916004808301926020929190829003018186803b158015612ae757600080fd5b505afa158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b5051602255612b1e614a08565b604080516370a0823160e01b81523060048201529051611b2a91600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b5051614aa0565b6014546001600160a01b031681565b600a546001600160a01b03163314612bfb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6014546000906001600160a01b0316612c72576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601660009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d60a0811015612cf257600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506000841315612e045760185460019060ff1615612dad57735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612d7b57600080fd5b505afa158015612d8f573d6000803e3d6000fd5b505050506040513d60a0811015612da557600080fd5b506020015190505b601854612df79060ff16612dc2576001612dcc565b670de0b6b3a76400005b67ffffffffffffffff166110756305f5e100611075856119dd6017548c613af990919063ffffffff16565b9650505050505050610e47565b600095505050505050610e47565b60225481565b60185460ff1681565b60075461010090046001600160a01b031681565b60175481565b604080516002808252606080830184526000939092839283926020830190803683370190505091508682600081518110612e7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508582600181518110612e9f57fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505090508681600081518110612ee657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110612f1457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080825111612f455760006130b4565b600f546040805163d06ca61f60e01b815260048101898152602482019283528551604483015285516001600160a01b039094169363d06ca61f938b938893926064909101906020808601910280838360005b83811015612faf578181015183820152602001612f97565b50505050905001935050505060006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561301057600080fd5b810190808051604051939291908464010000000082111561303057600080fd5b90830190602082018581111561304557600080fd5b825186602082028301116401000000008211171561306257600080fd5b82525081516020918201928201910280838360005b8381101561308f578181015183820152602001613077565b505050509050016040525050506001835103815181106130ab57fe5b60200260200101515b90506000808351116130c7576001613236565b600e546040805163d06ca61f60e01b8152600481018a8152602482019283528751604483015287516001600160a01b039094169363d06ca61f938c938a93926064909101906020808601910280838360005b83811015613131578181015183820152602001613119565b50505050905001935050505060006040518083038186803b15801561315557600080fd5b505afa158015613169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561319257600080fd5b81019080805160405193929190846401000000008211156131b257600080fd5b9083019060208201858111156131c757600080fd5b82518660208202830111640100000000821117156131e457600080fd5b82525081516020918201928201910280838360005b838110156132115781810151838201526020016131f9565b5050505090500160405250505060018551038151811061322d57fe5b60200260200101515b9050600081831161324857600061324b565b60015b905060608161325a578561325c565b845b919b919a509098505050505050505050565b600a546001600160a01b031633146132bb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b601b5481565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b60008060006019541161332757600061332f565b61332f610f32565b9050801561336957600061334760646119dd84611b2f565b90506000613353611c3a565b905061335f8282613b52565b9350505050610e47565b6000915050610e47565b60035481565b600a546001600160a01b031633148061339c5750600c546001600160a01b031633145b6133a557600080fd5b602682905560278190556133b98282613de1565b6028555050565b600e546001600160a01b031681565b600d546001600160a01b0316331461341a576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610e1857600080fd5b600a546001600160a01b031633146134ec576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b602b5481565b6000610eca670de0b6b3a764000061107573bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561357257600080fd5b505afa158015613586573d6000803e3d6000fd5b505050506040513d602081101561359c57600080fd5b505160245460408051630176f71760e71b815290516001600160a01b039092169163bb7b8b8091600480820192602092909190829003018186803b1580156135e357600080fd5b505afa1580156135f7573d6000803e3d6000fd5b505050506040513d602081101561360d57600080fd5b505190613af9565b60025481565b6000613625613454565b905060006136316137e5565b925050506000821180156136425750805b1561280957600061366561365e613657610f32565b8590613de1565b6001613919565b905060008111801561368a5750601054613687613680611c3a565b8390613de1565b10155b15611b2a576136998382614e23565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156136e857600080fd5b505afa1580156136fc573d6000803e3d6000fd5b505050506040513d602081101561371257600080fd5b5051905061372d8183116137265782613728565b815b614aa0565b50505050565b600d546001600160a01b031681565b73a79828df1850e8a3a3064576f380d90aecdd335981565b6011546001600160a01b031681565b601c546001600160a01b031681565b602a5481565b60006020819052908152604090205460ff1681565b600a546001600160a01b031633146137e0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6000806000806000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b031663d9638d366015546040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d60a081101561387257600080fd5b5080516020820151606090920151909450909250905060006138a46b033b2e3c9fd0803ce80000006110758686613af9565b905060006138be836b033b2e3c9fd0803ce8000000613b52565b91989197505087871195509350505050565b60265481565b601f5481565b600a546001600160a01b03163314806138ff5750600c546001600160a01b031633145b61390857600080fd5b601a55565b60155481565b60105481565b6000806000841161392b576000613948565b6139486139396127106151fc565b6110756127106119dd88611b2f565b90506000613954611c3a565b905060008480156139655750818310155b1561397b576139748383613b94565b905061399b565b841580156139895750828210155b1561399b576139988284613b94565b90505b600081116139aa5760006139ac565b805b9695505050505050565b600b546001600160a01b031681565b600080516020615daf83398151915281565b801580613a5d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d6020811015613a5957600080fd5b5051155b613a985760405162461bcd60e51b8152600401808060200182810382526036815260200180615e1a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b2a908490615231565b6060611c2384846000856152e2565b600082613b08575060006125e9565b82820282848281613b1557fe5b0414611b675760405162461bcd60e51b8152600401808060200182810382526021815260200180615dcf6021913960400191505060405180910390fd5b6000611b6783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061548d565b6000611b6783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f2565b600080613be1610f32565b8310159050808015613bf35750600083115b15613cec57613c0360001961468d565b6000613c0d611c3a565b604080516370a0823160e01b815230600482015290519192508291600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b158015613c5d57600080fd5b505afa158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50511015613cdc576040805162461bcd60e51b815260206004820152601960248201527f216d69736d6174636841667465725769746864726177416c6c00000000000000604482015290519081900360640190fd5b613ce6848261413b565b50613dda565b6000613cf784611bed565b90508015613dce57613d088161468d565b604080516370a0823160e01b815230600482015290518291600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015613d5657600080fd5b505afa158015613d6a573d6000803e3d6000fd5b505050506040513d6020811015613d8057600080fd5b50511015613dce576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b613dd8848261413b565b505b5090919050565b600082820183811015611b67576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060008311613e65575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506000613f16565b600954613e90906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2856144b2565b604080516370a0823160e01b8152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29182916370a0823191602480820192602092909190829003018186803b158015613ee457600080fd5b505afa158015613ef8573d6000803e3d6000fd5b505050506040513d6020811015613f0e57600080fd5b505190925090505b915091565b60075460ff1615156001148015613f325750600081115b1561280957600754613f5490839061010090046001600160a01b0316836144b2565b600754604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fa457600080fd5b505afa158015613fb8573d6000803e3d6000fd5b505050506040513d6020811015613fce57600080fd5b5051600854600754919250613ff59161010090046001600160a01b0390811691168361405f565b60085460408051635ad6dca560e11b81526004810184905290516001600160a01b039092169163b5adb94a9160248082019260009290919082900301818387803b15801561404257600080fd5b505af1158015614056573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b2a908490615231565b604080516002808252606080830184529260208301908036833701905050905083816000815181106140df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061410d57fe5b6001600160a01b039283166020918202929092010152600f5461372d9186918691869160019187911661554c565b60006019541161417b576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614186611c3a565b905080821080156141a2575060105461419f8284613b94565b10155b806141ad5750818111155b6141e9576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006141f66156fa565b91945092509050851561427e5760408051633b4da69f60e01b81526001600160a01b0385166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561426557600080fd5b505af1158015614279573d6000803e3d6000fd5b505050505b600080881161428e5760006142a4565b6013546142a4906001600160a01b031689615889565b9050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd6019546142d584615901565b60000361435c87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561432957600080fd5b505afa15801561433d573d6000803e3d6000fd5b505050506040513d602081101561435357600080fd5b50518a89615947565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b1580156143a057600080fd5b505af11580156143b4573d6000803e3d6000fd5b5050505060008811156144a857601954604080516313771f0760e31b815260048101929092523060248301526044820183905251735ef30b9986345249bc32d8928b7ee64de9435e3991639bb8f83891606480830192600092919082900301818387803b15801561442457600080fd5b505af1158015614438573d6000803e3d6000fd5b50506013546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b15801561448f57600080fd5b505af11580156144a3573d6000803e3d6000fd5b505050505b5050505050505050565b8015611b2a57600060606144c7858585612e3b565b91509150611375858585600185876144ea57600e546001600160a01b03166144f7565b600f546001600160a01b03165b61554c565b600b546000906001600160a01b0316331461454c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6009546001600160a01b0383811691161415614598576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156145de57600080fd5b505afa1580156145f2573d6000803e3d6000fd5b505050506040513d602081101561460857600080fd5b5051600b549091506110d3906001600160a01b0384811691168361405f565b60008115806146425750508082028282828161463f57fe5b04145b6125e9576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b61242e6111e6610ec0565b806146975761242e565b600019811061481757602354604080516370a0823160e01b815230600482015290516001600160a01b039092169163c32e72029183916370a0823191602480820192602092909190829003018186803b1580156146f357600080fd5b505afa158015614707573d6000803e3d6000fd5b505050506040513d602081101561471d57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925260006024830181905290516044808401936020939083900390910190829087803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b505050506040513d602081101561479357600080fd5b5050602554604080516370a0823160e01b81523060048201529051614812926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156147e157600080fd5b505afa1580156147f5573d6000803e3d6000fd5b505050506040513d602081101561480b57600080fd5b5051615a78565b61242e565b6000614822826110b1565b905061484b612710611075614844602954612710613de190919063ffffffff16565b8490613af9565b602554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561489c57600080fd5b505afa1580156148b0573d6000803e3d6000fd5b505050506040513d60208110156148c657600080fd5b5051905060008282106148da5760006148e4565b6148e48383613b94565b905080156149ff57602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561493757600080fd5b505afa15801561494b573d6000803e3d6000fd5b505050506040513d602081101561496157600080fd5b5051905060008282106149745782614976565b815b60235460408051636197390160e11b81526004810184905260006024820181905291519394506001600160a01b039092169263c32e7202926044808201936020939283900390910190829087803b1580156149d057600080fd5b505af11580156149e4573d6000803e3d6000fd5b505050506040513d60208110156149fa57600080fd5b505050505b61372d83615a78565b602554614a34906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006139d7565b602554614a61906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196139d7565b602154602554614a7f916001600160a01b03918216911660006139d7565b602154602554614a9e916001600160a01b0391821691166000196139d7565b565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b5051905080614b28575061242e565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6020811015614ba157600080fd5b505190506000614bb0826110b1565b90506000614bdb612710611075614bd4602a54612710613b9490919063ffffffff16565b8590613af9565b9050600083118015614bf25750614bf283826124d8565b15614cec57614bff615d90565b604051806080016040528060008152602001858152602001600081526020016000815250905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663384e03db602460009054906101000a90046001600160a01b031683856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b83811015614ca6578181015183820152602001614c8e565b505050509050018281526020019350505050600060405180830381600087803b158015614cd257600080fd5b505af1158015614ce6573d6000803e3d6000fd5b50505050505b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015614d3757600080fd5b505afa158015614d4b573d6000803e3d6000fd5b505050506040513d6020811015614d6157600080fd5b5051905080614da1576040805162461bcd60e51b81526020600482015260076024820152660857db1c105b5d60ca1b604482015290519081900360640190fd5b6021546022546040805163303acfe760e11b8152600481019290925260016024830152516001600160a01b03909216916360759fce916044808201926020929091908290030181600087803b158015614df957600080fd5b505af1158015614e0d573d6000803e3d6000fd5b505050506040513d60208110156144a857600080fd5b600060195411614e63576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601054614e71613680611c3a565b1015614eaf576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614ebc6156fa565b60135460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015614f1857600080fd5b505af1158015614f2c573d6000803e3d6000fd5b5050601954601354735ef30b9986345249bc32d8928b7ee64de9435e3993506345e6bdcd9250614f6e90614f69906001600160a01b03168a615889565b615901565b614f8f867319c0976f590d67707e62397c87829d896dc0f1f189888c615ba9565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614fd357600080fd5b505af1158015614fe7573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db66019543061501b88615cf8565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561506857600080fd5b505af115801561507c573d6000803e3d6000fd5b505060408051634538c4eb60e01b8152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290516001600160a01b0386169350634538c4eb92506044808301926020929190829003018186803b1580156150e057600080fd5b505afa1580156150f4573d6000803e3d6000fd5b505050506040513d602081101561510a57600080fd5b505161518457604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290516001600160a01b0384169163a3b22fc491602480830192600092919082900301818387803b15801561516b57600080fd5b505af115801561517f573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b8152306004820152602481018690529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b1580156151dd57600080fd5b505af11580156151f1573d6000803e3d6000fd5b505050505050505050565b60006110d06064611075612710611075615223601b54612710613de190919063ffffffff16565b601a546119dd908990613af9565b6060615286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aea9092919063ffffffff16565b805190915015611b2a578080602001905160208110156152a557600080fd5b5051611b2a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615df0602a913960400191505060405180910390fd5b60606152ed85615d10565b61533e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061537d5780518252601f19909201916020918201910161535e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146153df576040519150601f19603f3d011682016040523d82523d6000602084013e6153e4565b606091505b509150915081156153f8579150611c239050565b8051156154085780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561545257818101518382015260200161543a565b50505050905090810190601f16801561547f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600081836154dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b5060008385816154e857fe5b0495945050505050565b600081848411156155445760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b505050900390565b8315611b26576155676001600160a01b0387168260006139d7565b61557b6001600160a01b03871682866139d7565b806001600160a01b03166338ed173985858530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156155ff5781810151838201526020016155e7565b505050509050019650505050505050600060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561566557600080fd5b810190808051604051939291908464010000000082111561568557600080fd5b90830190602082018581111561569a57600080fd5b82518660208202830111640100000000821117156156b757600080fd5b82525081516020918201928201910280838360005b838110156156e45781810151838201526020016156cc565b5050505090500160405250505050505050505050565b6000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561575957600080fd5b505afa15801561576d573d6000803e3d6000fd5b505050506040513d602081101561578357600080fd5b5051604080516336569e7760e01b81529051735ef30b9986345249bc32d8928b7ee64de9435e39916336569e77916004808301926020929190829003018186803b1580156157d057600080fd5b505afa1580156157e4573d6000803e3d6000fd5b505050506040513d60208110156157fa57600080fd5b505160195460408051632c2cb9fd60e01b8152600481019290925251735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561585157600080fd5b505afa158015615865573d6000803e3d6000fd5b505050506040513d602081101561587b57600080fd5b505191945092509050909192565b6000611b6782846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156158ca57600080fd5b505af11580156158de573d6000803e3d6000fd5b505050506040513d60208110156158f457600080fd5b5051601203600a0a614627565b8060008112156110d3576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561598e57600080fd5b505afa1580156159a2573d6000803e3d6000fd5b505050506040513d60a08110156159b857600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b158015615a0f57600080fd5b505afa158015615a23573d6000803e3d6000fd5b505050506040513d6040811015615a3957600080fd5b50602001519050615a4d614f698784613b52565b925080831115615a6857615a6081615901565b600003615a6d565b826000035b979650505050505050565b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015615ac357600080fd5b505afa158015615ad7573d6000803e3d6000fd5b505050506040513d6020811015615aed57600080fd5b50519050801561280957808211615b045781615b06565b805b91506000615b31612710611075615b2a602b54612710613b9490919063ffffffff16565b8690613af9565b60248054604080516314f6943160e11b81526001600160a01b0390921660048301529181018690526001604482015260648101839052905191925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848082019260009290919082900301818387803b15801561404257600080fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015615bf257600080fd5b505af1158015615c06573d6000803e3d6000fd5b505050506040513d6020811015615c1c57600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b158015615c6e57600080fd5b505afa158015615c82573d6000803e3d6000fd5b505050506040513d6020811015615c9857600080fd5b50519050615ca584615cf8565b811015615ced57615cc5614f6983611075615cbf88615cf8565b85615d49565b9250615cd084615cf8565b615cda8484614627565b10615ce55782615cea565b826001015b92505b505095945050505050565b60006110d0826b033b2e3c9fd0803ce8000000614627565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c23575050151592915050565b808203828111156125e9576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b6040518060800160405280600490602082028036833750919291505056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c64736f6c634300060c00335361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000043229759e12efbe3e2a0fb0510b15e516d04644200000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106106595760003560e01c806386d8745b11610351578063b635b8ae116101c3578063d8dfeb451161010f578063eb319441116100ad578063f17336d711610087578063f17336d714610d83578063f6ff935214610d8b578063f77c479114610db0578063f8d8989814610db857610659565b8063eb31944114610d56578063ec029a4414610d5e578063ef55105014610d7b57610659565b8063e13f8513116100e9578063e13f851314610ce3578063e3a58e1814610d09578063e420557614610d26578063e4c01d3714610d4e57610659565b8063d8dfeb4514610ccb578063df1b27ac14610cd3578063e0c9cf0614610cdb57610659565b8063c7b9d5301161017c578063cc32d17611610156578063cc32d17614610cab578063d0e30db014610cb3578063d33219b414610cbb578063d89281e814610cc357610659565b8063c7b9d53014610c75578063c90b65de14610c9b578063c954e5cc14610ca357610659565b8063b635b8ae14610c0c578063b78e0c5a14610c14578063b9e3748914610c37578063bdacb30314610c3f578063c11645bc14610c65578063c1a3d44c14610c6d57610659565b8063a0e2c3411161029d578063a8e879951161023b578063ab43be7111610215578063ab43be7114610bec578063af4f170514610bf4578063b0fd087114610bfc578063b131da4014610c0457610659565b8063a8e8799514610b2b578063aa87484c14610b33578063ab033ea914610bc657610659565b8063a36f063e11610277578063a36f063e14610b0b578063a46c850514610b13578063a6d09de614610b1b578063a890dd9014610b2357610659565b8063a0e2c34114610aa5578063a217d5ce14610add578063a2d9f4dc14610ae557610659565b80639658e68f1161030a5780639a9b567d116102e45780639a9b567d14610a535780639aa5f0d214610a725780639ac9752c14610a955780639d1e73cb14610a9d57610659565b80639658e68f14610a26578063981879a614610a2e5780639868607c14610a3657610659565b806386d8745b146109e057806387788782146109e85780638ce47ff0146109f0578063918f86741461086957806392eefe9b146109f857806394d0737b14610a1e57610659565b80633fc8cef3116104ea5780635ffe27b41161043657806370897b23116103d45780637b756553116103ae5780637b756553146109c85780637cc79113146106e357806384718d89146109d0578063853828b6146109d857610659565b806370897b2314610986578063722713f7146109a357806377e741c7146109ab57610659565b80636480b8ad116104105780636480b8ad1461095157806366666aa9146109595780636765d6fb146109615780636d13582c1461097e57610659565b80635ffe27b4146109095780636234dc211461092c578063646780df1461094957610659565b806351cff8d9116104a3578063596b93e41161047d578063596b93e4146108d45780635aa6e675146108f15780635ccbbdf1146108f95780635d1583501461090157610659565b806351cff8d91461089e578063561c20dc146108c4578063575a86b2146108cc57610659565b80633fc8cef31461085957806344015ed41461086157806345d3bdff146108695780634641257d14610871578063475411ab146108795780634a1a066b1461089657610659565b8063160d0da5116105a9578063218751b21161056257806331e635c81161053c57806331e635c8146108135780633203d5611461081b57806335eb11861461084957806336569e771461085157610659565b8063218751b2146107e65780632e1a7d4d146107ee5780632eba33f61461080b57610659565b8063160d0da51461071857806317d7de7c1461073457806319ec5df5146107b15780631ba89442146107ce5780631f1fcd51146107d65780631fe4a686146107de57610659565b8063115880861161061657806314a1fe02116105f057806314a1fe02146106e357806314b74d9a146106eb57806314e6ac09146106f35780631529a6391461071057610659565b806311588086146106d35780631378e347146106db57806313bd4b95146106e357610659565b806301664f661461065e5780630547104d14610682578063057d66a21461069c5780630872b81d146106a457806308d50063146106ac5780630c56ae3b146106cb575b600080fd5b610666610dc0565b604080516001600160a01b039092168252519081900360200190f35b61068a610dcf565b60408051918252519081900360200190f35b61068a610e4a565b610666610e68565b6106c9600480360360208110156106c257600080fd5b5035610e80565b005b610666610eb1565b61068a610ec0565b61068a610ecf565b61068a610ed5565b61068a610edc565b6106c96004803603602081101561070957600080fd5b5035610ee2565b61068a610f32565b61072061107b565b604080519115158252519081900360200190f35b61073c611084565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561077657818101518382015260200161075e565b50505050905090810190601f1680156107a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61068a600480360360208110156107c757600080fd5b50356110b1565b61068a6110d8565b6106666110de565b6106666110ed565b6106666110fc565b6106c96004803603602081101561080457600080fd5b503561110b565b61068a61137c565b610666611382565b6106c96004803603604081101561083157600080fd5b506001600160a01b0381351690602001351515611391565b61068a611409565b61066661140e565b610666611426565b61068a61143e565b61068a6115ca565b6106c96115d0565b61068a6004803603602081101561088f57600080fd5b5035611b2f565b61068a611b6e565b61068a600480360360208110156108b457600080fd5b50356001600160a01b0316611b74565b610720611bd9565b610666611bde565b61068a600480360360208110156108ea57600080fd5b5035611bed565b610666611c2b565b61068a611c3a565b61068a611e4a565b6106c96004803603604081101561091f57600080fd5b5080359060200135611e50565b6106c96004803603602081101561094257600080fd5b5035611e87565b610666611eb8565b610666611ec7565b610666611edf565b6106c96004803603602081101561097757600080fd5b5035611eee565b610666611f1f565b6106c96004803603602081101561099c57600080fd5b5035611f2e565b61068a611f7e565b6106c9600480360360208110156109c157600080fd5b5035612037565b61068a612087565b61066661208d565b61068a6120a5565b61068a612214565b61068a61221a565b61068a612220565b6106c960048036036020811015610a0e57600080fd5b50356001600160a01b0316612226565b6106c9612293565b61068a612431565b610666612437565b61068a60048036036020811015610a4c57600080fd5b503561244f565b6106c960048036036020811015610a6957600080fd5b50351515612478565b61072060048036036040811015610a8857600080fd5b50803590602001356124d8565b6106c96125ef565b61066661280d565b6106c960048036036060811015610abb57600080fd5b506001600160a01b03813581169160208101358216916040909101351661281c565b610666612b9f565b6106c960048036036020811015610afb57600080fd5b50356001600160a01b0316612bae565b61068a612c1d565b61068a612e12565b610720612e18565b610666612e21565b61068a612e35565b610b6960048036036060811015610b4957600080fd5b506001600160a01b03813581169160208101359091169060400135612e3b565b60405180831515815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bb1578181015183820152602001610b99565b50505050905001935050505060405180910390f35b6106c960048036036020811015610bdc57600080fd5b50356001600160a01b031661326e565b6106666132dd565b61068a6132f5565b6106666132fb565b61068a613313565b61068a613373565b6106c960048036036040811015610c2a57600080fd5b5080359060200135613379565b6106666133c0565b6106c960048036036020811015610c5557600080fd5b50356001600160a01b03166133cf565b61066661343c565b61068a613454565b6106c960048036036020811015610c8b57600080fd5b50356001600160a01b031661349f565b61068a61350e565b61068a613514565b61068a613615565b6106c961361b565b610666613733565b610666613742565b61066661375a565b610666613769565b61068a613778565b61072060048036036020811015610cf957600080fd5b50356001600160a01b031661377e565b6106c960048036036020811015610d1f57600080fd5b5035613793565b610d2e6137e5565b604080519384526020840192909252151582820152519081900360600190f35b61068a6138d0565b61068a6138d6565b6106c960048036036020811015610d7457600080fd5b50356138dc565b61068a61390d565b61068a613913565b61068a60048036036040811015610da157600080fd5b50803590602001351515613919565b6106666139b6565b6106666139c5565b6013546001600160a01b031681565b602354604080516246613160e11b815230600482015290516000926001600160a01b031691628cc262916024808301926020929190829003018186803b158015610e1857600080fd5b505afa158015610e2c573d6000803e3d6000fd5b505050506040513d6020811015610e4257600080fd5b505190505b90565b600080610e55610f32565b9050610e62816001613919565b91505090565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600a546001600160a01b0316331480610ea35750600c546001600160a01b031633145b610eac57600080fd5b602955565b6021546001600160a01b031681565b6000610eca610f32565b905090565b60295481565b620186a081565b60055481565b600d546001600160a01b03163314610f2d576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600355565b6000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316632424be5c601554735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301528051604480840193829003018186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d604081101561105457600080fd5b5051601254909150610e6290670de0b6b3a764000090611075908490613af9565b90613b52565b60075460ff1681565b60408051808201909152601381527253747261746567794d616b657257425443563360681b602082015290565b60006110d06110be613514565b61107584670de0b6b3a7640000613af9565b90505b919050565b60125481565b6009546001600160a01b031681565b600c546001600160a01b031681565b6024546001600160a01b031681565b600b546001600160a01b03163314611158576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50519050818110156111fa576111eb6111e68383613b94565b613bd6565b91506111f78282613de1565b91505b6000806003541161120c576000611228565b611228620186a061107560035486613af990919063ffffffff16565b90506000806002541161123c576000611258565b611258620186a061107560025487613af990919063ffffffff16565b600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505160075490915060ff16151560011480156112fe575060008311806112fe5750600082115b15611329576000806113186113138686613de1565b613e3b565b915091506113268282613f1b565b50505b600083116113375784611341565b6113418584613b94565b945060008211611351578461135b565b61135b8583613b94565b600954909550611375906001600160a01b0316828761405f565b5050505050565b601e5481565b601d546001600160a01b031681565b600a546001600160a01b031633146113de576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b600181565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b602354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561148e57600080fd5b505afa1580156114a2573d6000803e3d6000fd5b505050506040513d60208110156114b857600080fd5b5051602554604080516370a0823160e01b8152306004820152905192935061153f926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50518290613de1565b9050610e6261154d8261244f565b604080516370a0823160e01b81523060048201529051600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505190613de1565b61271081565b600a546001600160a01b03163314806115f35750600c546001600160a01b031633145b6115fc57600080fd5b60235460408051637050ccd960e01b81523060048201526001602482015290516001600160a01b0390921691637050ccd9916044808201926020929091908290030181600087803b15801561165057600080fd5b505af1158015611664573d6000803e3d6000fd5b505050506040513d602081101561167a57600080fd5b5050604080516370a0823160e01b8152306004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d60208110156116fb57600080fd5b5051604080516370a0823160e01b81523060048201529051919250600091734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b916370a08231916024808301926020929190829003018186803b15801561175457600080fd5b505afa158015611768573d6000803e3d6000fd5b505050506040513d602081101561177e57600080fd5b5051905081156117bb576117bb73d533a949740bb3306d119cc777fa900ba034cd5273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2846140b1565b80156117f4576117f4734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836140b1565b604080516370a0823160e01b8152306004820152905160009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a0823191602480820192602092909190829003018186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b505190508015611b2a57604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d60208110156118f657600080fd5b50516028549091506119409073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600080516020615daf8339815191529061193b9061271090611075908890613af9565b6140b1565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d60208110156119b957600080fd5b50516028546026549192506119e8916000916119e391611075906119dd8789613b94565b90613af9565b61413b565b60075460ff16151560011415611a38576000611a16620186a061107560015487613af990919063ffffffff16565b9050611a3673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282613f1b565b505b600954604080516370a0823160e01b81523060048201529051611acf9273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2926001600160a01b039091169183916370a08231916024808301926020929190829003018186803b158015611a9e57600080fd5b505afa158015611ab2573d6000803e3d6000fd5b505050506040513d6020811015611ac857600080fd5b50516144b2565b6000611ad9613454565b90508015611b2657436005556006819055611af261361b565b6040805182815290517f80f97f878e16410266694f134ddf012f2be424f54f8b5cafa107eccc51d00d589181900360200190a15b5050505b505050565b600080611b3a612c1d565b9050611b67601754611075601254611075670de0b6b3a76400006119dd878a613af990919063ffffffff16565b9392505050565b60195481565b6025546000906001600160a01b0383811691161415611bca576040805162461bcd60e51b815260206004820152600d60248201526c10b1bab93b32a6382a37b5b2b760991b604482015290519081900360640190fd5b611bd3826144fc565b50919050565b600081565b6008546001600160a01b031681565b600080611bf8610f32565b9050600081841015611c1357611c0e8285613b94565b611c16565b60005b9050611c23816000613919565b949350505050565b600a546001600160a01b031681565b600080735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c9757600080fd5b505afa158015611cab573d6000803e3d6000fd5b505050506040513d6020811015611cc157600080fd5b5051601554604080516309092f9760e21b815260048101929092526001600160a01b038316602483015280519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c926044808301939192829003018186803b158015611d2b57600080fd5b505afa158015611d3f573d6000803e3d6000fd5b505050506040513d6040811015611d5557600080fd5b506020015160155460408051636cb1c69b60e11b81526004810192909252519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d60a0811015611ddf57600080fd5b506020015190506000611df28383614627565b905080611e06576000945050505050610e47565b60006b033b2e3c9fd0803ce80000008204905081611e30826b033b2e3c9fd0803ce8000000614627565b10611e3b5780611e40565b806001015b9550505050505090565b60045481565b600a546001600160a01b0316331480611e735750600c546001600160a01b031633145b611e7c57600080fd5b602a91909155602b55565b600a546001600160a01b0316331480611eaa5750600c546001600160a01b031633145b611eb357600080fd5b601055565b6025546001600160a01b031681565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6023546001600160a01b031681565b600a546001600160a01b0316331480611f115750600c546001600160a01b031633145b611f1a57600080fd5b601b55565b600f546001600160a01b031681565b600d546001600160a01b03163314611f79576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b6004546000908190439015801590611f9857506000600654115b8015611fb25750600454600554611fb0908390613b94565b105b15612013576000611fda82611fd4600454600554613de190919063ffffffff16565b90613b94565b905061200f670de0b6b3a7640000611075600454611075670de0b6b3a76400006119dd87600654613af990919063ffffffff16565b9250505b61203082611fd4612022610ec0565b61202a613454565b90613de1565b9250505090565b600d546001600160a01b03163314612082576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b60065481565b7319c0976f590d67707e62397c87829d896dc0f1f181565b600b546000906001600160a01b031633146120f5576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6120fd614682565b600954604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d60208110156121f457600080fd5b5051600954909150612210906001600160a01b0316828461405f565b5090565b601a5481565b60015481565b60275481565b600d546001600160a01b03163314612271576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806122b65750600c546001600160a01b031633145b806122d057503360009081526020819052604090205460ff165b6122d957600080fd5b60006122e56000611bed565b9050801561242e576122f68161468d565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561234557600080fd5b505afa158015612359573d6000803e3d6000fd5b505050506040513d602081101561236f57600080fd5b50519050818110156123be576040805162461bcd60e51b8152602060048201526013602482015272216b6565704d696e526174696f52656465656d60681b604482015290519081900360640190fd5b6123c960008361413b565b60006123d3613313565b601a549091506123e4906001613b94565b811015611b2a576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b50565b60285481565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60008161245e575060006110d3565b6000611b67670de0b6b3a7640000611075856119dd613514565b600a546001600160a01b031633146124c5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60006124e2615d90565b60405180608001604052806000815260200185815260200160008152602001600081525090508273a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0602460009054906101000a90046001600160a01b03168460016040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b8381101561258b578181015183820152602001612573565b505050509050018215158152602001935050505060206040518083038186803b1580156125b757600080fd5b505afa1580156125cb573d6000803e3d6000fd5b505050506040513d60208110156125e157600080fd5b505110159150505b92915050565b600a546001600160a01b03163314806126125750600c546001600160a01b031633145b61261b57600080fd5b60195415612664576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b60155460408051636090dec560e01b8152600481019290925230602483015251735ef30b9986345249bc32d8928b7ee64de9435e3991636090dec59160448083019260209291908290030181600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b505050506040513d60208110156126eb57600080fd5b50516019556011546013546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051600080516020615daf8339815191529163095ea7b39160448083019260209291908290030181600087803b1580156127df57600080fd5b505af11580156127f3573d6000803e3d6000fd5b505050506040513d602081101561280957600080fd5b5050565b6020546001600160a01b031681565b600d546001600160a01b03163314612867576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156128b257600080fd5b505afa1580156128c6573d6000803e3d6000fd5b505050506040513d60208110156128dc57600080fd5b50511115612a70576128ef60001961468d565b602354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051156129b0576040805162461bcd60e51b8152602060048201526015602482015274042e6e8d2d8d88edee8a6dedaca92dc86dedceccaf605b1b604482015290519081900360640190fd5b602554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156129fb57600080fd5b505afa158015612a0f573d6000803e3d6000fd5b505050506040513d6020811015612a2557600080fd5b505115612a70576040805162461bcd60e51b8152602060048201526014602482015273217374696c6c476f74536f6d65496e437572766560601b604482015290519081900360640190fd5b602480546001600160a01b038086166001600160a01b03199283161790925560258054858416908316179055602380548484169216919091179081905560408051633c41a11560e21b81529051919092169163f1068454916004808301926020929190829003018186803b158015612ae757600080fd5b505afa158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b5051602255612b1e614a08565b604080516370a0823160e01b81523060048201529051611b2a91600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b5051614aa0565b6014546001600160a01b031681565b600a546001600160a01b03163314612bfb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6014546000906001600160a01b0316612c72576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601660009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d60a0811015612cf257600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506000841315612e045760185460019060ff1615612dad57735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612d7b57600080fd5b505afa158015612d8f573d6000803e3d6000fd5b505050506040513d60a0811015612da557600080fd5b506020015190505b601854612df79060ff16612dc2576001612dcc565b670de0b6b3a76400005b67ffffffffffffffff166110756305f5e100611075856119dd6017548c613af990919063ffffffff16565b9650505050505050610e47565b600095505050505050610e47565b60225481565b60185460ff1681565b60075461010090046001600160a01b031681565b60175481565b604080516002808252606080830184526000939092839283926020830190803683370190505091508682600081518110612e7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508582600181518110612e9f57fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505090508681600081518110612ee657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110612f1457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080825111612f455760006130b4565b600f546040805163d06ca61f60e01b815260048101898152602482019283528551604483015285516001600160a01b039094169363d06ca61f938b938893926064909101906020808601910280838360005b83811015612faf578181015183820152602001612f97565b50505050905001935050505060006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561301057600080fd5b810190808051604051939291908464010000000082111561303057600080fd5b90830190602082018581111561304557600080fd5b825186602082028301116401000000008211171561306257600080fd5b82525081516020918201928201910280838360005b8381101561308f578181015183820152602001613077565b505050509050016040525050506001835103815181106130ab57fe5b60200260200101515b90506000808351116130c7576001613236565b600e546040805163d06ca61f60e01b8152600481018a8152602482019283528751604483015287516001600160a01b039094169363d06ca61f938c938a93926064909101906020808601910280838360005b83811015613131578181015183820152602001613119565b50505050905001935050505060006040518083038186803b15801561315557600080fd5b505afa158015613169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561319257600080fd5b81019080805160405193929190846401000000008211156131b257600080fd5b9083019060208201858111156131c757600080fd5b82518660208202830111640100000000821117156131e457600080fd5b82525081516020918201928201910280838360005b838110156132115781810151838201526020016131f9565b5050505090500160405250505060018551038151811061322d57fe5b60200260200101515b9050600081831161324857600061324b565b60015b905060608161325a578561325c565b845b919b919a509098505050505050505050565b600a546001600160a01b031633146132bb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b601b5481565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b60008060006019541161332757600061332f565b61332f610f32565b9050801561336957600061334760646119dd84611b2f565b90506000613353611c3a565b905061335f8282613b52565b9350505050610e47565b6000915050610e47565b60035481565b600a546001600160a01b031633148061339c5750600c546001600160a01b031633145b6133a557600080fd5b602682905560278190556133b98282613de1565b6028555050565b600e546001600160a01b031681565b600d546001600160a01b0316331461341a576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610e1857600080fd5b600a546001600160a01b031633146134ec576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b602b5481565b6000610eca670de0b6b3a764000061107573bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561357257600080fd5b505afa158015613586573d6000803e3d6000fd5b505050506040513d602081101561359c57600080fd5b505160245460408051630176f71760e71b815290516001600160a01b039092169163bb7b8b8091600480820192602092909190829003018186803b1580156135e357600080fd5b505afa1580156135f7573d6000803e3d6000fd5b505050506040513d602081101561360d57600080fd5b505190613af9565b60025481565b6000613625613454565b905060006136316137e5565b925050506000821180156136425750805b1561280957600061366561365e613657610f32565b8590613de1565b6001613919565b905060008111801561368a5750601054613687613680611c3a565b8390613de1565b10155b15611b2a576136998382614e23565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156136e857600080fd5b505afa1580156136fc573d6000803e3d6000fd5b505050506040513d602081101561371257600080fd5b5051905061372d8183116137265782613728565b815b614aa0565b50505050565b600d546001600160a01b031681565b73a79828df1850e8a3a3064576f380d90aecdd335981565b6011546001600160a01b031681565b601c546001600160a01b031681565b602a5481565b60006020819052908152604090205460ff1681565b600a546001600160a01b031633146137e0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6000806000806000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b031663d9638d366015546040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d60a081101561387257600080fd5b5080516020820151606090920151909450909250905060006138a46b033b2e3c9fd0803ce80000006110758686613af9565b905060006138be836b033b2e3c9fd0803ce8000000613b52565b91989197505087871195509350505050565b60265481565b601f5481565b600a546001600160a01b03163314806138ff5750600c546001600160a01b031633145b61390857600080fd5b601a55565b60155481565b60105481565b6000806000841161392b576000613948565b6139486139396127106151fc565b6110756127106119dd88611b2f565b90506000613954611c3a565b905060008480156139655750818310155b1561397b576139748383613b94565b905061399b565b841580156139895750828210155b1561399b576139988284613b94565b90505b600081116139aa5760006139ac565b805b9695505050505050565b600b546001600160a01b031681565b600080516020615daf83398151915281565b801580613a5d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d6020811015613a5957600080fd5b5051155b613a985760405162461bcd60e51b8152600401808060200182810382526036815260200180615e1a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b2a908490615231565b6060611c2384846000856152e2565b600082613b08575060006125e9565b82820282848281613b1557fe5b0414611b675760405162461bcd60e51b8152600401808060200182810382526021815260200180615dcf6021913960400191505060405180910390fd5b6000611b6783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061548d565b6000611b6783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f2565b600080613be1610f32565b8310159050808015613bf35750600083115b15613cec57613c0360001961468d565b6000613c0d611c3a565b604080516370a0823160e01b815230600482015290519192508291600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b158015613c5d57600080fd5b505afa158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50511015613cdc576040805162461bcd60e51b815260206004820152601960248201527f216d69736d6174636841667465725769746864726177416c6c00000000000000604482015290519081900360640190fd5b613ce6848261413b565b50613dda565b6000613cf784611bed565b90508015613dce57613d088161468d565b604080516370a0823160e01b815230600482015290518291600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015613d5657600080fd5b505afa158015613d6a573d6000803e3d6000fd5b505050506040513d6020811015613d8057600080fd5b50511015613dce576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b613dd8848261413b565b505b5090919050565b600082820183811015611b67576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060008311613e65575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506000613f16565b600954613e90906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2856144b2565b604080516370a0823160e01b8152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29182916370a0823191602480820192602092909190829003018186803b158015613ee457600080fd5b505afa158015613ef8573d6000803e3d6000fd5b505050506040513d6020811015613f0e57600080fd5b505190925090505b915091565b60075460ff1615156001148015613f325750600081115b1561280957600754613f5490839061010090046001600160a01b0316836144b2565b600754604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fa457600080fd5b505afa158015613fb8573d6000803e3d6000fd5b505050506040513d6020811015613fce57600080fd5b5051600854600754919250613ff59161010090046001600160a01b0390811691168361405f565b60085460408051635ad6dca560e11b81526004810184905290516001600160a01b039092169163b5adb94a9160248082019260009290919082900301818387803b15801561404257600080fd5b505af1158015614056573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b2a908490615231565b604080516002808252606080830184529260208301908036833701905050905083816000815181106140df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061410d57fe5b6001600160a01b039283166020918202929092010152600f5461372d9186918691869160019187911661554c565b60006019541161417b576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614186611c3a565b905080821080156141a2575060105461419f8284613b94565b10155b806141ad5750818111155b6141e9576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006141f66156fa565b91945092509050851561427e5760408051633b4da69f60e01b81526001600160a01b0385166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561426557600080fd5b505af1158015614279573d6000803e3d6000fd5b505050505b600080881161428e5760006142a4565b6013546142a4906001600160a01b031689615889565b9050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd6019546142d584615901565b60000361435c87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561432957600080fd5b505afa15801561433d573d6000803e3d6000fd5b505050506040513d602081101561435357600080fd5b50518a89615947565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b1580156143a057600080fd5b505af11580156143b4573d6000803e3d6000fd5b5050505060008811156144a857601954604080516313771f0760e31b815260048101929092523060248301526044820183905251735ef30b9986345249bc32d8928b7ee64de9435e3991639bb8f83891606480830192600092919082900301818387803b15801561442457600080fd5b505af1158015614438573d6000803e3d6000fd5b50506013546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b15801561448f57600080fd5b505af11580156144a3573d6000803e3d6000fd5b505050505b5050505050505050565b8015611b2a57600060606144c7858585612e3b565b91509150611375858585600185876144ea57600e546001600160a01b03166144f7565b600f546001600160a01b03165b61554c565b600b546000906001600160a01b0316331461454c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6009546001600160a01b0383811691161415614598576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156145de57600080fd5b505afa1580156145f2573d6000803e3d6000fd5b505050506040513d602081101561460857600080fd5b5051600b549091506110d3906001600160a01b0384811691168361405f565b60008115806146425750508082028282828161463f57fe5b04145b6125e9576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b61242e6111e6610ec0565b806146975761242e565b600019811061481757602354604080516370a0823160e01b815230600482015290516001600160a01b039092169163c32e72029183916370a0823191602480820192602092909190829003018186803b1580156146f357600080fd5b505afa158015614707573d6000803e3d6000fd5b505050506040513d602081101561471d57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925260006024830181905290516044808401936020939083900390910190829087803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b505050506040513d602081101561479357600080fd5b5050602554604080516370a0823160e01b81523060048201529051614812926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156147e157600080fd5b505afa1580156147f5573d6000803e3d6000fd5b505050506040513d602081101561480b57600080fd5b5051615a78565b61242e565b6000614822826110b1565b905061484b612710611075614844602954612710613de190919063ffffffff16565b8490613af9565b602554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561489c57600080fd5b505afa1580156148b0573d6000803e3d6000fd5b505050506040513d60208110156148c657600080fd5b5051905060008282106148da5760006148e4565b6148e48383613b94565b905080156149ff57602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561493757600080fd5b505afa15801561494b573d6000803e3d6000fd5b505050506040513d602081101561496157600080fd5b5051905060008282106149745782614976565b815b60235460408051636197390160e11b81526004810184905260006024820181905291519394506001600160a01b039092169263c32e7202926044808201936020939283900390910190829087803b1580156149d057600080fd5b505af11580156149e4573d6000803e3d6000fd5b505050506040513d60208110156149fa57600080fd5b505050505b61372d83615a78565b602554614a34906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006139d7565b602554614a61906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196139d7565b602154602554614a7f916001600160a01b03918216911660006139d7565b602154602554614a9e916001600160a01b0391821691166000196139d7565b565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b5051905080614b28575061242e565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6020811015614ba157600080fd5b505190506000614bb0826110b1565b90506000614bdb612710611075614bd4602a54612710613b9490919063ffffffff16565b8590613af9565b9050600083118015614bf25750614bf283826124d8565b15614cec57614bff615d90565b604051806080016040528060008152602001858152602001600081526020016000815250905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663384e03db602460009054906101000a90046001600160a01b031683856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b83811015614ca6578181015183820152602001614c8e565b505050509050018281526020019350505050600060405180830381600087803b158015614cd257600080fd5b505af1158015614ce6573d6000803e3d6000fd5b50505050505b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015614d3757600080fd5b505afa158015614d4b573d6000803e3d6000fd5b505050506040513d6020811015614d6157600080fd5b5051905080614da1576040805162461bcd60e51b81526020600482015260076024820152660857db1c105b5d60ca1b604482015290519081900360640190fd5b6021546022546040805163303acfe760e11b8152600481019290925260016024830152516001600160a01b03909216916360759fce916044808201926020929091908290030181600087803b158015614df957600080fd5b505af1158015614e0d573d6000803e3d6000fd5b505050506040513d60208110156144a857600080fd5b600060195411614e63576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601054614e71613680611c3a565b1015614eaf576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614ebc6156fa565b60135460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015614f1857600080fd5b505af1158015614f2c573d6000803e3d6000fd5b5050601954601354735ef30b9986345249bc32d8928b7ee64de9435e3993506345e6bdcd9250614f6e90614f69906001600160a01b03168a615889565b615901565b614f8f867319c0976f590d67707e62397c87829d896dc0f1f189888c615ba9565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614fd357600080fd5b505af1158015614fe7573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db66019543061501b88615cf8565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561506857600080fd5b505af115801561507c573d6000803e3d6000fd5b505060408051634538c4eb60e01b8152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290516001600160a01b0386169350634538c4eb92506044808301926020929190829003018186803b1580156150e057600080fd5b505afa1580156150f4573d6000803e3d6000fd5b505050506040513d602081101561510a57600080fd5b505161518457604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290516001600160a01b0384169163a3b22fc491602480830192600092919082900301818387803b15801561516b57600080fd5b505af115801561517f573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b8152306004820152602481018690529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b1580156151dd57600080fd5b505af11580156151f1573d6000803e3d6000fd5b505050505050505050565b60006110d06064611075612710611075615223601b54612710613de190919063ffffffff16565b601a546119dd908990613af9565b6060615286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aea9092919063ffffffff16565b805190915015611b2a578080602001905160208110156152a557600080fd5b5051611b2a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615df0602a913960400191505060405180910390fd5b60606152ed85615d10565b61533e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061537d5780518252601f19909201916020918201910161535e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146153df576040519150601f19603f3d011682016040523d82523d6000602084013e6153e4565b606091505b509150915081156153f8579150611c239050565b8051156154085780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561545257818101518382015260200161543a565b50505050905090810190601f16801561547f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600081836154dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b5060008385816154e857fe5b0495945050505050565b600081848411156155445760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b505050900390565b8315611b26576155676001600160a01b0387168260006139d7565b61557b6001600160a01b03871682866139d7565b806001600160a01b03166338ed173985858530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156155ff5781810151838201526020016155e7565b505050509050019650505050505050600060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561566557600080fd5b810190808051604051939291908464010000000082111561568557600080fd5b90830190602082018581111561569a57600080fd5b82518660208202830111640100000000821117156156b757600080fd5b82525081516020918201928201910280838360005b838110156156e45781810151838201526020016156cc565b5050505090500160405250505050505050505050565b6000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561575957600080fd5b505afa15801561576d573d6000803e3d6000fd5b505050506040513d602081101561578357600080fd5b5051604080516336569e7760e01b81529051735ef30b9986345249bc32d8928b7ee64de9435e39916336569e77916004808301926020929190829003018186803b1580156157d057600080fd5b505afa1580156157e4573d6000803e3d6000fd5b505050506040513d60208110156157fa57600080fd5b505160195460408051632c2cb9fd60e01b8152600481019290925251735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561585157600080fd5b505afa158015615865573d6000803e3d6000fd5b505050506040513d602081101561587b57600080fd5b505191945092509050909192565b6000611b6782846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156158ca57600080fd5b505af11580156158de573d6000803e3d6000fd5b505050506040513d60208110156158f457600080fd5b5051601203600a0a614627565b8060008112156110d3576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561598e57600080fd5b505afa1580156159a2573d6000803e3d6000fd5b505050506040513d60a08110156159b857600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b158015615a0f57600080fd5b505afa158015615a23573d6000803e3d6000fd5b505050506040513d6040811015615a3957600080fd5b50602001519050615a4d614f698784613b52565b925080831115615a6857615a6081615901565b600003615a6d565b826000035b979650505050505050565b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015615ac357600080fd5b505afa158015615ad7573d6000803e3d6000fd5b505050506040513d6020811015615aed57600080fd5b50519050801561280957808211615b045781615b06565b805b91506000615b31612710611075615b2a602b54612710613b9490919063ffffffff16565b8690613af9565b60248054604080516314f6943160e11b81526001600160a01b0390921660048301529181018690526001604482015260648101839052905191925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848082019260009290919082900301818387803b15801561404257600080fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015615bf257600080fd5b505af1158015615c06573d6000803e3d6000fd5b505050506040513d6020811015615c1c57600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b158015615c6e57600080fd5b505afa158015615c82573d6000803e3d6000fd5b505050506040513d6020811015615c9857600080fd5b50519050615ca584615cf8565b811015615ced57615cc5614f6983611075615cbf88615cf8565b85615d49565b9250615cd084615cf8565b615cda8484614627565b10615ce55782615cea565b826001015b92505b505095945050505050565b60006110d0826b033b2e3c9fd0803ce8000000614627565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c23575050151592915050565b808203828111156125e9576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b6040518060800160405280600490602082028036833750919291505056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c64736f6c634300060c0033

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

00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d04644200000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736

-----Decoded View---------------
Arg [0] : _governance (address): 0x43229759E12eFbe3e2A0fB0510B15e516d046442
Arg [1] : _strategist (address): 0x43229759E12eFbe3e2A0fB0510B15e516d046442
Arg [2] : _controller (address): 0x4bF5059065541A2B176500928e91FBfD0B121d07
Arg [3] : _timelock (address): 0x5DAe9B27313670663B34Ac8BfFD18825bB9Df736

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d046442
Arg [1] : 00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d046442
Arg [2] : 0000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d07
Arg [3] : 0000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736


Deployed Bytecode Sourcemap

47499:10992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33721:22;;;:::i;:::-;;;;-1:-1:-1;;;;;33721:22:0;;;;;;;;;;;;;;58233:134;;;:::i;:::-;;;;;;;;;;;;;;;;38559:176;;;:::i;48267:83::-;;;:::i;50459:128::-;;;;;;;;;;;;;;;;-1:-1:-1;50459:128:0;;:::i;:::-;;48189:71;;;:::i;36759:111::-;;;:::i;49145:42::-;;;:::i;21492:43::-;;;:::i;21630:31::-;;;:::i;24534:151::-;;;;;;;;;;;;;;;;-1:-1:-1;24534:151:0;;:::i;35699:225::-;;;:::i;21731:33::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;58375:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57532:146;;;;;;;;;;;;;;;;-1:-1:-1;57532:146:0;;:::i;33675:39::-;;;:::i;21939:19::-;;;:::i;22133:25::-;;;:::i;48744:69::-;;;:::i;26624:1064::-;;;;;;;;;;;;;;;;-1:-1:-1;26624:1064:0;;:::i;47787:44::-;;;:::i;47708:72::-;;;:::i;24154:177::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24154:177:0;;;;;;;;;;:::i;47954:46::-;;;:::i;33300:72::-;;;:::i;21965:73::-;;;:::i;57018:308::-;;;:::i;34262:44::-;;;:::i;51927:1682::-;;;:::i;36878:261::-;;;;;;;;;;;;;;;;-1:-1:-1;36878:261:0;;:::i;34006:24::-;;;:::i;56790:193::-;;;;;;;;;;;;;;;;-1:-1:-1;56790:193:0;-1:-1:-1;;;;;56790:193:0;;:::i;48007:43::-;;;:::i;21845:70::-;;;:::i;38743:330::-;;;;;;;;;;;;;;;;-1:-1:-1;38743:330:0;;:::i;22069:25::-;;;:::i;35933:457::-;;;:::i;21583:40::-;;;:::i;50021:163::-;;;;;;;;;;;;;;;;-1:-1:-1;50021:163:0;;;;;;;:::i;40180:99::-;;;;;;;;;;;;;;;;-1:-1:-1;40180:99:0;;:::i;48820:72::-;;;:::i;48063:82::-;;;:::i;48624:70::-;;;:::i;40402:107::-;;;;;;;;;;;;;;;;-1:-1:-1;40402:107:0;;:::i;22303:71::-;;;:::i;24856:167::-;;;;;;;;;;;;;;;;-1:-1:-1;24856:167:0;;:::i;23492:550::-;;;:::i;24693:155::-;;;;;;;;;;;;;;;;-1:-1:-1;24693:155:0;;:::i;21668:32::-;;;:::i;33221:72::-;;;:::i;28261:338::-;;;:::i;34128:29::-;;;:::i;21170:37::-;;;:::i;49034:38::-;;;:::i;25508:151::-;;;;;;;;;;;;;;;;-1:-1:-1;25508:151:0;-1:-1:-1;;;;;25508:151:0;;:::i;43986:540::-;;;:::i;49101:36::-;;;:::i;48358:83::-;;;:::i;57945:248::-;;;;;;;;;;;;;;;;-1:-1:-1;57945:248:0;;:::i;25667:168::-;;;;;;;;;;;;;;;;-1:-1:-1;25667:168:0;;;;:::i;57687:249::-;;;;;;;;;;;;;;;;-1:-1:-1;57687:249:0;;;;;;;:::i;42008:308::-;;;:::i;47879:68::-;;;:::i;50967:951::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50967:951:0;;;;;;;;;;;;;;;;;;;:::i;33750:31::-;;;:::i;25843:155::-;;;;;;;;;;;;;;;;-1:-1:-1;25843:155:0;-1:-1:-1;;;;;25843:155:0;;:::i;39414:729::-;;;:::i;48574:33::-;;;:::i;33918:38::-;;;:::i;21771:67::-;;;:::i;33870:41::-;;;:::i;29228:839::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29228:839:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25194:155;;;;;;;;;;;;;;;;-1:-1:-1;25194:155:0;-1:-1:-1;;;;;25194:155:0;;:::i;33049:82::-;;;:::i;34225:30::-;;;:::i;33519:76::-;;;:::i;37147:389::-;;;:::i;21456:29::-;;;:::i;50196:251::-;;;;;;;;;;;;;;;;-1:-1:-1;50196:251:0;;;;;;;:::i;22209:72::-;;;:::i;25357:143::-;;;;;;;;;;;;;;;;-1:-1:-1;25357:143:0;-1:-1:-1;;;;;25357:143:0;;:::i;33138:76::-;;;:::i;23295:118::-;;;:::i;25031:155::-;;;;;;;;;;;;;;;;-1:-1:-1;25031:155:0;-1:-1:-1;;;;;25031:155:0;;:::i;49280:41::-;;;:::i;57335:188::-;;;:::i;21366:30::-;;;:::i;44535:562::-;;;:::i;22165:23::-;;;:::i;48448:77::-;;;:::i;33643:25::-;;;:::i;47626:75::-;;;:::i;49221:40::-;;;:::i;21078:45::-;;;;;;;;;;;;;;;;-1:-1:-1;21078:45:0;-1:-1:-1;;;;;21078:45:0;;:::i;24339:187::-;;;;;;;;;;;;;;;;-1:-1:-1;24339:187:0;;:::i;36403:319::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48956:40;;;:::i;47838:34::-;;;:::i;40289:103::-;;;;;;;;;;;;;;;;-1:-1:-1;40289:103:0;;:::i;33788:28::-;;;:::i;33464:48::-;;;:::i;37780:569::-;;;;;;;;;;;;;;;;-1:-1:-1;37780:569:0;;;;;;;;;:::i;22101:25::-;;;:::i;33379:78::-;;;:::i;33721:22::-;;;-1:-1:-1;;;;;33721:22:0;;:::o;58233:134::-;58326:10;;58307:52;;;-1:-1:-1;;;58307:52:0;;58353:4;58307:52;;;;;;58280:7;;-1:-1:-1;;;;;58326:10:0;;58307:37;;:52;;;;;;;;;;;;;;58326:10;58307:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58307:52:0;;-1:-1:-1;58233:134:0;;:::o;38559:176::-;38606:7;38626:21;38650:22;:20;:22::i;:::-;38626:46;;38690:37;38707:13;38722:4;38690:16;:37::i;:::-;38683:44;;;38559:176;:::o;48267:83::-;48308:42;48267:83;:::o;50459:128::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50545:21:::1;:34:::0;50459:128::o;48189:71::-;;;-1:-1:-1;;;;;48189:71:0;;:::o;36759:111::-;36814:7;36840:22;:20;:22::i;:::-;36833:29;;36759:111;:::o;49145:42::-;;;;:::o;21492:43::-;21529:6;21492:43;:::o;21630:31::-;;;;:::o;24534:151::-;24620:8;;-1:-1:-1;;;;;24620:8:0;24606:10;:22;24598:44;;;;;-1:-1:-1;;;24598:44:0;;;;;;;;;;;;-1:-1:-1;;;24598:44:0;;;;;;;;;;;;;;;24653:10;:24;24534:151::o;35699:225::-;35752:7;35773:11;33330:42;-1:-1:-1;;;;;35790:17:0;;35808:13;;33089:42;-1:-1:-1;;;;;35823:31:0;;35855:5;;35823:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35823:38:0;35790:72;;;-1:-1:-1;;;;;;35790:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35790:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35790:72:0;35888:17;;35790:72;;-1:-1:-1;35880:36:0;;35911:4;;35880:26;;35790:72;;35880:7;:26::i;:::-;:30;;:36::i;21731:33::-;;;;;;:::o;58375:113::-;58452:28;;;;;;;;;;;;-1:-1:-1;;;58452:28:0;;;;58375:113;:::o;57532:146::-;57599:7;57626:44;57649:20;:18;:20::i;:::-;57626:18;:8;57639:4;57626:12;:18::i;:44::-;57619:51;;57532:146;;;;:::o;33675:39::-;;;;:::o;21939:19::-;;;-1:-1:-1;;;;;21939:19:0;;:::o;22133:25::-;;;-1:-1:-1;;;;;22133:25:0;;:::o;48744:69::-;;;-1:-1:-1;;;;;48744:69:0;;:::o;26624:1064::-;26701:10;;-1:-1:-1;;;;;26701:10:0;26687;:24;26679:48;;;;;-1:-1:-1;;;26679:48:0;;;;;;;;;;;;-1:-1:-1;;;26679:48:0;;;;;;;;;;;;;;;26764:4;;26757:37;;;-1:-1:-1;;;26757:37:0;;26788:4;26757:37;;;;;;26738:16;;-1:-1:-1;;;;;26764:4:0;;26757:22;;:37;;;;;;;;;;;;;;26764:4;26757:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26757:37:0;;-1:-1:-1;26809:18:0;;;26805:143;;;26854:36;26868:21;:7;26880:8;26868:11;:21::i;:::-;26854:13;:36::i;:::-;26844:46;-1:-1:-1;26915:21:0;26844:46;26927:8;26915:11;:21::i;:::-;26905:31;;26805:143;26964:15;26995:1;26982:10;;:14;:59;;27040:1;26982:59;;;26998:39;21529:6;26998:23;27010:10;;26998:7;:11;;:23;;;;:::i;:39::-;26964:77;;27052:20;27089:1;27075:11;;:15;:62;;27136:1;27075:62;;;27092:41;21441:6;27092:24;27104:11;;27092:7;:11;;:24;;;;:::i;:41::-;27179:10;;27206:4;;27167:45;;;-1:-1:-1;;;27167:45:0;;-1:-1:-1;;;;;27206:4:0;;;27167:45;;;;;;27052:85;;-1:-1:-1;27150:14:0;;27179:10;;;;;27167:30;;:45;;;;;;;;;;;;;;27179:10;27167:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27167:45:0;27229:14;;27167:45;;-1:-1:-1;27229:14:0;;:22;;:14;:22;:59;;;;;27266:1;27256:7;:11;:31;;;;27286:1;27271:12;:16;27256:31;27225:260;;;27306:25;;27359:48;27381:25;:7;27393:12;27381:11;:25::i;:::-;27359:21;:48::i;:::-;27305:102;;;;27422:51;27439:17;27458:14;27422:16;:51::i;:::-;27225:260;;;27518:1;27508:7;:11;:44;;27545:7;27508:44;;;27522:20;:7;27534;27522:11;:20::i;:::-;27498:54;;27588:1;27573:12;:16;:54;;27620:7;27573:54;;;27592:25;:7;27604:12;27592:11;:25::i;:::-;27645:4;;27563:64;;-1:-1:-1;27638:42:0;;-1:-1:-1;;;;;27645:4:0;27664:6;27563:64;27638:25;:42::i;:::-;26624:1064;;;;;:::o;47787:44::-;;;;:::o;47708:72::-;;;-1:-1:-1;;;;;47708:72:0;;:::o;24154:177::-;24253:10;;-1:-1:-1;;;;;24253:10:0;24239;:24;24231:48;;;;;-1:-1:-1;;;24231:48:0;;;;;;;;;;;;-1:-1:-1;;;24231:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24290:22:0;;;;:13;:22;;;;;;;;;;:33;;-1:-1:-1;;24290:33:0;;;;;;;;;;24154:177::o;47954:46::-;47999:1;47954:46;:::o;33300:72::-;33330:42;33300:72;:::o;21965:73::-;21996:42;21965:73;:::o;57018:308::-;57123:10;;57104:55;;;-1:-1:-1;;;57104:55:0;;57153:4;57104:55;;;;;;57069:7;;;;-1:-1:-1;;;;;57123:10:0;;;;57104:40;;:55;;;;;;;;;;;;;;;57123:10;57104:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57104:55:0;57195:12;;57188:45;;;-1:-1:-1;;;57188:45:0;;57227:4;57188:45;;;;;;57104:55;;-1:-1:-1;57178:56:0;;-1:-1:-1;;;;;57195:12:0;;;;57188:30;;:45;;;;;57104:55;;57188:45;;;;;;;;57195:12;57188:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57188:45:0;57178:5;;:9;:56::i;:::-;57170:64;;57252:66;57299:18;57311:5;57299:11;:18::i;:::-;57252:42;;;-1:-1:-1;;;57252:42:0;;57288:4;57252:42;;;;;;-1:-1:-1;;;;;;;;;;;33415:42:0;57252:27;;:42;;;;;;;;;;;;;;33415;57252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57252:42:0;;:46;:66::i;34262:44::-;34301:5;34262:44;:::o;51927:1682::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;52042:10:::1;::::0;52023:61:::1;::::0;;-1:-1:-1;;;52023:61:0;;52072:4:::1;52023:61;::::0;::::1;::::0;52042:10;52023:61;;;;;;-1:-1:-1;;;;;52042:10:0;;::::1;::::0;52023:40:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;52042:10:::1;::::0;52023:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52120:47:0::1;::::0;;-1:-1:-1;;;52120:47:0;;52161:4:::1;52120:47;::::0;::::1;::::0;;;52099:18:::1;::::0;48308:42:::1;::::0;52120:32:::1;::::0;:47;;;;;52023:61:::1;::::0;52120:47;;;;;;;;48308:42;52120:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52120:47:0;52199::::1;::::0;;-1:-1:-1;;;52199:47:0;;52240:4:::1;52199:47;::::0;::::1;::::0;;;52120;;-1:-1:-1;52178:18:0::1;::::0;48399:42:::1;::::0;52199:32:::1;::::0;:47;;;;;52120::::1;::::0;52199;;;;;;;48399:42;52199:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52199:47:0;;-1:-1:-1;52263:14:0;;52259:98:::1;;52294:51;48308:42;21996;52334:10;52294:17;:51::i;:::-;52373:14:::0;;52369:98:::1;;52404:51;48399:42;21996;52444:10;52404:17;:51::i;:::-;52503:37;::::0;;-1:-1:-1;;;52503:37:0;;52534:4:::1;52503:37;::::0;::::1;::::0;;;52481:19:::1;::::0;21996:42:::1;::::0;52503:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;21996:42;52503:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52503:37:0;;-1:-1:-1;52555:15:0;;52551:1051:::1;;52632:42;::::0;;-1:-1:-1;;;52632:42:0;;52668:4:::1;52632:42;::::0;::::1;::::0;;;52613:16:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52632:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;52632;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52632:42:0;52740:14:::1;::::0;52632:42;;-1:-1:-1;52689:84:0::1;::::0;21996:42:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52724:48:::1;::::0;49378:5:::1;::::0;52724:31:::1;::::0;:11;;:15:::1;:31::i;:48::-;52689:17;:84::i;:::-;52811:42;::::0;;-1:-1:-1;;;52811:42:0;;52847:4:::1;52811:42;::::0;::::1;::::0;;;52788:21:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52811:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;52811;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52811:42:0;52954:14:::1;::::0;52930:18:::1;::::0;52811:42;;-1:-1:-1;52868:102:0::1;::::0;52893:1:::1;::::0;52896:73:::1;::::0;:53:::1;::::0;52897:27:::1;52811:42:::0;52915:8;52897:17:::1;:27::i;:::-;52896:33:::0;::::1;:53::i;:73::-;52868:24;:102::i;:::-;53040:14;::::0;::::1;;:22;;:14:::0;:22:::1;53036:199;;;53082:24;53109:51;21255:6;53109:31;53125:14;;53109:11;:15;;:31;;;;:::i;:51::-;53082:78;;53179:40;21996:42;53202:16;53179;:40::i;:::-;53036:199;;53283:4;::::0;53289:37:::1;::::0;;-1:-1:-1;;;53289:37:0;;53320:4:::1;53289:37;::::0;::::1;::::0;;;53264:63:::1;::::0;21996:42:::1;::::0;-1:-1:-1;;;;;53283:4:0;;::::1;::::0;21996:42;;53289:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;21996:42;53289:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53289:37:0;53264:12:::1;:63::i;:::-;53342:16;53361:15;:13;:15::i;:::-;53342:34:::0;-1:-1:-1;53395:12:0;;53391:200:::1;;53446:12;53427:16;:31:::0;53477:17:::1;:28:::0;;;53524:9:::1;:7;:9::i;:::-;53558:17;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;53391:200;52551:1051;;;;23089:1;;;51927:1682::o:0;36878:261::-;36947:7;36966:23;36992:26;:24;:26::i;:::-;36966:52;;37036:95;37108:22;;37036:67;37085:17;;37036:44;37075:4;37036:34;37054:15;37036:13;:17;;:34;;;;:::i;:95::-;37029:102;36878:261;-1:-1:-1;;;36878:261:0:o;34006:24::-;;;;:::o;56790:193::-;56905:12;;56850:15;;-1:-1:-1;;;;;56886:31:0;;;56905:12;;56886:31;;56878:57;;;;;-1:-1:-1;;;56878:57:0;;;;;;;;;;;;-1:-1:-1;;;56878:57:0;;;;;;;;;;;;;;;56946:29;56968:6;56946:21;:29::i;:::-;;56790:193;;;:::o;48007:43::-;48045:5;48007:43;:::o;21845:70::-;;;-1:-1:-1;;;;;21845:70:0;;:::o;38743:330::-;38820:7;38840:23;38866:22;:20;:22::i;:::-;38840:48;;38899:21;38947:15;38923:20;:39;;:86;;38968:41;:15;38988:20;38968:19;:41::i;:::-;38923:86;;;38964:1;38923:86;38899:110;;39027:38;39044:13;39059:5;39027:16;:38::i;:::-;39020:45;38743:330;-1:-1:-1;;;;38743:330:0:o;22069:25::-;;;-1:-1:-1;;;;;22069:25:0;;:::o;35933:457::-;35980:7;36000:18;33089:42;-1:-1:-1;;;;;36021:31:0;;36053:5;;36021:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36021:38:0;36106:13;;36088:44;;;-1:-1:-1;;;36088:44:0;;;;;;;;;-1:-1:-1;;;;;36088:44:0;;;;;;;;36021:38;;-1:-1:-1;36073:11:0;;33330:42;;36088:17;;:44;;;;;;;;;;;;33330:42;36088:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36088:44:0;;;36186:13;;36088:44;36168:32;;-1:-1:-1;;;36168:32:0;;;;;;;;;;36088:44;;-1:-1:-1;36146:12:0;;33330:42;;36168:17;;:32;;;;;;;;;;;;;;33330:42;36168:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36168:32:0;;;;-1:-1:-1;36211:8:0;36222:14;36226:3;36168:32;36222:3;:14::i;:::-;36211:25;-1:-1:-1;36251:8:0;36247:49;;36283:1;36276:8;;;;;;;;36247:49;36306:11;34336:8;36320:3;:9;36306:23;;36363:3;36347:13;36351:3;34336:8;36347:3;:13::i;:::-;:19;:35;;36379:3;36347:35;;;36369:3;36375:1;36369:7;36347:35;36340:42;;;;;;;35933:457;:::o;21583:40::-;;;;:::o;50021:163::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50111:20:::1;:26:::0;;;;50148:21:::1;:28:::0;50021:163::o;40180:99::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40253:7:::1;:18:::0;40180:99::o;48820:72::-;;;-1:-1:-1;;;;;48820:72:0;;:::o;48063:82::-;48103:42;48063:82;:::o;48624:70::-;;;-1:-1:-1;;;;;48624:70:0;;:::o;40402:107::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40479:9:::1;:22:::0;40402:107::o;22303:71::-;;;-1:-1:-1;;;;;22303:71:0;;:::o;24856:167::-;24950:8;;-1:-1:-1;;;;;24950:8:0;24936:10;:22;24928:44;;;;;-1:-1:-1;;;24928:44:0;;;;;;;;;;;;-1:-1:-1;;;24928:44:0;;;;;;;;;;;;;;;24983:14;:32;24856:167::o;23492:550::-;23641:18;;23534:7;;;;23614:12;;23641:22;;;;:47;;;23687:1;23667:17;;:21;23641:47;:106;;;;-1:-1:-1;23729:18:0;;23709:16;;23692:34;;:12;;:16;:34::i;:::-;:55;23641:106;23637:324;;;23763:17;23783:58;23828:12;23783:40;23804:18;;23783:16;;:20;;:40;;;;:::i;:::-;:44;;:58::i;:::-;23763:78;;23873:76;23944:4;23873:66;23920:18;;23873:42;23910:4;23873:32;23895:9;23873:17;;:21;;:32;;;;:::i;:76::-;23856:93;;23637:324;;23978:56;24019:14;23978:36;23998:15;:13;:15::i;:::-;23978;:13;:15::i;:::-;:19;;:36::i;:56::-;23971:63;;;;23492:550;:::o;24693:155::-;24781:8;;-1:-1:-1;;;;;24781:8:0;24767:10;:22;24759:44;;;;;-1:-1:-1;;;24759:44:0;;;;;;;;;;;;-1:-1:-1;;;24759:44:0;;;;;;;;;;;;;;;24814:11;:26;24693:155::o;21668:32::-;;;;:::o;33221:72::-;33251:42;33221:72;:::o;28261:338::-;28352:10;;28302:15;;-1:-1:-1;;;;;28352:10:0;28338;:24;28330:48;;;;;-1:-1:-1;;;28330:48:0;;;;;;;;;;;;-1:-1:-1;;;28330:48:0;;;;;;;;;;;;;;;28389:14;:12;:14::i;:::-;28433:4;;28426:37;;;-1:-1:-1;;;28426:37:0;;28457:4;28426:37;;;;;;-1:-1:-1;;;;;28433:4:0;;;;28426:22;;:37;;;;;;;;;;;;;;;28433:4;28426:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28426:37:0;28505:10;;28532:4;;28493:45;;;-1:-1:-1;;;28493:45:0;;-1:-1:-1;;;;;28532:4:0;;;28493:45;;;;;;28426:37;;-1:-1:-1;28476:14:0;;28505:10;;;;;28493:30;;:45;;;;;28426:37;;28493:45;;;;;;;28505:10;28493:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28493:45:0;28556:4;;28493:45;;-1:-1:-1;28549:42:0;;-1:-1:-1;;;;;28556:4:0;28493:45;28583:7;28549:25;:42::i;:::-;28261:338;;:::o;34128:29::-;;;;:::o;21170:37::-;;;;:::o;49034:38::-;;;;:::o;25508:151::-;25594:8;;-1:-1:-1;;;;;25594:8:0;25580:10;:22;25572:44;;;;;-1:-1:-1;;;25572:44:0;;;;;;;;;;;;-1:-1:-1;;;25572:44:0;;;;;;;;;;;;;;;25627:10;:24;;-1:-1:-1;;;;;;25627:24:0;-1:-1:-1;;;;;25627:24:0;;;;;;;;;;25508:151::o;43986:540::-;23170:10;;-1:-1:-1;;;;;23170:10:0;23156;:24;;:52;;-1:-1:-1;23198:10:0;;-1:-1:-1;;;;;23198:10:0;23184;:24;23156:52;:81;;;-1:-1:-1;23226:10:0;23212:13;:25;;;;;;;;;;;;;23156:81;23148:90;;;;;;44050:24:::1;44077:19;44094:1;44077:16;:19::i;:::-;44050:46:::0;-1:-1:-1;44111:20:0;;44107:412:::1;;44147:30;44160:16;44147:12;:30::i;:::-;44206:42;::::0;;-1:-1:-1;;;44206:42:0;;44242:4:::1;44206:42;::::0;::::1;::::0;;;44192:11:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;44206:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;44206;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44206:42:0;;-1:-1:-1;44271:23:0;;::::1;;44263:55;;;::::0;;-1:-1:-1;;;44263:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44263:55:0;;;;;;;;;;;;;::::1;;44338:45;44363:1;44366:16;44338:24;:45::i;:::-;44398:17;44418:14;:12;:14::i;:::-;44468:8;::::0;44398:34;;-1:-1:-1;44468:15:0::1;::::0;44481:1:::1;44468:12;:15::i;:::-;44455:9;:28;;44447:60;;;::::0;;-1:-1:-1;;;44447:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44447:60:0;;;;;;;;;;;;;::::1;44107:412;23249:1;43986:540::o:0;49101:36::-;;;;:::o;48358:83::-;48399:42;48358:83;:::o;57945:248::-;58006:7;58030:14;58026:54;;-1:-1:-1;58067:1:0;58060:8;;58026:54;58090:18;58111:45;58151:4;58111:35;58136:9;58111:20;:18;:20::i;25667:168::-;25758:10;;-1:-1:-1;;;;;25758:10:0;25744;:24;25736:48;;;;;-1:-1:-1;;;25736:48:0;;;;;;;;;;;;-1:-1:-1;;;25736:48:0;;;;;;;;;;;;;;;25795:14;:32;;-1:-1:-1;;25795:32:0;;;;;;;;;;25667:168::o;57687:249::-;57770:4;57786:25;;:::i;:::-;:47;;;;;;;;57815:1;57786:47;;;;57818:8;57786:47;;;;57828:1;57786:47;;;;57831:1;57786:47;;;;;57920:8;48483:42;-1:-1:-1;;;;;57851:39:0;;57891:9;;;;;;;;;-1:-1:-1;;;;;57891:9:0;57902:7;57911:4;57851:65;;;;;;;;;;;;;-1:-1:-1;;;;;57851:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57851:65:0;:77;;;-1:-1:-1;;57687:249:0;;;;;:::o;42008:308::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;42069:5:::1;::::0;:10;42061:40:::1;;;::::0;;-1:-1:-1;;;42061:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42061:40:0;;;;;;;;;;;;;::::1;;42156:13;::::0;42124:61:::1;::::0;;-1:-1:-1;;;42124:61:0;;::::1;::::0;::::1;::::0;;;;42179:4:::1;42124:61:::0;;;;;33089:42:::1;::::0;42124:31:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;-1:-1:-1;33089:42:0;42124:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42124:61:0;42116:5:::1;:69:::0;42209:10:::1;::::0;42229:7:::1;::::0;42202:48:::1;::::0;;-1:-1:-1;;;42202:48:0;;-1:-1:-1;;;;;42229:7:0;;::::1;42202:48;::::0;::::1;::::0;-1:-1:-1;;42202:48:0;;;;;;42209:10;;;::::1;::::0;42202:26:::1;::::0;:48;;;;;42124:61:::1;::::0;42202:48;;;;;;;42209:10:::1;::::0;42202:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42261:47:0::1;::::0;;-1:-1:-1;;;42261:47:0;;33172:42:::1;42261:47;::::0;::::1;::::0;-1:-1:-1;;42261:47:0;;;;;;-1:-1:-1;;;;;;;;;;;33415:42:0;42261:25:::1;::::0;:47;;;;;42202:48:::1;::::0;42261:47;;;;;;;-1:-1:-1;33415:42:0;42261:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42008:308:0:o;47879:68::-;;;-1:-1:-1;;;;;47879:68:0;;:::o;50967:951::-;51096:8;;-1:-1:-1;;;;;51096:8:0;51082:10;:22;51074:44;;;;;-1:-1:-1;;;51074:44:0;;;;;;;;;;;;-1:-1:-1;;;51074:44:0;;;;;;;;;;;;;;;51208:10;;51189:55;;;-1:-1:-1;;;51189:55:0;;51238:4;51189:55;;;;;;51247:1;;-1:-1:-1;;;;;51208:10:0;;51189:40;;:55;;;;;;;;;;;;;;51208:10;51189:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51189:55:0;:59;51185:323;;;51264:25;-1:-1:-1;;51264:12:0;:25::i;:::-;51331:10;;51312:55;;;-1:-1:-1;;;51312:55:0;;51361:4;51312:55;;;;;;-1:-1:-1;;;;;51331:10:0;;;;51312:40;;:55;;;;;;;;;;;;;;;51331:10;51312:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51312:55:0;:60;51304:94;;;;;-1:-1:-1;;;51304:94:0;;;;;;;;;;;;-1:-1:-1;;;51304:94:0;;;;;;;;;;;;;;;51428:12;;51421:45;;;-1:-1:-1;;;51421:45:0;;51460:4;51421:45;;;;;;-1:-1:-1;;;;;51428:12:0;;;;51421:30;;:45;;;;;;;;;;;;;;;51428:12;51421:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51421:45:0;:50;51413:83;;;;;-1:-1:-1;;;51413:83:0;;;;;;;;;;;;-1:-1:-1;;;51413:83:0;;;;;;;;;;;;;;;51564:9;:25;;-1:-1:-1;;;;;51564:25:0;;;-1:-1:-1;;;;;;51564:25:0;;;;;;;51600:12;:26;;;;;;;;;;;51637:10;:27;;;;;;;;;;;;;;;51691:36;;;-1:-1:-1;;;51691:36:0;;;;51710:10;;;;;51691:34;;:36;;;;;;;;;;;;;;51710:10;51691:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51691:36:0;51675:13;:52;51779:21;:19;:21::i;:::-;51867:42;;;-1:-1:-1;;;51867:42:0;;51903:4;51867:42;;;;;;51855:55;;-1:-1:-1;;;;;;;;;;;33415:42:0;51867:27;;:42;;;;;;;;;;;;;;;33415;51867;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51867:42:0;51855:11;:55::i;33750:31::-;;;-1:-1:-1;;;;;33750:31:0;;:::o;25843:155::-;25929:10;;-1:-1:-1;;;;;25929:10:0;25915;:24;25907:48;;;;;-1:-1:-1;;;25907:48:0;;;;;;;;;;;;-1:-1:-1;;;25907:48:0;;;;;;;;;;;;;;;25966:10;:24;;-1:-1:-1;;;;;;25966:24:0;-1:-1:-1;;;;;25966:24:0;;;;;;;;;;25843:155::o;39414:729::-;39498:16;;39471:7;;-1:-1:-1;;;;;39498:16:0;39490:61;;;;;-1:-1:-1;;;39490:61:0;;;;;;;;;;;;-1:-1:-1;;;39490:61:0;;;;;;;;;;;;;;;39578:14;39608:9;39632:14;39661;39690:22;39726:9;;;;;;;;;-1:-1:-1;;;;;39726:9:0;-1:-1:-1;;;;;39726:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39726:27:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39726:27:0;;-1:-1:-1;39726:27:0;-1:-1:-1;39726:27:0;;-1:-1:-1;39726:27:0;-1:-1:-1;39780:1:0;39772:9;;39768:368;;;39834:18;;39814:1;;39834:18;;39830:125;;;33553:42;-1:-1:-1;;;;;39888:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39888:48:0;;;;-1:-1:-1;39830:125:0;40055:18;;39976:108;;40055:18;;:28;;40082:1;40055:28;;;40075:4;40055:28;39976:108;;:74;40046:3;39976:65;40031:8;39976:42;39995:22;;39984:5;39976:18;;:42;;;;:::i;:108::-;39969:115;;;;;;;;;;39768:368;40123:1;40116:8;;;;;;;;;48574:33;;;;:::o;33918:38::-;;;;;;:::o;21771:67::-;;;;;;-1:-1:-1;;;;;21771:67:0;;:::o;33870:41::-;;;;:::o;29228:839::-;29447:16;;;29461:1;29447:16;;;29332:25;29447:16;;;;;29317:13;;29332:25;;;;;;29447:16;;;;;;;;;;-1:-1:-1;29447:16:0;29440:23;;29484:5;29474:4;29479:1;29474:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;29474:15:0;;;-1:-1:-1;;;;;29474:15:0;;;;;29510:3;29500:4;29505:1;29500:7;;;;;;;;-1:-1:-1;;;;;29500:13:0;;;;:7;;;;;;;;;;:13;29538:16;;;29552:1;29538:16;;;;;;;;;;29552:1;;29538:16;;;;;;;;;;-1:-1:-1;29538:16:0;29526:28;;29580:5;29565:9;29575:1;29565:12;;;;;;;;;;;;;:20;-1:-1:-1;;;;;29565:20:0;;;-1:-1:-1;;;;;29565:20:0;;;;;29611:3;29596:9;29606:1;29596:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;29596:18:0;;;-1:-1:-1;;;;;29596:18:0;;;;;29627:17;29666:1;29647:9;:16;:20;:110;;29756:1;29647:110;;;29685:11;;29669:62;;;-1:-1:-1;;;29669:62:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29685:11:0;;;;29669:42;;29712:7;;29721:9;;29669:62;;;;;;;;;;;;;;;29685:11;29669:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29669:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29669:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29751:1;29732:9;:16;:20;29669:84;;;;;;;;;;;;;;29647:110;29627:130;;29768:15;29805:1;29786:9;:16;:20;:101;;29886:1;29786:101;;;29824:12;;29808:58;;;-1:-1:-1;;;29808:58:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29824:12:0;;;;29808:43;;29852:7;;29861:4;;29808:58;;;;;;;;;;;;;;;29824:12;29808:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29808:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29808:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29881:1;29867:4;:11;:15;29808:75;;;;;;;;;;;;;;29786:101;29768:119;;29900:13;29928:7;29916:9;:19;:33;;29944:5;29916:33;;;29937:4;29916:33;29900:49;;29962:25;29990:8;:27;;30013:4;29990:27;;;30001:9;29990:27;30040:8;;;;-1:-1:-1;29228:839:0;;-1:-1:-1;;;;;;;;;29228:839:0:o;25194:155::-;25280:10;;-1:-1:-1;;;;;25280:10:0;25266;:24;25258:48;;;;;-1:-1:-1;;;25258:48:0;;;;;;;;;;;;-1:-1:-1;;;25258:48:0;;;;;;;;;;;;;;;25317:10;:24;;-1:-1:-1;;;;;;25317:24:0;-1:-1:-1;;;;;25317:24:0;;;;;;;;;;25194:155::o;33049:82::-;33089:42;33049:82;:::o;34225:30::-;;;;:::o;33519:76::-;33553:42;33519:76;:::o;37147:389::-;37192:7;37213:19;37243:1;37235:5;;:9;:37;;37271:1;37235:37;;;37246:22;:20;:22::i;:::-;37213:59;-1:-1:-1;37287:15:0;;37283:246;;37318:21;37342:37;37375:3;37342:28;37358:11;37342:15;:28::i;:37::-;37318:61;;37394:15;37412:16;:14;:16::i;:::-;37394:34;-1:-1:-1;37452:26:0;:13;37394:34;37452:17;:26::i;:::-;37445:33;;;;;;;37283:246;37516:1;37509:8;;;;;21456:29;;;;:::o;50196:251::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50298:18:::1;:33:::0;;;50342:16:::1;:29:::0;;;50399:40:::1;50319:12:::0;50361:10;50399:22:::1;:40::i;:::-;50382:14;:57:::0;-1:-1:-1;;50196:251:0:o;22209:72::-;;;-1:-1:-1;;;;;22209:72:0;;:::o;25357:143::-;25439:8;;-1:-1:-1;;;;;25439:8:0;25425:10;:22;25417:44;;;;;-1:-1:-1;;;25417:44:0;;;;;;;;;;;;-1:-1:-1;;;25417:44:0;;;;;;;;;;;;;;;25472:8;:20;;-1:-1:-1;;;;;;25472:20:0;-1:-1:-1;;;;;25472:20:0;;;;;;;;;;25357:143::o;33138:76::-;33172:42;33138:76;:::o;23295:118::-;23375:4;;23368:37;;;-1:-1:-1;;;23368:37:0;;23399:4;23368:37;;;;;;23341:7;;-1:-1:-1;;;;;23375:4:0;;23368:22;;:37;;;;;;;;;;;;;;23375:4;23368:37;;;;;;;;;;25031:155;25117:10;;-1:-1:-1;;;;;25117:10:0;25103;:24;25095:48;;;;;-1:-1:-1;;;25095:48:0;;;;;;;;;;;;-1:-1:-1;;;25095:48:0;;;;;;;;;;;;;;;25154:10;:24;;-1:-1:-1;;;;;;25154:24:0;-1:-1:-1;;;;;25154:24:0;;;;;;;;;;25031:155::o;49280:41::-;;;;:::o;57335:188::-;57386:7;57413:102;57510:4;57413:92;48103:42;-1:-1:-1;;;;;57459:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57459:45:0;57424:9;;57413:41;;;-1:-1:-1;;;57413:41:0;;;;-1:-1:-1;;;;;57424:9:0;;;;57413:39;;:41;;;;;57459:45;;57413:41;;;;;;;;57424:9;57413:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57413:41:0;;:45;:92::i;21366:30::-;;;;:::o;44535:562::-;44581:13;44597:15;:13;:15::i;:::-;44581:31;;44626:19;44649:10;:8;:10::i;:::-;44623:36;;;;44682:1;44674:5;:9;:27;;;;;44687:14;44674:27;44670:420;;;44719:16;44738:57;44755:33;44765:22;:20;:22::i;:::-;44755:5;;:9;:33::i;:::-;44790:4;44738:16;:57::i;:::-;44719:76;;44824:1;44813:8;:12;:57;;;;;44863:7;;44829:30;44842:16;:14;:16::i;:::-;44829:8;;:12;:30::i;:::-;:41;;44813:57;44810:269;;;44889:39;44912:5;44919:8;44889:22;:39::i;:::-;44960:42;;;-1:-1:-1;;;44960:42:0;;44996:4;44960:42;;;;;;44946:11;;-1:-1:-1;;;;;;;;;;;33415:42:0;44960:27;;:42;;;;;;;;;;;;;;;33415;44960;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44960:42:0;;-1:-1:-1;45020:43:0;45032:14;;;:30;;45054:8;45032:30;;;45048:3;45032:30;45020:11;:43::i;:::-;44810:269;44670:420;44535:562;;:::o;22165:23::-;;;-1:-1:-1;;;;;22165:23:0;;:::o;48448:77::-;48483:42;48448:77;:::o;33643:25::-;;;-1:-1:-1;;;;;33643:25:0;;:::o;47626:75::-;;;-1:-1:-1;;;;;47626:75:0;;:::o;49221:40::-;;;;:::o;21078:45::-;;;;;;;;;;;;;;;;:::o;24339:187::-;24441:10;;-1:-1:-1;;;;;24441:10:0;24427;:24;24419:48;;;;;-1:-1:-1;;;24419:48:0;;;;;;;;;;;;-1:-1:-1;;;24419:48:0;;;;;;;;;;;;;;;24478:18;:40;24339:187::o;36403:319::-;36443:7;36452;36461:4;36478:11;36491:12;36505;33330:42;-1:-1:-1;;;;;36522:17:0;;36540:13;;36522:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36522:32:0;;;;;;;;;;;;;-1:-1:-1;36522:32:0;;-1:-1:-1;36522:32:0;-1:-1:-1;36565:19:0;36587:22;34336:8;36587:13;36522:32;;36587:7;:13::i;:22::-;36565:44;-1:-1:-1;36620:15:0;36638:13;:4;34336:8;36638;:13::i;:::-;36670:11;;;;-1:-1:-1;;36692:21:0;;;;-1:-1:-1;36403:319:0;-1:-1:-1;;;;36403:319:0:o;48956:40::-;;;;:::o;47838:34::-;;;;:::o;40289:103::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40364:8:::1;:20:::0;40289:103::o;33788:28::-;;;;:::o;33464:48::-;;;;:::o;37780:569::-;37863:7;37883:15;37917:1;37901:13;:17;:111;;38011:1;37901:111;;;37920:88;37973:34;34301:5;37973:20;:34::i;:::-;37920:48;34301:5;37920:30;37936:13;37920:15;:30::i;:88::-;37883:129;;38027:15;38045:16;:14;:16::i;:::-;38027:34;;38076:12;38117:6;:28;;;;;38138:7;38127;:18;;38117:28;38113:181;;;38168:20;:7;38180;38168:11;:20::i;:::-;38161:27;;38113:181;;;38211:6;38210:7;:29;;;;;38232:7;38221;:18;;38210:29;38206:88;;;38262:20;:7;38274;38262:11;:20::i;:::-;38255:27;;38206:88;38329:1;38322:4;:8;38321:20;;38340:1;38321:20;;;38333:4;38321:20;38314:27;37780:569;-1:-1:-1;;;;;;37780:569:0:o;22101:25::-;;;-1:-1:-1;;;;;22101:25:0;;:::o;33379:78::-;-1:-1:-1;;;;;;;;;;;33379:78:0;:::o;17734:622::-;18104:10;;;18103:62;;-1:-1:-1;18120:39:0;;;-1:-1:-1;;;18120:39:0;;18144:4;18120:39;;;;-1:-1:-1;;;;;18120:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18120:39:0;:44;18103:62;18095:152;;;;-1:-1:-1;;;18095:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18285:62;;;-1:-1:-1;;;;;18285:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18285:62:0;-1:-1:-1;;;18285:62:0;;;18258:90;;18278:5;;18258:19;:90::i;6027:196::-;6130:12;6162:53;6185:6;6193:4;6199:1;6202:12;6162:22;:53::i;1644:471::-;1702:7;1947:6;1943:47;;-1:-1:-1;1977:1:0;1970:8;;1943:47;2014:5;;;2018:1;2014;:5;:1;2038:5;;;;;:10;2030:56;;;;-1:-1:-1;;;2030:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2591:132;2649:7;2676:39;2680:1;2683;2676:39;;;;;;;;;;;;;;;;;:3;:39::i;754:136::-;812:7;839:43;843:1;846;839:43;;;;;;;;;;;;;;;;;:3;:43::i;45105:866::-;45172:7;45192:10;45216:22;:20;:22::i;:::-;45205:7;:33;;45192:46;;45263:5;:20;;;;;45282:1;45272:7;:11;45263:20;45259:668;;;45299:25;-1:-1:-1;;45299:12:0;:25::i;:::-;45339:16;45358;:14;:16::i;:::-;45397:42;;;-1:-1:-1;;;45397:42:0;;45433:4;45397:42;;;;;;45339:35;;-1:-1:-1;45339:35:0;;-1:-1:-1;;;;;;;;;;;33415:42:0;45397:27;;:42;;;;;;;;;;;;;;33415;45397;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45397:42:0;:54;;45389:92;;;;;-1:-1:-1;;;45389:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45497:43;45522:7;45531:8;45497:24;:43::i;:::-;45259:668;;;;45572:24;45599:25;45616:7;45599:16;:25::i;:::-;45572:52;-1:-1:-1;45643:20:0;;45639:209;;45683:30;45696:16;45683:12;:30::i;:::-;45740:42;;;-1:-1:-1;;;45740:42:0;;45776:4;45740:42;;;;;;45786:16;;-1:-1:-1;;;;;;;;;;;33415:42:0;45740:27;;:42;;;;;;;;;;;;;;;33415;45740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:42:0;:62;;45732:97;;;;;-1:-1:-1;;;45732:97:0;;;;;;;;;;;;-1:-1:-1;;;45732:97:0;;;;;;;;;;;;;;;45862:51;45887:7;45896:16;45862:24;:51::i;:::-;45259:668;;-1:-1:-1;45956:7:0;;45105:866;-1:-1:-1;45105:866:0:o;290:181::-;348:7;380:5;;;404:6;;;;396:46;;;;;-1:-1:-1;;;396:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53920:287;53997:7;54006;54042:1;54029:9;:14;54025:62;;-1:-1:-1;21996:42:0;;-1:-1:-1;54073:1:0;54059:16;;54025:62;54112:4;;54099:35;;-1:-1:-1;;;;;54112:4:0;21996:42;54124:9;54099:12;:35::i;:::-;54161:37;;;-1:-1:-1;;;54161:37:0;;54192:4;54161:37;;;;;;21996:42;;;;54161:22;;:37;;;;;;;;;;;;;;;21996:42;54161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54161:37:0;54147:52;;-1:-1:-1;54161:37:0;-1:-1:-1;53920:287:0;;;;:::o;27738:447::-;27839:14;;;;:22;;:14;:22;:44;;;;;27882:1;27865:14;:18;27839:44;27835:343;;;27932:7;;27900:56;;27913:17;;27932:7;;;-1:-1:-1;;;;;27932:7:0;27941:14;27900:12;:56::i;:::-;27998:7;;27991:40;;;-1:-1:-1;;;27991:40:0;;28025:4;27991:40;;;;;;-1:-1:-1;;27998:7:0;;;-1:-1:-1;;;;;27998:7:0;;27991:25;;:40;;;;;;;;;;;;;;27998:7;27991:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27991:40:0;28075:10;;28053:7;;27991:40;;-1:-1:-1;28046:51:0;;28075:10;28053:7;;-1:-1:-1;;;;;28053:7:0;;;;28075:10;27991:40;28046:28;:51::i;:::-;28124:10;;28112:54;;;-1:-1:-1;;;28112:54:0;;;;;;;;;;-1:-1:-1;;;;;28124:10:0;;;;28112:43;;:54;;;;;28124:10;;28112:54;;;;;;;;28124:10;;28112:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27835:343;27738:447;;:::o;17075:177::-;17185:58;;;-1:-1:-1;;;;;17185:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:58:0;-1:-1:-1;;;17185:58:0;;;17158:86;;17178:5;;17158:19;:86::i;53621:290::-;53741:16;;;53755:1;53741:16;;;53712:26;53741:16;;;;;53712:26;53741:16;;;;;;;;;;-1:-1:-1;53741:16:0;53712:45;;53783:5;53768:9;53778:1;53768:12;;;;;;;;;;;;;:20;-1:-1:-1;;;;;53768:20:0;;;-1:-1:-1;;;;;53768:20:0;;;;;53814:3;53799:9;53809:1;53799:12;;;;;;;;-1:-1:-1;;;;;53799:18:0;;;:12;;;;;;;;;:18;53891:11;;53828:75;;53857:5;;53864:3;;53869:6;;53877:1;;53880:9;;53891:11;53828:28;:75::i;43244:687::-;35422:1;35414:5;;:9;35406:28;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;;;;43359:7:::1;35523:15;35541:16;:14;:16::i;:::-;35523:34;;35590:7;35580;:17;:54;;;;-1:-1:-1::0;35626:7:0::1;::::0;35602:20:::1;:7:::0;35614;35602:11:::1;:20::i;:::-;:31;;35580:54;35579:78;;;;35650:7;35639;:18;;35579:78;35571:99;;;::::0;;-1:-1:-1;;;35571:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35571:99:0;;;;;;;;;;;;;::::1;;43381:11:::2;43394::::0;43407::::2;43422:14;:12;:14::i;:::-;43380:56:::0;;-1:-1:-1;43380:56:0;-1:-1:-1;43380:56:0;-1:-1:-1;43451:11:0;;43447:82:::2;;43478:39;::::0;;-1:-1:-1;;;43478:39:0;;-1:-1:-1;;;;;43478:39:0;::::2;;::::0;::::2;::::0;;;;;;;;;33172:42:::2;::::0;43478:25:::2;::::0;:39;;;;;-1:-1:-1;;43478:39:0;;;;;;;-1:-1:-1;33172:42:0;43478:39;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43447:82;43539:13;43572:1:::0;43555:14:::2;:18;:60;;43614:1;43555:60;;;43587:7;::::0;43575:36:::2;::::0;-1:-1:-1;;;;;43587:7:0::2;43596:14:::0;43575:11:::2;:36::i;:::-;43539:76;;33089:42;-1:-1:-1::0;;;;;43626:31:0::2;;43658:5;;43666:12;43672:5;43666;:12::i;:::-;43665:13;;43681:50;43694:3;43707;-1:-1:-1::0;;;;;43699:16:0::2;;43716:3;43699:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;43699:21:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;43699:21:0;43722:3;43727;43681:12:::2;:50::i;:::-;43626:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43764:1;43747:14;:18;43743:181;;;43813:5;::::0;43781:60:::2;::::0;;-1:-1:-1;;;43781:60:0;;::::2;::::0;::::2;::::0;;;;43828:4:::2;43781:60:::0;;;;;;;;;;;33089:42:::2;::::0;43781:31:::2;::::0;:60;;;;;-1:-1:-1;;43781:60:0;;;;;;;-1:-1:-1;33089:42:0;43781:60;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;43868:7:0::2;::::0;43856:56:::2;::::0;;-1:-1:-1;;;43856:56:0;;43890:4:::2;43856:56;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;43868:7:0;;::::2;::::0;-1:-1:-1;43856:25:0::2;::::0;-1:-1:-1;43856:56:0;;;;;43868:7:::2;::::0;43856:56;;;;;;;;43868:7;;43856:56;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43743:181;35681:1;;;;35446::::1;;43244:687:::0;;:::o;30076:371::-;30201:11;;30197:243;;30229:13;30244:25;30273:34;30287:5;30294:3;30299:7;30273:13;:34::i;:::-;30228:79;;;;30324:102;30353:5;30360:3;30365:7;30374:1;30377:8;30388;:36;;30412:12;;-1:-1:-1;;;;;30412:12:0;30388:36;;;30398:11;;-1:-1:-1;;;;;30398:11:0;30388:36;30324:28;:102::i;26244:302::-;26358:10;;26308:15;;-1:-1:-1;;;;;26358:10:0;26344;:24;26336:48;;;;;-1:-1:-1;;;26336:48:0;;;;;;;;;;;;-1:-1:-1;;;26336:48:0;;;;;;;;;;;;;;;26403:4;;-1:-1:-1;;;;;26403:23:0;;;:4;;:23;;26395:40;;;;;-1:-1:-1;;;26395:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;26395:40:0;;;;;;;;;;;;;;;26456:31;;;-1:-1:-1;;;26456:31:0;;26481:4;26456:31;;;;;;-1:-1:-1;;;;;26456:16:0;;;;;:31;;;;;;;;;;;;;;:16;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26456:31:0;26518:10;;26456:31;;-1:-1:-1;26498:40:0;;-1:-1:-1;;;;;26498:19:0;;;;26518:10;26456:31;26498:19;:40::i;40559:143::-;40617:9;40647:6;;;:30;;-1:-1:-1;;40662:5:0;;;40676:1;40671;40662:5;40671:1;40657:15;;;;;:20;40647:30;40639:55;;;;;-1:-1:-1;;;40639:55:0;;;;;;;;;;;;-1:-1:-1;;;40639:55:0;;;;;;;;;;;;;;28607:82;28651:30;28665:15;:13;:15::i;55068:1165::-;55139:12;55135:334;;55167:7;;55135:334;-1:-1:-1;;55194:7:0;:22;55191:278;;55263:10;;55293:55;;;-1:-1:-1;;;55293:55:0;;55342:4;55293:55;;;;;;-1:-1:-1;;;;;55263:10:0;;;;55244:48;;55263:10;;55293:40;;:55;;;;;;;;;;;;;;;55263:10;55293:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55293:55:0;55244:112;;;-1:-1:-1;;;;;;55244:112:0;;;;;;;;;;;;;;55350:5;55244:112;;;;;;;;;;;;;55293:55;;55244:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55397:12:0;;55390:45;;;-1:-1:-1;;;55390:45:0;;55429:4;55390:45;;;;;;55371:65;;-1:-1:-1;;;;;55397:12:0;;55390:30;;:45;;;;;55244:112;;55390:45;;;;;;;55397:12;55390:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55390:45:0;55371:18;:65::i;:::-;55451:7;;55191:278;55486:18;55507:27;55526:7;55507:18;:27::i;:::-;55486:48;;55558:71;49378:5;55558:54;55573:38;55589:21;;49378:5;55573:15;;:38;;;;:::i;:::-;55558:10;;:14;:54::i;:71::-;55696:12;;55689:45;;;-1:-1:-1;;;55689:45:0;;55728:4;55689:45;;;;;;55545:84;;-1:-1:-1;55669:17:0;;-1:-1:-1;;;;;55696:12:0;;;;55689:30;;:45;;;;;;;;;;;;;;;55696:12;55689:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55689:45:0;;-1:-1:-1;55745:28:0;55776:22;;;:53;;55828:1;55776:53;;;55800:25;:10;55815:9;55800:14;:25::i;:::-;55745:84;-1:-1:-1;55849:24:0;;55845:331;;55931:10;;55912:55;;;-1:-1:-1;;;55912:55:0;;55961:4;55912:55;;;;;;55889:20;;-1:-1:-1;;;;;55931:10:0;;55912:40;;:55;;;;;;;;;;;;;;55931:10;55912:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55912:55:0;;-1:-1:-1;55982:19:0;56004:35;;;:72;;56056:20;56004:72;;;56041:12;56004:72;56112:10;;56093:68;;;-1:-1:-1;;;56093:68:0;;;;;;;;56112:10;56093:68;;;;;;;;55982:94;;-1:-1:-1;;;;;;56112:10:0;;;;56093:48;;:68;;;;;;;;;;;;;;;;;56112:10;56093:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;55845:331:0;56195:30;56214:10;56195:18;:30::i;50645:310::-;50703:12;;50696:45;;-1:-1:-1;;;;;50703:12:0;48483:42;50739:1;50696:32;:45::i;:::-;50759:12;;50752:55;;-1:-1:-1;;;;;50759:12:0;48483:42;-1:-1:-1;;50752:32:0;:55::i;:::-;50861:11;;50835:12;;50828:48;;-1:-1:-1;;;;;50835:12:0;;;;50861:11;;50828:32;:48::i;:::-;50921:11;;50895:12;;50888:58;;-1:-1:-1;;;;;50895:12:0;;;;50921:11;-1:-1:-1;;50888:32:0;:58::i;:::-;50645:310::o;54216:843::-;54298:42;;;-1:-1:-1;;;54298:42:0;;54334:4;54298:42;;;;;;54282:13;;-1:-1:-1;;;;;;;;;;;33415:42:0;54298:27;;:42;;;;;;;;;;;;;;;33415;54298;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54298:42:0;;-1:-1:-1;54355:10:0;54351:48;;54381:7;;;54351:48;54438:42;;;-1:-1:-1;;;54438:42:0;;54474:4;54438:42;;;;;;54419:16;;-1:-1:-1;;;;;;;;;;;33415:42:0;54438:27;;:42;;;;;;;;;;;;;;;33415;54438;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54438:42:0;;-1:-1:-1;54491:20:0;54514:28;54438:42;54514:18;:28::i;:::-;54491:51;;54553:16;54572:72;49378:5;54572:55;54589:37;54605:20;;49378:5;54589:15;;:37;;;;:::i;:::-;54572:12;;:16;:55::i;:72::-;54553:91;;54670:1;54659:8;:12;:52;;;;;54675:36;54692:8;54702;54675:16;:36::i;:::-;54655:212;;;54728:25;;:::i;:::-;:47;;;;;;;;54757:1;54728:47;;;;54760:8;54728:47;;;;54770:1;54728:47;;;;54773:1;54728:47;;;;;48483:42;-1:-1:-1;;;;;54790:35:0;;54826:9;;;;;;;;;-1:-1:-1;;;;;54826:9:0;54837:7;54846:8;54790:65;;;;;;;;;;;;;-1:-1:-1;;;;;54790:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54655:212;;54905:12;;54898:45;;;-1:-1:-1;;;54898:45:0;;54937:4;54898:45;;;;;;54881:14;;-1:-1:-1;;;;;54905:12:0;;54898:30;;:45;;;;;;;;;;;;;;54905:12;54898:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54898:45:0;;-1:-1:-1;54962:10:0;54954:30;;;;;-1:-1:-1;;;54954:30:0;;;;;;;;;;;;-1:-1:-1;;;54954:30:0;;;;;;;;;;;;;;;55007:11;;55031:13;;54995:56;;;-1:-1:-1;;;54995:56:0;;;;;;;;;55007:11;54995:56;;;;;-1:-1:-1;;;;;55007:11:0;;;;54995:35;;:56;;;;;;;;;;;;;;;55007:11;;54995:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42542:692;35422:1;35414:5;;:9;35406:28;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;;;;42696:7:::1;;42663:29;42675:16;:14;:16::i;42663:29::-;:40;;42655:61;;;::::0;;-1:-1:-1;;;42655:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42655:61:0;;;;;;;;;;;;;::::1;;42728:11;42741::::0;42754::::1;42769:14;:12;:14::i;:::-;42802:7;::::0;42790:46:::1;::::0;;-1:-1:-1;;;42790:46:0;;-1:-1:-1;;;;;42790:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42727:56;;-1:-1:-1;42727:56:0;;-1:-1:-1;42727:56:0;;-1:-1:-1;42802:7:0::1;::::0;42790:25:::1;::::0;:46;;;;;42802:7:::1;::::0;42790:46;;;;;;;;42802:7;;42790:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42875:5:0::1;::::0;42900:7:::1;::::0;33089:42:::1;::::0;-1:-1:-1;42843:31:0::1;::::0;-1:-1:-1;42882:43:0::1;::::0;42888:36:::1;::::0;-1:-1:-1;;;;;42900:7:0::1;42909:14:::0;42888:11:::1;:36::i;:::-;42882:5;:43::i;:::-;42927:41;42940:3;33251:42;42950:3;42955;42960:7;42927:12;:41::i;:::-;42843:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33089:42;-1:-1:-1::0;;;;;42974:31:0::1;;43006:5;;43021:4;43028:14;43034:7;43028:5;:14::i;:::-;42974:69;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42974:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43058:49:0::1;::::0;;-1:-1:-1;;;43058:49:0;;43083:4:::1;43058:49;::::0;::::1;::::0;33172:42:::1;43058:49:::0;;;;;;-1:-1:-1;;;;;43058:16:0;::::1;::::0;-1:-1:-1;43058:16:0::1;::::0;-1:-1:-1;43058:49:0;;;;;::::1;::::0;;;;;;;;:16;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43058:49:0;43054:113:::1;;43129:26;::::0;;-1:-1:-1;;;43129:26:0;;33172:42:::1;43129:26;::::0;::::1;::::0;;;-1:-1:-1;;;;;43129:17:0;::::1;::::0;::::1;::::0;:26;;;;;-1:-1:-1;;43129:26:0;;;;;;;-1:-1:-1;43129:17:0;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43054:113;43177:49;::::0;;-1:-1:-1;;;43177:49:0;;43211:4:::1;43177:49;::::0;::::1;::::0;;;;;;;;;33172:42:::1;::::0;43177:25:::1;::::0;:49;;;;;-1:-1:-1;;43177:49:0;;;;;;;-1:-1:-1;33172:42:0;43177:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35446:1;;;42542:692:::0;;:::o;38358:193::-;38432:7;38458:85;38539:3;38458:76;34301:5;38458:58;38488:27;38505:9;;34301:5;38488:16;;:27;;;;:::i;:::-;38474:8;;38458:25;;:11;;:15;:25::i;19380:761::-;19804:23;19830:69;19858:4;19830:69;;;;;;;;;;;;;;;;;19838:5;-1:-1:-1;;;;;19830:27:0;;;:69;;;;;:::i;:::-;19914:17;;19804:95;;-1:-1:-1;19914:21:0;19910:224;;20056:10;20045:30;;;;;;;;;;;;;;;-1:-1:-1;20045:30:0;20037:85;;;;-1:-1:-1;;;20037:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6231:979;6361:12;6394:18;6405:6;6394:10;:18::i;:::-;6386:60;;;;;-1:-1:-1;;;6386:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6520:12;6534:23;6561:6;-1:-1:-1;;;;;6561:11:0;6581:8;6592:4;6561:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6561:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6519:78;;;;6612:7;6608:595;;;6643:10;-1:-1:-1;6636:17:0;;-1:-1:-1;6636:17:0;6608:595;6757:17;;:21;6753:439;;7020:10;7014:17;7081:15;7068:10;7064:2;7060:19;7053:44;6968:148;7163:12;7156:20;;-1:-1:-1;;;7156:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3219:278;3305:7;3340:12;3333:5;3325:28;;;;-1:-1:-1;;;3325:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:9;3380:1;3376;:5;;;;;;;3219:278;-1:-1:-1;;;;;3219:278:0:o;1193:192::-;1279:7;1315:12;1307:6;;;;1299:29;;;;-1:-1:-1;;;1299:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1351:5:0;;;1193:192::o;30456:601::-;30692:11;;30688:362;;30722:37;-1:-1:-1;;;;;30722:25:0;;30748:7;30757:1;30722:25;:37::i;:::-;30774:43;-1:-1:-1;;;;;30774:25:0;;30800:7;30809;30774:25;:43::i;:::-;30850:7;-1:-1:-1;;;;;30834:49:0;;30902:7;30928:13;30960:9;30996:4;31020:3;30834:204;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30456:601;;;;;;:::o;42325:208::-;42367:7;42376;42385;33089:42;-1:-1:-1;;;;;42412:31:0;;42444:5;;42412:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42412:38:0;42452:32;;;-1:-1:-1;;;42452:32:0;;;;33089:42;;42452:30;;:32;;;;;42412:38;;42452:32;;;;;;;33089:42;42452:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42452:32:0;42518:5;;42486:38;;;-1:-1:-1;;;42486:38:0;;;;;;;;;;33089:42;;42486:31;;:38;;;;;42452:32;;42486:38;;;;;;;33089:42;42486:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42486:38:0;42404:121;;-1:-1:-1;42404:121:0;-1:-1:-1;42486:38:0;-1:-1:-1;42325:208:0;;;:::o;41102:156::-;41171:11;41201:49;41205:3;41234:7;-1:-1:-1;;;;;41222:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41222:26:0;41217:2;:31;41210:2;:39;41201:3;:49::i;40960:133::-;41041:1;41009:8;41062:6;;;41054:31;;;;;-1:-1:-1;;;41054:31:0;;;;;;;;;;;;-1:-1:-1;;;41054:31:0;;;;;;;;;;;;;;41673:326;41767:11;41794:12;41821:3;-1:-1:-1;;;;;41813:17:0;;41831:3;41813:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41813:22:0;;;;41864:27;;-1:-1:-1;;;41864:27:0;;;;;;;;-1:-1:-1;;;;;41864:27:0;;;;;;;;;41813:22;;-1:-1:-1;41849:11:0;;41864:17;;;;;;:27;;;;;;;;;;;:17;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41864:27:0;;;;-1:-1:-1;41909:20:0;41915:13;:3;41923:4;41915:7;:13::i;41909:20::-;41902:27;;41964:3;41955:4;41947:20;;:44;;41981:10;41987:3;41981:5;:10::i;:::-;41979:12;;41947:44;;;41972:4;41970:6;;41947:44;41940:51;41673:326;-1:-1:-1;;;;;;;41673:326:0:o;56242:465::-;56337:12;;56330:45;;;-1:-1:-1;;;56330:45:0;;56369:4;56330:45;;;;;;56310:17;;-1:-1:-1;;;;;56337:12:0;;56330:30;;:45;;;;;;;;;;;;;;56337:12;56330:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56330:45:0;;-1:-1:-1;56390:13:0;;56386:314;;56445:9;56432:10;:22;:47;;56469:10;56432:47;;;56457:9;56432:47;56419:60;;56494:19;56516:71;49378:5;56516:54;56531:38;56547:21;;49378:5;56531:15;;:38;;;;:::i;:::-;56516:10;;:14;:54::i;:71::-;56650:9;;;56602:86;;;-1:-1:-1;;;56602:86:0;;-1:-1:-1;;;;;56650:9:0;;;56602:86;;;;;;;;;;56650:9;56602:86;;;;;;;;;;;;;;-1:-1:-1;48483:42:0;;56602:47;;:86;;;;;-1:-1:-1;;56602:86:0;;;;;;;;-1:-1:-1;48483:42:0;56602:86;;;;;;;;;;41267:397;41369:11;41393:12;41416:3;-1:-1:-1;;;;;41408:17:0;;41426:3;41408:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41408:22:0;41455:21;;;-1:-1:-1;;;41455:21:0;;-1:-1:-1;;;;;41455:21:0;;;;;;;;;41408:22;;-1:-1:-1;41441:11:0;;41455:16;;;;;;:21;;;;;41408:22;;41455:21;;;;;;;;:16;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41455:21:0;;-1:-1:-1;41497:10:0;41503:3;41497:5;:10::i;:::-;41491:3;:16;41487:170;;;41531:37;41537:30;41562:4;41537:20;41541:10;41547:3;41541:5;:10::i;:::-;41553:3;41537;:20::i;41531:37::-;41524:44;;41617:10;41623:3;41617:5;:10::i;:::-;41590:24;41602:4;41609;41590:3;:24::i;:::-;:37;:55;;41641:4;41590:55;;;41630:4;41637:1;41630:8;41590:55;41583:62;;41487:170;41267:397;;;;;;;;;:::o;40711:102::-;40762:11;40792:13;40796:3;34336:8;40792:3;:13::i;5178:619::-;5238:4;5706:20;;5549:66;5746:23;;;;;;:42;;-1:-1:-1;;5773:15:0;;;5178:619;-1:-1:-1;;5178:619:0:o;40822:129::-;40915:5;;;40910:16;;;;40902:41;;;;;-1:-1:-1;;;40902:41:0;;;;;;;;;;;;-1:-1:-1;;;40902:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://1448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.