ETH Price: $3,376.04 (-8.25%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
arNXMVault

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-28
*/

// Sources flattened with hardhat v2.6.1 https://hardhat.org

// File contracts/general/Ownable.sol
pragma solidity ^0.6.6;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 * 
 * @dev We've added a second owner to share control of the timelocked owner contract.
 */
contract Ownable {
    address private _owner;
    address private _pendingOwner;
    
    // Second allows a DAO to share control.
    address private _secondOwner;
    address private _pendingSecond;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    function initializeOwnable() internal {
        require(_owner == address(0), "already initialized");
        _owner = msg.sender;
        _secondOwner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
        emit SecondOwnershipTransferred(address(0), msg.sender);
    }


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

    /**
     * @return the address of the owner.
     */
    function secondOwner() public view returns (address) {
        return _secondOwner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "msg.sender is not owner");
        _;
    }
    
    modifier onlyFirstOwner() {
        require(msg.sender == _owner, "msg.sender is not owner");
        _;
    }
    
    modifier onlySecondOwner() {
        require(msg.sender == _secondOwner, "msg.sender is not owner");
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner || msg.sender == _secondOwner;

    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyFirstOwner {
        _pendingOwner = newOwner;
    }

    function receiveOwnership() public {
        require(msg.sender == _pendingOwner, "only pending owner can call this function");
        _transferOwnership(_pendingOwner);
        _pendingOwner = address(0);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferSecondOwnership(address newOwner) public onlySecondOwner {
        _pendingSecond = newOwner;
    }

    function receiveSecondOwnership() public {
        require(msg.sender == _pendingSecond, "only pending owner can call this function");
        _transferSecondOwnership(_pendingSecond);
        _pendingSecond = address(0);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferSecondOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit SecondOwnershipTransferred(_secondOwner, newOwner);
        _secondOwner = newOwner;
    }

    uint256[50] private __gap;
}


// File contracts/libraries/Address.sol

pragma solidity ^0.6.6;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing 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.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // 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 != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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


// File contracts/libraries/SafeMath.sol

pragma solidity ^0.6.6;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 * 
 * @dev Default OpenZeppelin
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}


// File contracts/interfaces/IERC20.sol
pragma solidity ^0.6.6;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function mint(address to, uint256 amount) external returns (bool);
    
    function burn(address from, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/libraries/SafeERC20.sol

pragma solidity ^0.6.6;

/**
 * @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 ERC20;` 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));
    }

    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);
        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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "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");
        }
    }
}


// File contracts/interfaces/IWNXM.sol
pragma solidity ^0.6.6;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IWNXM {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function mint(address to, uint256 amount) external returns (bool);
    
    function burn(address from, uint256 amount) external returns (bool);

    function wrap(uint256 amount) external;
    
    function unwrap(uint256 amount) external;

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/interfaces/INexusMutual.sol

pragma solidity ^0.6.6;

/**
 * @dev Quick interface for the Nexus Mutual contract to work with the Armor Contracts.
 **/

// to get nexus mutual contract address
interface INxmMaster {
    function tokenAddress() external view returns(address);
    function owner() external view returns(address);
    function pauseTime() external view returns(uint);
    function masterInitialized() external view returns(bool);
    function isPause() external view returns(bool check);
    function isMember(address _add) external view returns(bool);
    function getLatestAddress(bytes2 _contractName) external view returns(address payable contractAddress);
}
interface IPooledStaking {
    function unstakeRequests(uint256 id) external view returns(uint256 amount, uint256 unstakeAt, address contractAddress, address stakerAddress, uint256 next);
    function processPendingActions(uint256 iterations) external returns(bool success);
    function MAX_EXPOSURE() external view returns(uint256);
    function lastUnstakeRequestId() external view returns(uint256);
    function stakerDeposit(address user) external view returns (uint256);
    function stakerMaxWithdrawable(address user) external view returns (uint256);
    function withdrawReward(address user) external;
    function requestUnstake(address[] calldata protocols, uint256[] calldata amounts, uint256 insertAfter) external;
    function depositAndStake(uint256 deposit, address[] calldata protocols, uint256[] calldata amounts) external;
    function stakerContractCount(address staker) external view returns(uint256);
    function stakerContractAtIndex(address staker, uint contractIndex) external view returns (address);
    function stakerContractStake(address staker, address protocol) external view returns (uint256);
    function stakerContractsArray(address staker) external view returns (address[] memory);
    function stakerContractPendingUnstakeTotal(address staker, address protocol) external view returns(uint256);
    function withdraw(uint256 amount) external;
    function stakerReward(address staker) external view returns (uint256);
}

interface IClaimsData {
    function getClaimStatusNumber(uint256 claimId) external view returns (uint256, uint256);
    function getClaimDateUpd(uint256 claimId) external view returns (uint256);
}

interface INXMPool {
    function buyNXM(uint minTokensOut) external payable;
}

interface IGovernance {
    function submitVote(uint256 _proposalId, uint256 _solution) external;
}

interface IQuotation {
    function getWithdrawableCoverNoteCoverIds(address owner) external view returns(uint256[] memory, bytes32[] memory);
}


// File contracts/interfaces/IRewardDistributionRecipient.sol
pragma solidity ^0.6.6;

interface IRewardDistributionRecipient {
    function notifyRewardAmount(uint256 reward) payable external;
}


// File contracts/interfaces/IRewardManager.sol
pragma solidity ^0.6.6;

interface IRewardManager is IRewardDistributionRecipient {
  function initialize(address _rewardToken, address _stakeController) external;
  function stake(address _user, address _referral, uint256 _coverPrice) external;
  function withdraw(address _user, address _referral, uint256 _coverPrice) external;
  function getReward(address payable _user) external;
}


// File contracts/interfaces/IShieldMining.sol
pragma solidity ^0.6.0;

interface IShieldMining {
  function claimRewards(
    address[] calldata stakedContracts,
    address[] calldata sponsors,
    address[] calldata tokenAddresses
  ) external returns (uint[] memory tokensRewarded);
}


// File contracts/core/arNXMVault.sol

pragma solidity ^0.6.6;
/**
 * @title arNXM Vault
 * @dev Vault to stake wNXM or NXM in Nexus Mutual while maintaining your liquidity.
 *      This is V2 which replaces V1 behind a proxy. Updated variables at the bottom.
 * @author Armor.fi -- Robert M.C. Forster, Taek Lee
 * SPDX-License-Identifier: (c) Armor.Fi DAO, 2021
**/

contract arNXMVault is Ownable {

    using SafeMath for uint;
    using SafeERC20 for IERC20;

    uint256 constant private DENOMINATOR = 1000;

    // Amount of time between
    uint256 private ____deprecated____0;

    // Amount of time that rewards are distributed over.
    uint256 public rewardDuration;

    // This used to be unstake percent but has now been deprecated in favor of individual unstakes.
    // Paranoia results in this not being replaced but rather deprecated and new variables placed at the bottom.
    uint256 private ____deprecated____1;

    // Amount of wNXM (in token Wei) to reserve each period.
    // Overwrites reservePercent in update.
    uint256 public reserveAmount;

    // Withdrawals may be paused if a hack has recently happened. Timestamp of when the pause happened.
    uint256 public withdrawalsPaused;

    // Amount of time withdrawals may be paused after a hack.
    uint256 public pauseDuration;

    // Address that will receive administration funds from the contract.
    address public beneficiary;

    // Percent of funds to be distributed for administration of the contract. 10 == 1%; 1000 == 100%.
    uint256 public adminPercent;

    // Percent of staking rewards that referrers get.
    uint256 public referPercent;

    // Timestamp of when the last restake took place--7 days between each.
    uint256 public lastRestake;

    // The amount of the last reward.
    uint256 public lastReward;

    // Uniswap, Maker, Compound, Aave, Curve, Synthetix, Yearn, RenVM, Balancer, dForce.
    address[] public protocols;

    // Amount to unstake each time.
    uint256[] private amounts;

    // Protocols being actively used in staking or unstaking.
    address[] private activeProtocols;

    struct WithdrawalRequest {
        uint48 requestTime;
        uint104 nAmount;
        uint104 arAmount;
    }

    // Nxm tokens.
    IERC20 public wNxm;
    IERC20 public nxm;
    IERC20 public arNxm;

    // Nxm Master address.
    INxmMaster public nxmMaster;

    // Reward manager for referrers.
    IRewardManager public rewardManager;

    // Referral => referrer
    mapping (address => address) public referrers;

    event Deposit(address indexed user, uint256 nAmount, uint256 arAmount, uint256 timestamp);
    event WithdrawRequested(address indexed user, uint256 arAmount, uint256 nAmount, uint256 requestTime, uint256 withdrawTime);
    event Withdrawal(address indexed user, uint256 nAmount, uint256 arAmount, uint256 timestamp);
    event Restake(uint256 withdrawn, uint256 unstaked, uint256 staked, uint256 totalAum, uint256 timestamp);
    event NxmReward(uint256 reward, uint256 timestamp, uint256 totalAum);

    // Avoid composability issues for liquidation.
    modifier notContract {
        require(msg.sender == tx.origin, "Sender must be an EOA.");
        _;
    }

    // Functions as re-entrancy protection and more.
    // Mapping down below with other update variables.
    modifier oncePerTx {
        require(block.timestamp > lastCall[tx.origin], "May only call this contract once per transaction.");
        lastCall[tx.origin] = block.timestamp;
        _;
    }

    /**
     * @param _wNxm Address of the wNxm contract.
     * @param _arNxm Address of the arNxm contract.
     * @param _nxmMaster Address of Nexus' master address (to fetch others).
     * @param _rewardManager Address of the ReferralRewards smart contract.
    **/
    function initialize(
        address _wNxm,
        address _arNxm,
        address _nxm,
        address _nxmMaster,
        address _rewardManager
    )
      public
    {
        require(address(arNxm) == address(0), "Contract has already been initialized.");

        Ownable.initializeOwnable();
        wNxm = IERC20(_wNxm);
        nxm = IERC20(_nxm);
        arNxm = IERC20(_arNxm);
        nxmMaster = INxmMaster(_nxmMaster);
        rewardManager = IRewardManager(_rewardManager);
        // unstakePercent = 100;
        adminPercent = 0;
        referPercent = 25;
        reserveAmount = 30 ether;
        pauseDuration = 10 days;
        beneficiary = msg.sender;
        // restakePeriod = 3 days;
        rewardDuration = 9 days;

        // Approve to wrap and send funds to reward manager.
        arNxm.approve( _rewardManager, uint256(-1) );
    }

    /**
     * @dev Deposit wNxm or NXM to get arNxm in return.
     * @param _nAmount The amount of NXM to stake.
     * @param _referrer The address that referred this user.
     * @param _isNxm True if the token is NXM, false if the token is wNXM.
    **/
    function deposit(uint256 _nAmount, address _referrer, bool _isNxm)
      external
      oncePerTx
    {
        if ( referrers[msg.sender] == address(0) ) {
            referrers[msg.sender] = _referrer != address(0) ? _referrer : beneficiary;
            address refToSet = _referrer != address(0) ? _referrer : beneficiary;
            referrers[msg.sender] = refToSet;

            // A wallet with a previous arNXM balance would be able to subtract referral weight that it never added.
            uint256 prevBal = arNxm.balanceOf(msg.sender);
            if (prevBal > 0) rewardManager.stake(refToSet, msg.sender, prevBal);
        }

        // This amount must be determined before arNxm mint.
        uint256 arAmount = arNxmValue(_nAmount);

        if (_isNxm) {
            nxm.safeTransferFrom(msg.sender, address(this), _nAmount);
        } else {
            wNxm.safeTransferFrom(msg.sender, address(this), _nAmount);
            _unwrapWnxm(_nAmount);
        }

        // Mint also increases sender's referral balance through alertTransfer.
        arNxm.mint(msg.sender, arAmount);

        emit Deposit(msg.sender, _nAmount, arAmount, block.timestamp);
    }

    /**
     * @dev Withdraw an amount of wNxm or NXM by burning arNxm.
     * @param _arAmount The amount of arNxm to burn for the wNxm withdraw.
     * @param _payFee Flag to pay fee to withdraw without delay.
    **/
    function withdraw(uint256 _arAmount, bool _payFee)
      external
      oncePerTx
    {
        require(block.timestamp.sub(withdrawalsPaused) > pauseDuration, "Withdrawals are temporarily paused.");

        // This amount must be determined before arNxm burn.
        uint256 nAmount = nxmValue(_arAmount);
        require(totalPending.add(nAmount) <= nxm.balanceOf(address(this)), "Not enough NXM available for witthdrawal.");

        if (_payFee) {
            uint256 fee = nAmount.mul(withdrawFee).div(1000);
            uint256 disbursement = nAmount.sub(fee);

            // Burn also decreases sender's referral balance through alertTransfer.
            arNxm.burn(msg.sender, _arAmount);
            _wrapNxm(disbursement);
            wNxm.safeTransfer(msg.sender, disbursement);

            emit Withdrawal(msg.sender, nAmount, _arAmount, block.timestamp);
        } else {
            totalPending = totalPending.add(nAmount);
            arNxm.safeTransferFrom(msg.sender, address(this), _arAmount);
            WithdrawalRequest memory prevWithdrawal = withdrawals[msg.sender];
            withdrawals[msg.sender] = WithdrawalRequest(
                uint48(block.timestamp),
                prevWithdrawal.nAmount + uint104(nAmount),
                prevWithdrawal.arAmount + uint104(_arAmount)
            );

            emit WithdrawRequested(msg.sender, _arAmount, nAmount, block.timestamp, block.timestamp.add(withdrawDelay));
        }
    }

    /**
     * @dev Withdraw from request
    **/
    function withdrawFinalize()
      external
      oncePerTx
    {
        WithdrawalRequest memory withdrawal = withdrawals[msg.sender];
        uint256 nAmount = uint256(withdrawal.nAmount);
        uint256 arAmount = uint256(withdrawal.arAmount);
        uint256 requestTime = uint256(withdrawal.requestTime);

        require(block.timestamp.sub(withdrawalsPaused) > pauseDuration, "Withdrawals are temporarily paused.");
        require(requestTime.add(withdrawDelay) <= block.timestamp, "Not ready to withdraw");
        require(nAmount > 0, "No pending amount to withdraw");

        // Burn also decreases sender's referral balance through alertTransfer.
        arNxm.burn(address(this), arAmount);
        _wrapNxm(nAmount);
        wNxm.safeTransfer(msg.sender, nAmount);
        delete withdrawals[msg.sender];
        totalPending = totalPending.sub(nAmount);

        emit Withdrawal(msg.sender, nAmount, arAmount, block.timestamp);
    }

    /**
     * @dev Split off from restake() function to enable reward fetching at any time.
    **/
    function getRewardNxm()
      external
      notContract
    {
        uint256 prevAum = aum();
        uint256 rewards = _getRewardsNxm();

        if (rewards > 0) {
            lastRewardTimestamp = block.timestamp;
            emit NxmReward(rewards, block.timestamp, prevAum);
        } else if(lastRewardTimestamp == 0) {
            lastRewardTimestamp = block.timestamp;
        }
    }

    /**
     * @dev claim rewards from shield mining
     * @param _shieldMining shield mining contract address
     * @param _protocols Protocol funding the rewards.
     * @param _sponsors sponsor address who funded the shield mining
     * @param _tokens token address that sponsor is distributing
    **/
    function getShieldMiningRewards(address _shieldMining, address[] calldata _protocols, address[] calldata _sponsors, address[] calldata _tokens)
      external
      notContract
    {
        IShieldMining(_shieldMining).claimRewards(_protocols, _sponsors, _tokens);
    }

    /**
     * @dev Find the arNxm value of a certain amount of wNxm.
     * @param _nAmount The amount of NXM to check arNxm value of.
     * @return arAmount The amount of arNxm the input amount of wNxm is worth.
    **/
    function arNxmValue(uint256 _nAmount)
      public
      view
    returns (uint256 arAmount)
    {
        // Get reward allowed to be distributed.
        uint256 reward = _currentReward();

        // aum() holds full reward so we sub lastReward (which needs to be distributed over time)
        // and add reward that has been distributed
        uint256 totalN = aum().add(reward).sub(lastReward);
        uint256 totalAr = arNxm.totalSupply();

        // Find exchange amount of one token, then find exchange amount for full value.
        if (totalN == 0) {
            arAmount = _nAmount;
        } else {
            uint256 oneAmount = ( totalAr.mul(1e18) ).div(totalN);
            arAmount = _nAmount.mul(oneAmount).div(1e18);
        }
    }

    /**
     * @dev Find the wNxm value of a certain amount of arNxm.
     * @param _arAmount The amount of arNxm to check wNxm value of.
     * @return nAmount The amount of wNxm the input amount of arNxm is worth.
    **/
    function nxmValue(uint256 _arAmount)
      public
      view
    returns (uint256 nAmount)
    {
        // Get reward allowed to be distributed.
        uint256 reward = _currentReward();

        // aum() holds full reward so we sub lastReward (which needs to be distributed over time)
        // and add reward that has been distributed
        uint256 totalN = aum().add(reward).sub(lastReward);
        uint256 totalAr = arNxm.totalSupply();

        // Find exchange amount of one token, then find exchange amount for full value.
        uint256 oneAmount = ( totalN.mul(1e18) ).div(totalAr);
        nAmount = _arAmount.mul(oneAmount).div(1e18);
    }

    /**
     * @dev Used to determine total Assets Under Management.
     * @return aumTotal Full amount of assets under management (wNXM balance + stake deposit).
    **/
    function aum()
      public
      view
    returns (uint256 aumTotal)
    {
        IPooledStaking pool = IPooledStaking( _getPool() );
        uint256 balance = nxm.balanceOf( address(this) );
        uint256 stakeDeposit = pool.stakerDeposit( address(this) );
        aumTotal = balance.add(stakeDeposit);
    }

    /**
     * @dev Used to determine staked nxm amount in pooled staking contract.
     * @return staked Staked nxm amount.
    **/
    function stakedNxm()
      public
      view
    returns (uint256 staked)
    {
        IPooledStaking pool = IPooledStaking( _getPool() );
        staked = pool.stakerDeposit( address(this) );
    }

    /**
     * @dev Used to determine distributed reward amount
     * @return reward distributed reward amount
    **/
    function currentReward()
      external
      view
    returns (uint256 reward)
    {
        reward = _currentReward();
    }

    /**
     * @dev Anyone may call this function to pause withdrawals for a certain amount of time.
     *      We check Nexus contracts for a recent accepted claim, then can pause to avoid further withdrawals.
     * @param _claimId The ID of the cover that has been accepted for a confirmed hack.
    **/
    function pauseWithdrawals(uint256 _claimId)
      external
    {
        IClaimsData claimsData = IClaimsData( _getClaimsData() );

        (/*coverId*/, uint256 status) = claimsData.getClaimStatusNumber(_claimId);
        uint256 dateUpdate = claimsData.getClaimDateUpd(_claimId);

        // Status must be 14 and date update must be within the past 7 days.
        if (status == 14 && block.timestamp.sub(dateUpdate) <= 7 days) {
            withdrawalsPaused = block.timestamp;
        }
    }

    /**
     * @dev When arNXM tokens are transferred, the referrer stakes must be adjusted on RewardManager.
     *      This is taken care of by a "_beforeTokenTransfer" function on the arNXM ERC20.
     * @param _from The user that tokens are being transferred from.
     * @param _to The user that tokens are being transferred to.
     * @param _amount The amount of tokens that are being transferred.
    **/
    function alertTransfer(address _from, address _to, uint256 _amount)
      external
    {
        require(msg.sender == address(arNxm), "Sender must be the token contract.");

        // address(0) means the contract or EOA has not interacted directly with arNXM Vault.
        if ( referrers[_from] != address(0) ) rewardManager.withdraw(referrers[_from], _from, _amount);
        if ( referrers[_to] != address(0) ) rewardManager.stake(referrers[_to], _to, _amount);
    }

    /**
     * @dev Withdraw any available rewards from Nexus.
     * @return finalReward The amount of rewards to be given to users (full reward - admin reward - referral reward).
    **/
    function _getRewardsNxm()
      internal
      returns (uint256 finalReward)
    {
        IPooledStaking pool = IPooledStaking( _getPool() );

        // Find current reward, find user reward (transfers reward to admin within this).
        uint256 fullReward = pool.stakerReward( address(this) );
        finalReward = _feeRewardsNxm(fullReward);

        pool.withdrawReward( address(this) );
        lastReward = finalReward;
    }

    /**
     * @dev Find and distribute administrator rewards.
     * @param reward Full reward given from this week.
     * @return userReward Reward amount given to users (full reward - admin reward).
    **/
    function _feeRewardsNxm(uint256 reward)
      internal
    returns (uint256 userReward)
    {
        // Find both rewards before minting any.
        uint256 adminReward = arNxmValue( reward.mul(adminPercent).div(DENOMINATOR) );
        uint256 referReward = arNxmValue( reward.mul(referPercent).div(DENOMINATOR) );

        // Mint to beneficary then this address (to then transfer to rewardManager).
        if (adminReward > 0) {
            arNxm.mint(beneficiary, adminReward);
        }
        if (referReward > 0) {
            arNxm.mint(address(this), referReward);
            rewardManager.notifyRewardAmount(referReward);
        }

        userReward = reward.sub(adminReward).sub(referReward);
    }

    /**
     * @dev Used to withdraw nxm from staking pool
    **/
    function withdrawNxm()
      external
      onlyOwner
    {
        _withdrawNxm();
    }

    /**
     * @dev Used to unwrap wnxm tokens to nxm
    **/
    function unwrapWnxm()
      external
    {
        uint256 balance = wNxm.balanceOf(address(this));
        _unwrapWnxm(balance);
    }

    /**
     * @dev Used to stake nxm tokens to stake pool. it is determined manually
    **/
    function stakeNxm(address[] calldata _protocols, uint256[] calldata _stakeAmounts) external onlyOwner{
        _stakeNxm(_protocols, _stakeAmounts);
    }

    /**
     * @dev Used to unstake nxm tokens from stake pool. it is determined manually
    **/
    function unstakeNxm(uint256 _lastId, address[] calldata _protocols, uint256[] calldata _unstakeAmounts) external onlyOwner{
        _unstakeNxm(_lastId, _protocols, _unstakeAmounts);
    }
    
    /**
     * @dev Withdraw any Nxm we can from the staking pool.
     * @return amount The amount of funds that are being withdrawn.
    **/
    function _withdrawNxm()
      internal
      returns (uint256 amount)
    {
        IPooledStaking pool = IPooledStaking( _getPool() );
        amount = pool.stakerMaxWithdrawable( address(this) );
        pool.withdraw(amount);
    }

    /**
     * @dev Stake any wNxm over the amount we need to keep in reserve (bufferPercent% more than withdrawals last week).
     * @param _protocols List of protocols to stake in (NOT list of all protocols).
     * @param _stakeAmounts List of amounts to stake in each relevant protocol--this is only ADDITIONAL stake rather than full stake.
     * @return toStake Amount of token that we will be staking.
     **/
    function _stakeNxm(address[] memory _protocols, uint256[] memory _stakeAmounts)
      internal
      returns (uint256 toStake)
    {
        IPooledStaking pool = IPooledStaking( _getPool() );
        uint256 balance = nxm.balanceOf( address(this) );
        // If we do need to restake funds...
        // toStake == additional stake on top of old ones
        if (reserveAmount.add(totalPending) > balance) {
            toStake = 0;
        } else {
            toStake = balance.sub(reserveAmount.add(totalPending));
            _approveNxm(_getTokenController(), toStake);
        }

        // get current data from pooled staking
        address[] memory currentProtocols = pool.stakerContractsArray(address(this));
        // this will be used to calculate the remaining exposure
        for (uint256 i = 0; i < currentProtocols.length; i++) {
            amounts.push(pool.stakerContractStake(address(this), currentProtocols[i]));
            activeProtocols.push(currentProtocols[i]);
        }

        // push additional stake data
        for(uint256 i = 0; i < _protocols.length; i++) {
            address protocol = _protocols[i];
            uint256 curIndex = _addressArrayFind(currentProtocols, protocol);
            if(curIndex == type(uint256).max) {
                activeProtocols.push(protocol);
                amounts.push(_stakeAmounts[i]);
            } else {
                amounts[curIndex] += _stakeAmounts[i];
            }
        }
        // now calculate the new staking protocols
        pool.depositAndStake(toStake, activeProtocols, amounts);
        delete activeProtocols;
        delete amounts;
    }

    /**
     * @dev Unstake an amount from each protocol on Nxm (takes 30 days to unstake).
     * @param _lastId The ID of the last unstake request on Nexus Mutual (needed for unstaking).
    **/
    function _unstakeNxm(uint256 _lastId, address[] memory _protocols, uint256[] memory _amounts)
      internal
    {
        IPooledStaking pool = IPooledStaking( _getPool() );
        pool.requestUnstake(_protocols, _amounts, _lastId);
    }

    /**
     * @dev Returns the amount we can unstake (if we can't unstake the full amount desired).
     * @param _protocol The address of the protocol we're checking.
     * @param _unstakeAmount Amount we want to unstake.
     * @return The amount of funds that can be unstaked from this protocol if not the full amount desired.
    **/
    function _protocolUnstakeable(address _protocol, uint256 _unstakeAmount)
      internal
      view
    returns (uint256) {
        IPooledStaking pool = IPooledStaking( _getPool() );
        uint256 stake = pool.stakerContractStake(address(this), _protocol);
        uint256 requested = pool.stakerContractPendingUnstakeTotal(address(this), _protocol);

        // Scenario in which all staked has already been requested to be unstaked.
        if (requested >= stake) {
            return 0;
        }

        uint256 available = stake - requested;

        return _unstakeAmount <= available ? _unstakeAmount : available;
    }

    /**
     * @dev Calculate what the current reward is. We stream this to arNxm value to avoid dumps.
     * @return reward Amount of reward currently calculated into arNxm value.
    **/
    function _currentReward()
      internal
      view
    returns (uint256 reward)
    {
        uint256 duration = rewardDuration;
        uint256 timeElapsed = block.timestamp.sub(lastRewardTimestamp);
        if(timeElapsed == 0){
            return 0;
        }

        // Full reward is added to the balance if it's been more than the disbursement duration.
        if (timeElapsed >= duration) {
            reward = lastReward;
        // Otherwise, disburse amounts linearly over duration.
        } else {
            // 1e18 just for a buffer.
            uint256 portion = ( duration.mul(1e18) ).div(timeElapsed);
            reward = ( lastReward.mul(1e18) ).div(portion);
        }
    }

    /**
     * @dev Wrap Nxm tokens to be able to be withdrawn as wNxm.
    **/
    function _wrapNxm(uint256 _amount)
      internal
    {
        _approveNxm(address(wNxm), _amount);
        IWNXM(address(wNxm)).wrap(_amount);
    }

    /**
     * @dev Unwrap wNxm tokens to be able to be used within the Nexus Mutual system.
     * @param _amount Amount of wNxm tokens to be unwrapped.
    **/
    function _unwrapWnxm(uint256 _amount)
      internal
    {
        IWNXM(address(wNxm)).unwrap(_amount);
    }

    /**
     * @dev Approve wNxm contract to be able to transferFrom Nxm from this contract.
    **/
    function _approveNxm(address _to, uint256 _amount)
      internal
    {
        nxm.approve( _to, _amount );
    }

    /**
     * @dev Get current address of the Nexus staking pool.
     * @return pool Address of the Nexus staking pool contract.
    **/
    function _getPool()
      internal
      view
    returns (address pool)
    {
        pool = nxmMaster.getLatestAddress("PS");
    }

    /**
     * @dev Get the current NXM token controller (for NXM actions) from Nexus Mutual.
     * @return controller Address of the token controller.
    **/
    function _getTokenController()
      internal
      view
    returns(address controller)
    {
        controller = nxmMaster.getLatestAddress("TC");
    }

    /**
     * @dev Get current address of the Nexus Claims Data contract.
     * @return claimsData Address of the Nexus Claims Data contract.
    **/
    function _getClaimsData()
      internal
      view
    returns (address claimsData)
    {
        claimsData = nxmMaster.getLatestAddress("CD");
    }

    function _addressArrayFind(address[] memory arr, address elem) internal pure returns(uint256 index) {
        for(uint256 i = 0; i<arr.length; i++) {
            if(arr[i] == elem) {
                return i;
            }
        }
        return type(uint256).max;
    }

    /*---- Ownable functions ----*/

    /**
     * @dev pull nxm from arNFT and wrap it to wnxm
    **/
    function pullNXM(address _from, uint256 _amount, address _to)
      external
      onlyOwner
    {
        nxm.transferFrom(_from, address(this), _amount);
        _wrapNxm(_amount);
        wNxm.transfer(_to, _amount);
    }

    /**
     * @dev Buy NXM direct from Nexus Mutual. Used by ExchangeManager.
     * @param _minNxm Minimum amount of NXM tokens to receive in return for the Ether.
    **/
    function buyNxmWithEther(uint256 _minNxm)
      external
      payable
    {
        require(msg.sender == 0x1337DEF157EfdeF167a81B3baB95385Ce5A14477, "Sender must be ExchangeManager.");
        INXMPool pool = INXMPool(nxmMaster.getLatestAddress("P1"));
        pool.buyNXM{value:address(this).balance}(_minNxm);
    }

    /**
     * @dev Vote on Nexus Mutual governance proposals using tokens.
     * @param _proposalId ID of the proposal to vote on.
     * @param _solutionChosen Side of the proposal we're voting for (0 for no, 1 for yes).
    **/
    function submitVote(uint256 _proposalId, uint256 _solutionChosen)
      external
      onlyOwner
    {
        address gov = nxmMaster.getLatestAddress("GV");
        IGovernance(gov).submitVote(_proposalId, _solutionChosen);
    }

    /**
     * @dev rescue tokens locked in contract
     * @param token address of token to withdraw
     */
    function rescueToken(address token)
      external
      onlyOwner
    {
        require(token != address(nxm) && token != address(wNxm) && token != address(arNxm), "Cannot rescue NXM-based tokens");
        uint256 balance = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(msg.sender, balance);
    }

    /*---- Admin functions ----*/

    /**
     * @dev Owner may change how much of the AUM should be saved in reserve each period.
     * @param _reserveAmount The amount of wNXM (in token Wei) to reserve each period.
    **/
    function changeReserveAmount(uint256 _reserveAmount)
      external
      onlyOwner
    {
        reserveAmount = _reserveAmount;
    }

    /**
     * @dev Owner may change the percent of insurance fees referrers receive.
     * @param _referPercent The percent of fees referrers receive. 50 == 5%.
    **/
    function changeReferPercent(uint256 _referPercent)
      external
      onlyOwner
    {
        require(_referPercent <= 500, "Cannot give referrer more than 50% of rewards.");
        referPercent = _referPercent;
    }

    /**
     * @dev Owner may change the withdraw fee.
     * @param _withdrawFee The fee of withdraw.
    **/
    function changeWithdrawFee(uint256 _withdrawFee)
      external
      onlyOwner
    {
        require(_withdrawFee <= DENOMINATOR, "Cannot take more than 100% of withdraw");
        withdrawFee = _withdrawFee;
    }

    /**
     * @dev Owner may change the withdraw delay.
     * @param _withdrawDelay Withdraw delay.
    **/
    function changeWithdrawDelay(uint256 _withdrawDelay)
      external
      onlyOwner
    {
        withdrawDelay = _withdrawDelay;
    }

    /**
     * @dev Change the percent of rewards that are given for administration of the contract.
     * @param _adminPercent The percent of rewards to be given for administration (10 == 1%, 1000 == 100%)
    **/
    function changeAdminPercent(uint256 _adminPercent)
      external
      onlyOwner
    {
        require(_adminPercent <= 500, "Cannot give admin more than 50% of rewards.");
        adminPercent = _adminPercent;
    }

    /**
     * @dev Owner may change the amount of time it takes to distribute rewards from Nexus.
     * @param _rewardDuration The amount of time it takes to fully distribute rewards.
    **/
    function changeRewardDuration(uint256 _rewardDuration)
      external
      onlyOwner
    {
        require(_rewardDuration <= 30 days, "Reward duration cannot be more than 30 days.");
        rewardDuration = _rewardDuration;
    }

    /**
     * @dev Owner may change the amount of time that withdrawals are paused after a hack is confirmed.
     * @param _pauseDuration The new amount of time that withdrawals will be paused.
    **/
    function changePauseDuration(uint256 _pauseDuration)
      external
      onlyOwner
    {
        require(_pauseDuration <= 30 days, "Pause duration cannot be more than 30 days.");
        pauseDuration = _pauseDuration;
    }

    /**
     * @dev Change beneficiary of the administration funds.
     * @param _newBeneficiary Address of the new beneficiary to receive funds.
    **/
    function changeBeneficiary(address _newBeneficiary)
      external
      onlyOwner
    {
        beneficiary = _newBeneficiary;
    }

    //// Update addition. Proxy paranoia brought it down here. ////

    uint256 public lastRewardTimestamp;

    //// Second update additions. ////

    // Protocol that the next restaking will begin on.
    uint256 private ____deprecated____2;

    // Checkpoint in case we want to cut off certain buckets (where we begin the rotations).
    // To bar protocols from being staked/unstaked, move them to before checkpointProtocol.
    uint256 private ____deprecated____3;

    // Number of protocols to stake each time.
    uint256 private ____deprecated____4;

    // Individual percent to unstake.
    uint256[] private ____deprecated____5;

    // Last time an EOA has called this contract.
    mapping (address => uint256) public lastCall;

    ///// Third update additions. /////

    // Withdraw fee to withdraw immediately.
    uint256 public withdrawFee;

    // Delay to withdraw
    uint256 public withdrawDelay;

    // Total amount of withdrawals pending.
    uint256 public totalPending;

    mapping (address => WithdrawalRequest) public withdrawals;

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAum","type":"uint256"}],"name":"NxmReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"staked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Restake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SecondOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"WithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"adminPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"alertTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arNxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nAmount","type":"uint256"}],"name":"arNxmValue","outputs":[{"internalType":"uint256","name":"arAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aum","outputs":[{"internalType":"uint256","name":"aumTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minNxm","type":"uint256"}],"name":"buyNxmWithEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_adminPercent","type":"uint256"}],"name":"changeAdminPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBeneficiary","type":"address"}],"name":"changeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseDuration","type":"uint256"}],"name":"changePauseDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referPercent","type":"uint256"}],"name":"changeReferPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"changeReserveAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardDuration","type":"uint256"}],"name":"changeRewardDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawDelay","type":"uint256"}],"name":"changeWithdrawDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFee","type":"uint256"}],"name":"changeWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nAmount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"bool","name":"_isNxm","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_shieldMining","type":"address"},{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"address[]","name":"_sponsors","type":"address[]"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getShieldMiningRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wNxm","type":"address"},{"internalType":"address","name":"_arNxm","type":"address"},{"internalType":"address","name":"_nxm","type":"address"},{"internalType":"address","name":"_nxmMaster","type":"address"},{"internalType":"address","name":"_rewardManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRestake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nxmMaster","outputs":[{"internalType":"contract INxmMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arAmount","type":"uint256"}],"name":"nxmValue","outputs":[{"internalType":"uint256","name":"nAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimId","type":"uint256"}],"name":"pauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocols","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"pullNXM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveSecondOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"uint256[]","name":"_stakeAmounts","type":"uint256[]"}],"name":"stakeNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedNxm","outputs":[{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solutionChosen","type":"uint256"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferSecondOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastId","type":"uint256"},{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"uint256[]","name":"_unstakeAmounts","type":"uint256[]"}],"name":"unstakeNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapWnxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wNxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arAmount","type":"uint256"},{"internalType":"bool","name":"_payFee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFinalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint48","name":"requestTime","type":"uint48"},{"internalType":"uint104","name":"nAmount","type":"uint104"},{"internalType":"uint104","name":"arAmount","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalsPaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506145a5806100206000396000f3fe6080604052600436106103815760003560e01c8063857355c9116101d1578063c71859b811610102578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610d95578063f520e7e514610dc8578063f8077fae14610ddd578063fec5363414610df257610381565b8063e941fa7814610d2c578063e9f2838e14610d41578063f181c86714610d56578063f1e7250e14610d8057610381565b8063d7f469da116100dc578063d7f469da14610aee578063daf7b3b414610b03578063dc07065714610c2e578063e90d933114610c6157610381565b8063c71859b814610a9a578063c9b1714914610ac4578063d123738514610ad957610381565b806393a348a61161016f578063a893c9be11610149578063a893c9be14610a1c578063b8a758d614610a46578063c07e587a14610a5b578063c0dab51614610a8557610381565b806393a348a61461099e578063994818db146109c85780639d37b8db146109f257610381565b80638da5cb5b116101ab5780638da5cb5b146109085780638f1ea86a1461091d5780638f32d59b146109325780638fab0db31461095b57610381565b8063857355c91461089657806388d00d26146108ab5780638c396220146108de57610381565b80633f90916a116102b65780635da5bc5511610254578063750c281c11610223578063750c281c146107025780637a9262a21461071f5780637b86935e1461078357806383df67471461085557610381565b80635da5bc55146106935780635fc987c1146106a857806368a9f31c146106bd5780636f93bfb7146106d257610381565b806343a08b781161029057806343a08b78146105e55780634460d3cf146106185780634a3b68cc1461064b5780634b09b72a1461067e57610381565b80633f90916a146105915780633fe3376f146105a65780634100b5aa146105bb57610381565b80631c74a301116103235780632dbc3228116102fd5780632dbc3228146104f257806330e45f051461053557806338af3eed1461054a57806338d074361461055f57610381565b80631c74a30114610489578063202a36cd1461049e57806320eba239146104c857610381565b80630ab51bac1161035f5780630ab51bac146103d75780630f4ef8a6146103ec5780631459457a1461041d5780631c01e6fc1461047457610381565b80630288a39c146103865780630526679c146103ad57806307621eca146103c2575b600080fd5b34801561039257600080fd5b5061039b610e07565b60408051918252519081900360200190f35b3480156103b957600080fd5b5061039b610e0d565b3480156103ce57600080fd5b5061039b610e13565b3480156103e357600080fd5b5061039b610e22565b3480156103f857600080fd5b50610401610f36565b604080516001600160a01b039092168252519081900360200190f35b34801561042957600080fd5b50610472600480360360a081101561044057600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160809091013516610f45565b005b34801561048057600080fd5b5061039b61109a565b34801561049557600080fd5b506104726110a0565b3480156104aa57600080fd5b50610472600480360360208110156104c157600080fd5b5035611110565b3480156104d457600080fd5b50610472600480360360208110156104eb57600080fd5b5035611236565b3480156104fe57600080fd5b506104726004803603606081101561051557600080fd5b506001600160a01b03813581169160208101359160409091013516611282565b34801561054157600080fd5b506104016113e1565b34801561055657600080fd5b506104016113f0565b34801561056b57600080fd5b506104726004803603604081101561058257600080fd5b508035906020013515156113ff565b34801561059d57600080fd5b5061039b6118e9565b3480156105b257600080fd5b506104016118ef565b3480156105c757600080fd5b50610472600480360360208110156105de57600080fd5b50356118fe565b3480156105f157600080fd5b506104726004803603602081101561060857600080fd5b50356001600160a01b031661194a565b34801561062457600080fd5b506104726004803603602081101561063b57600080fd5b50356001600160a01b03166119b9565b34801561065757600080fd5b506104016004803603602081101561066e57600080fd5b50356001600160a01b0316611b2c565b34801561068a57600080fd5b5061039b611b47565b34801561069f57600080fd5b50610401611b4d565b3480156106b457600080fd5b50610401611b5c565b3480156106c957600080fd5b50610401611b6b565b3480156106de57600080fd5b50610472600480360360408110156106f557600080fd5b5080359060200135611b7b565b6104726004803603602081101561071857600080fd5b5035611ca4565b34801561072b57600080fd5b506107526004803603602081101561074257600080fd5b50356001600160a01b0316611dd4565b6040805165ffffffffffff90941684526001600160681b039283166020850152911682820152519081900360600190f35b34801561078f57600080fd5b50610472600480360360608110156107a657600080fd5b81359190810190604081016020820135600160201b8111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460208302840111600160201b831117156107fa57600080fd5b919390929091602081019035600160201b81111561081757600080fd5b82018360208201111561082957600080fd5b803590602001918460208302840111600160201b8311171561084a57600080fd5b509092509050611e0d565b34801561086157600080fd5b506104726004803603606081101561087857600080fd5b508035906001600160a01b0360208201351690604001351515611ec2565b3480156108a257600080fd5b506104726121d6565b3480156108b757600080fd5b5061039b600480360360208110156108ce57600080fd5b50356001600160a01b0316612246565b3480156108ea57600080fd5b506104016004803603602081101561090157600080fd5b5035612258565b34801561091457600080fd5b5061040161227f565b34801561092957600080fd5b5061047261228e565b34801561093e57600080fd5b50610947612353565b604080519115158252519081900360200190f35b34801561096757600080fd5b506104726004803603606081101561097e57600080fd5b506001600160a01b0381358116916020810135909116906040013561237a565b3480156109aa57600080fd5b50610472600480360360208110156109c157600080fd5b50356124ec565b3480156109d457600080fd5b50610472600480360360208110156109eb57600080fd5b503561257a565b3480156109fe57600080fd5b5061047260048036036020811015610a1557600080fd5b5035612607565b348015610a2857600080fd5b5061047260048036036020811015610a3f57600080fd5b5035612695565b348015610a5257600080fd5b50610472612722565b348015610a6757600080fd5b5061039b60048036036020811015610a7e57600080fd5b50356127a7565b348015610a9157600080fd5b5061039b61289d565b348015610aa657600080fd5b5061047260048036036020811015610abd57600080fd5b50356128a3565b348015610ad057600080fd5b5061039b612930565b348015610ae557600080fd5b5061039b612936565b348015610afa57600080fd5b506104726129c2565b348015610b0f57600080fd5b5061047260048036036080811015610b2657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b5057600080fd5b820183602082011115610b6257600080fd5b803590602001918460208302840111600160201b83111715610b8357600080fd5b919390929091602081019035600160201b811115610ba057600080fd5b820183602082011115610bb257600080fd5b803590602001918460208302840111600160201b83111715610bd357600080fd5b919390929091602081019035600160201b811115610bf057600080fd5b820183602082011115610c0257600080fd5b803590602001918460208302840111600160201b83111715610c2357600080fd5b509092509050612c8d565b348015610c3a57600080fd5b5061047260048036036020811015610c5157600080fd5b50356001600160a01b0316612e80565b348015610c6d57600080fd5b5061047260048036036040811015610c8457600080fd5b810190602081018135600160201b811115610c9e57600080fd5b820183602082011115610cb057600080fd5b803590602001918460208302840111600160201b83111715610cd157600080fd5b919390929091602081019035600160201b811115610cee57600080fd5b820183602082011115610d0057600080fd5b803590602001918460208302840111600160201b83111715610d2157600080fd5b509092509050612ee9565b348015610d3857600080fd5b5061039b612f9d565b348015610d4d57600080fd5b5061039b612fa3565b348015610d6257600080fd5b5061039b60048036036020811015610d7957600080fd5b5035612fa9565b348015610d8c57600080fd5b5061039b613062565b348015610da157600080fd5b5061047260048036036020811015610db857600080fd5b50356001600160a01b0316613068565b348015610dd457600080fd5b5061039b6130d7565b348015610de957600080fd5b5061039b6130dd565b348015610dfe57600080fd5b506104726130e3565b60515481565b603b5481565b6000610e1d613132565b905090565b600080610e2d6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d6020811015610ea857600080fd5b5051604080516339ac5eb960e01b815230600482015290519192506000916001600160a01b038516916339ac5eb9916024808301926020929190829003018186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b50519050610f2e828261322c565b935050505090565b6048546001600160a01b031681565b6046546001600160a01b031615610f8d5760405162461bcd60e51b81526004018080602001828103825260268152602001806144326026913960400191505060405180910390fd5b610f95613247565b604480546001600160a01b038088166001600160a01b031992831617835560458054878316908416179055604680548883169084161790819055604780548784169085161790556048805486841690851681179091556000603d8190556019603e556801a055690d9db80000603955620d2f00603b55603c80549095163317909455620bdd806037556040805163095ea7b360e01b81526004810192909252600019602483015251919092169363095ea7b3938382019360209392908390030190829087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b50505050505050565b603f5481565b6001546001600160a01b031633146110e95760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b6001546110fe906001600160a01b0316613316565b600180546001600160a01b0319169055565b600061111a613384565b90506000816001600160a01b0316630325ea37846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d604081101561118b57600080fd5b5060209081015160408051630a9a1f1b60e31b81526004810187905290519193506000926001600160a01b038616926354d0f8d8926024808201939291829003018186803b1580156111dc57600080fd5b505afa1580156111f0573d6000803e3d6000fd5b505050506040513d602081101561120657600080fd5b50519050600e82148015611226575062093a8061122342836133d3565b11155b156112305742603a555b50505050565b61123e612353565b61127d576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b605155565b61128a612353565b6112c9576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604554604080516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d602081101561134f57600080fd5b5061135b9050826133e8565b604480546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529151919092169263a9059cbb928082019260209290918290030181600087803b1580156113b057600080fd5b505af11580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b5050505050565b6045546001600160a01b031681565b603c546001600160a01b031681565b326000908152604f6020526040902054421161144c5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f602052604090204290819055603b54603a549091611471916133d3565b116114ad5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b60006114b883612fa9565b604554604080516370a0823160e01b815230600482015290519293506001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b505160525461153f908361322c565b111561157c5760405162461bcd60e51b81526004018080602001828103825260298152602001806144fc6029913960400191505060405180910390fd5b81156116a05760006115a56103e861159f6050548561345f90919063ffffffff16565b90613486565b905060006115b383836133d3565b60465460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac916044808201926020929091908290030181600087803b15801561160a57600080fd5b505af115801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b506116409050816133e8565b604454611657906001600160a01b031633836134a8565b60408051848152602081018790524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250506118e4565b6052546116ad908261322c565b6052556046546116c8906001600160a01b03163330866134fa565b6116d061430f565b60536000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060600160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a90046001600160681b03166001600160681b03166001600160681b031681526020016000820160139054906101000a90046001600160681b03166001600160681b03166001600160681b031681525050905060405180606001604052804265ffffffffffff168152602001838360200151016001600160681b03168152602001858360400151016001600160681b031681525060536000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a8154816001600160681b0302191690836001600160681b0316021790555060408201518160000160136101000a8154816001600160681b0302191690836001600160681b03160217905550905050336001600160a01b03167f1f0d204a59639d21245dbaa239dfc9a6227aa86cb614bdda19843c52d155fcfa8584426118bd6051544261322c90919063ffffffff16565b604080519485526020850193909352838301919091526060830152519081900360800190a2505b505050565b60525481565b6046546001600160a01b031681565b611906612353565b611945576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603955565b6002546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6119c1612353565b611a00576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6045546001600160a01b03828116911614801590611a2c57506044546001600160a01b03828116911614155b8015611a4657506046546001600160a01b03828116911614155b611a97576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420726573637565204e584d2d626173656420746f6b656e730000604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b50519050611b286001600160a01b03831633836134a8565b5050565b6049602052600090815260409020546001600160a01b031681565b60395481565b6044546001600160a01b031681565b6047546001600160a01b031681565b6002546001600160a01b03165b90565b611b83612353565b611bc2576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604754604080516227050b60e31b81526123ab60f11b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b505160408051636f93bfb760e01b8152600481018690526024810185905290519192506001600160a01b03831691636f93bfb79160448082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611091573d6000803e3d6000fd5b731337def157efdef167a81b3bab95385ce5a144773314611d0c576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206d7573742062652045786368616e67654d616e616765722e00604482015290519081900360640190fd5b604754604080516227050b60e31b815261503160f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611d5b57600080fd5b505afa158015611d6f573d6000803e3d6000fd5b505050506040513d6020811015611d8557600080fd5b5051604080516304b1dde360e51b81526004810185905290519192506001600160a01b0383169163963bbc60914791602480830192600092919082900301818588803b158015611c9057600080fd5b60536020526000908152604090205465ffffffffffff8116906001600160681b0366010000000000008204811691600160981b90041683565b611e15612353565b611e54576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061355492505050565b326000908152604f60205260409020544211611f0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f6020908152604080832042905533835260499091529020546001600160a01b03166120bd576001600160a01b038216611f5b57603c546001600160a01b0316611f5d565b815b33600090815260496020526040812080546001600160a01b0319166001600160a01b03938416179055908316611f9e57603c546001600160a01b0316611fa0565b825b33600081815260496020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915560465482516370a0823160e01b81526004810196909652915195965092949216926370a082319260248083019392829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051905080156120ba576048546040805163bf6eac2f60e01b81526001600160a01b038581166004830152336024830152604482018590529151919092169163bf6eac2f91606480830192600092919082900301818387803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050505b50505b60006120c8846127a7565b905081156120ed576045546120e8906001600160a01b03163330876134fa565b61210e565b604454612105906001600160a01b03163330876134fa565b61210e84613650565b604654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b505060408051858152602081018390524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a250505050565b6003546001600160a01b0316331461221f5760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b600354612234906001600160a01b031661369d565b600380546001600160a01b0319169055565b604f6020526000908152604090205481565b6041818154811061226557fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031690565b3332146122db576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b60006122e5610e22565b905060006122f161370c565b905080156123445742604a819055604080518381526020810192909252818101849052517f1574d0bf0b356a89be9bcfedeed722e6c9b5ba2f0d3aa4be6ef11888b1d1f7f79181900360600190a1611b28565b604a54611b285742604a555050565b600080546001600160a01b0316331480610e1d5750506002546001600160a01b0316331490565b6046546001600160a01b031633146123c35760405162461bcd60e51b81526004018080602001828103825260228152602001806143e26022913960400191505060405180910390fd5b6001600160a01b038381166000908152604960205260409020541615612464576048546001600160a01b03848116600081815260496020526040808220548151636ce5768960e11b8152908516600482015260248101939093526044830186905251929093169263d9caed129260648084019382900301818387803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050505b6001600160a01b0382811660009081526049602052604090205416156118e4576048546001600160a01b0383811660008181526049602052604080822054815163bf6eac2f60e01b8152908516600482015260248101939093526044830186905251929093169263bf6eac2f9260648084019382900301818387803b158015611c9057600080fd5b6124f4612353565b612533576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156125755760405162461bcd60e51b815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b603755565b612582612353565b6125c1576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f48111156126025760405162461bcd60e51b815260040180806020018281038252602e815260200180614404602e913960400191505060405180910390fd5b603e55565b61260f612353565b61264e576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156126905760405162461bcd60e51b815260040180806020018281038252602b815260200180614458602b913960400191505060405180910390fd5b603b55565b61269d612353565b6126dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6103e881111561271d5760405162461bcd60e51b815260040180806020018281038252602681526020018061438b6026913960400191505060405180910390fd5b605055565b604454604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561276d57600080fd5b505afa158015612781573d6000803e3d6000fd5b505050506040513d602081101561279757600080fd5b505190506127a481613650565b50565b6000806127b2613132565b905060006127d46040546127ce846127c8610e22565b9061322c565b906133d3565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282657600080fd5b505afa15801561283a573d6000803e3d6000fd5b505050506040513d602081101561285057600080fd5b505190508161286157849350612895565b60006128798361159f84670de0b6b3a764000061345f565b9050612891670de0b6b3a764000061159f888461345f565b9450505b505050919050565b603d5481565b6128ab612353565b6128ea576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f481111561292b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614545602b913960400191505060405180910390fd5b603d55565b60405481565b6000806129416131ac565b9050806001600160a01b03166339ac5eb9306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561299057600080fd5b505afa1580156129a4573d6000803e3d6000fd5b505050506040513d60208110156129ba57600080fd5b505192915050565b326000908152604f60205260409020544211612a0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f60205260409020429055612a2961430f565b50336000908152605360209081526040918290208251606081018452905465ffffffffffff81168083526001600160681b03660100000000000083048116948401859052600160981b909204909116938201849052603b54603a54929492612a929042906133d3565b11612ace5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b42612ae46051548361322c90919063ffffffff16565b1115612b2f576040805162461bcd60e51b81526020600482015260156024820152744e6f7420726561647920746f20776974686472617760581b604482015290519081900360640190fd5b60008311612b84576040805162461bcd60e51b815260206004820152601d60248201527f4e6f2070656e64696e6720616d6f756e7420746f207769746864726177000000604482015290519081900360640190fd5b60465460408051632770a7eb60e21b81523060048201526024810185905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b158015612bd857600080fd5b505af1158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b50612c0e9050836133e8565b604454612c25906001600160a01b031633856134a8565b33600090815260536020526040812055605254612c4290846133d3565b60525560408051848152602081018490524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250505050565b333214612cda576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b866001600160a01b031663a82e84e98787878787876040518763ffffffff1660e01b81526004018080602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f19169091018581038352868152602090810191508790870280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612dec57600080fd5b8101908080516040519392919084600160201b821115612e0b57600080fd5b908301906020820185811115612e2057600080fd5b82518660208202830111600160201b82111715612e3c57600080fd5b82525081516020918201928201910280838360005b83811015612e69578181015183820152602001612e51565b505050509050016040525050505050505050505050565b612e88612353565b612ec7576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0392909216919091179055565b612ef1612353565b612f30576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061381492505050565b60505481565b603a5481565b600080612fb4613132565b90506000612fca6040546127ce846127c8610e22565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301c57600080fd5b505afa158015613030573d6000803e3d6000fd5b505050506040513d602081101561304657600080fd5b5051905060006128798261159f85670de0b6b3a764000061345f565b603e5481565b6000546001600160a01b031633146130b5576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60375481565b604a5481565b6130eb612353565b61312a576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6127a4613d37565b603754604a546000919082906131499042906133d3565b90508061315b57600092505050611b78565b81811061316c5760405492506131a7565b60006131848261159f85670de0b6b3a764000061345f565b9050610f2e8161159f670de0b6b3a764000060405461345f90919063ffffffff16565b505090565b604754604080516227050b60e31b815261505360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b505afa15801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051919050565b60008282018381101561323e57600080fd5b90505b92915050565b6000546001600160a01b03161561329b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60008054336001600160a01b0319918216811783556002805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360405133906000907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca908290a3565b6001600160a01b03811661332957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604754604080516227050b60e31b81526110d160f21b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000828211156133e257600080fd5b50900390565b6044546133fe906001600160a01b031682613e25565b60445460408051630ea598cb60e41b81526004810184905290516001600160a01b039092169163ea598cb09160248082019260009290919082900301818387803b15801561344b57600080fd5b505af11580156113da573d6000803e3d6000fd5b60008261346e57506000613241565b8282028284828161347b57fe5b041461323e57600080fd5b600080821161349457600080fd5b600082848161349f57fe5b04949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526118e4908490613ea5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611230908590613ea5565b600061355e6131ac565b9050806001600160a01b0316638e91e6bd8484876040518463ffffffff1660e01b8152600401808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156135cb5781810151838201526020016135b3565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561360a5781810151838201526020016135f2565b5050505090500195505050505050600060405180830381600087803b15801561363257600080fd5b505af1158015613646573d6000803e3d6000fd5b5050505050505050565b60445460408051636f074d1f60e11b81526004810184905290516001600160a01b039092169163de0e9a3e9160248082019260009290919082900301818387803b15801561344b57600080fd5b6001600160a01b0381166136b057600080fd5b6002546040516001600160a01b038084169216907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806137176131ac565b90506000816001600160a01b0316630ea474c7306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561376857600080fd5b505afa15801561377c573d6000803e3d6000fd5b505050506040513d602081101561379257600080fd5b5051905061379f8161405d565b9250816001600160a01b031663b86e321c306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156137f057600080fd5b505af1158015613804573d6000803e3d6000fd5b5050505082604081905550505090565b60008061381f6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561387057600080fd5b505afa158015613884573d6000803e3d6000fd5b505050506040513d602081101561389a57600080fd5b505160525460395491925082916138b09161322c565b11156138bf57600092506138f3565b6138e06138d960525460395461322c90919063ffffffff16565b82906133d3565b92506138f36138ed614235565b84613e25565b6060826001600160a01b0316635840ee44306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561397f57600080fd5b8101908080516040519392919084600160201b82111561399e57600080fd5b9083019060208201858111156139b357600080fd5b82518660208202830111600160201b821117156139cf57600080fd5b82525081516020918201928201910280838360005b838110156139fc5781810151838201526020016139e4565b50505050905001604052505050905060005b8151811015613b22576042846001600160a01b031663eae0171830858581518110613a3557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d6020811015613ab457600080fd5b5051815460018101835560009283526020909220909101558151604390839083908110613add57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501613a0e565b5060005b8651811015613c1d576000878281518110613b3d57fe5b602002602001015190506000613b538483614284565b9050600019811415613bdf57604380546001810182556000919091527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027930180546001600160a01b0319166001600160a01b0384161790558751604290899085908110613bbb57fe5b60209081029190910181015182546001810184556000938452919092200155613c13565b878381518110613beb57fe5b602002602001015160428281548110613c0057fe5b6000918252602090912001805490910190555b5050600101613b26565b50826001600160a01b031663c001472e85604360426040518463ffffffff1660e01b81526004018084815260200180602001806020018381038352858181548152602001915080548015613c9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613c7c575b50508381038252848181548152602001915080548015613cd957602002820191906000526020600020905b815481526020019060010190808311613cc5575b505095505050505050600060405180830381600087803b158015613cfc57600080fd5b505af1158015613d10573d6000803e3d6000fd5b5050505060436000613d22919061432f565b613d2e6042600061432f565b50505092915050565b600080613d426131ac565b9050806001600160a01b031663afd369fd306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d9157600080fd5b505afa158015613da5573d6000803e3d6000fd5b505050506040513d6020811015613dbb57600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519193506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b158015613e0957600080fd5b505af1158015613e1d573d6000803e3d6000fd5b505050505090565b6045546040805163095ea7b360e01b81526001600160a01b038581166004830152602482018590529151919092169163095ea7b39160448083019260209291908290030181600087803b158015613e7b57600080fd5b505af1158015613e8f573d6000803e3d6000fd5b505050506040513d602081101561123057600080fd5b613eb7826001600160a01b03166142d8565b613f08576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613f465780518252601f199092019160209182019101613f27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b509150915081614004576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112305780806020019051602081101561402057600080fd5b50516112305760405162461bcd60e51b815260040180806020018281038252602a8152602001806144af602a913960400191505060405180910390fd5b60008061408361407e6103e861159f603d548761345f90919063ffffffff16565b6127a7565b905060006140a561407e6103e861159f603e548861345f90919063ffffffff16565b9050811561413357604654603c54604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f199160448083019260209291908290030181600087803b15801561410657600080fd5b505af115801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b50505b801561421f57604654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d60208110156141b757600080fd5b505060485460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561420657600080fd5b505af115801561421a573d6000803e3d6000fd5b505050505b61422d816127ce86856133d3565b949350505050565b604754604080516227050b60e31b815261544360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000805b83518110156142cd57826001600160a01b03168482815181106142a757fe5b60200260200101516001600160a01b031614156142c5579050613241565b600101614288565b506000199392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061422d5750141592915050565b604080516060810182526000808252602082018190529181019190915290565b50805460008255906000526020600020908101906127a491905b8082111561435d5760008155600101614349565b509056fe6f6e6c792070656e64696e67206f776e65722063616e2063616c6c20746869732066756e6374696f6e43616e6e6f742074616b65206d6f7265207468616e2031303025206f662077697468647261774d6179206f6e6c792063616c6c207468697320636f6e7472616374206f6e636520706572207472616e73616374696f6e2e53656e646572206d7573742062652074686520746f6b656e20636f6e74726163742e43616e6e6f742067697665207265666572726572206d6f7265207468616e20353025206f6620726577617264732e436f6e74726163742068617320616c7265616479206265656e20696e697469616c697a65642e5061757365206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e526577617264206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645769746864726177616c73206172652074656d706f726172696c79207061757365642e4e6f7420656e6f756768204e584d20617661696c61626c6520666f7220776974746864726177616c2e6d73672e73656e646572206973206e6f74206f776e657200000000000000000043616e6e6f7420676976652061646d696e206d6f7265207468616e20353025206f6620726577617264732ea26469706673582212208e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103815760003560e01c8063857355c9116101d1578063c71859b811610102578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610d95578063f520e7e514610dc8578063f8077fae14610ddd578063fec5363414610df257610381565b8063e941fa7814610d2c578063e9f2838e14610d41578063f181c86714610d56578063f1e7250e14610d8057610381565b8063d7f469da116100dc578063d7f469da14610aee578063daf7b3b414610b03578063dc07065714610c2e578063e90d933114610c6157610381565b8063c71859b814610a9a578063c9b1714914610ac4578063d123738514610ad957610381565b806393a348a61161016f578063a893c9be11610149578063a893c9be14610a1c578063b8a758d614610a46578063c07e587a14610a5b578063c0dab51614610a8557610381565b806393a348a61461099e578063994818db146109c85780639d37b8db146109f257610381565b80638da5cb5b116101ab5780638da5cb5b146109085780638f1ea86a1461091d5780638f32d59b146109325780638fab0db31461095b57610381565b8063857355c91461089657806388d00d26146108ab5780638c396220146108de57610381565b80633f90916a116102b65780635da5bc5511610254578063750c281c11610223578063750c281c146107025780637a9262a21461071f5780637b86935e1461078357806383df67471461085557610381565b80635da5bc55146106935780635fc987c1146106a857806368a9f31c146106bd5780636f93bfb7146106d257610381565b806343a08b781161029057806343a08b78146105e55780634460d3cf146106185780634a3b68cc1461064b5780634b09b72a1461067e57610381565b80633f90916a146105915780633fe3376f146105a65780634100b5aa146105bb57610381565b80631c74a301116103235780632dbc3228116102fd5780632dbc3228146104f257806330e45f051461053557806338af3eed1461054a57806338d074361461055f57610381565b80631c74a30114610489578063202a36cd1461049e57806320eba239146104c857610381565b80630ab51bac1161035f5780630ab51bac146103d75780630f4ef8a6146103ec5780631459457a1461041d5780631c01e6fc1461047457610381565b80630288a39c146103865780630526679c146103ad57806307621eca146103c2575b600080fd5b34801561039257600080fd5b5061039b610e07565b60408051918252519081900360200190f35b3480156103b957600080fd5b5061039b610e0d565b3480156103ce57600080fd5b5061039b610e13565b3480156103e357600080fd5b5061039b610e22565b3480156103f857600080fd5b50610401610f36565b604080516001600160a01b039092168252519081900360200190f35b34801561042957600080fd5b50610472600480360360a081101561044057600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160809091013516610f45565b005b34801561048057600080fd5b5061039b61109a565b34801561049557600080fd5b506104726110a0565b3480156104aa57600080fd5b50610472600480360360208110156104c157600080fd5b5035611110565b3480156104d457600080fd5b50610472600480360360208110156104eb57600080fd5b5035611236565b3480156104fe57600080fd5b506104726004803603606081101561051557600080fd5b506001600160a01b03813581169160208101359160409091013516611282565b34801561054157600080fd5b506104016113e1565b34801561055657600080fd5b506104016113f0565b34801561056b57600080fd5b506104726004803603604081101561058257600080fd5b508035906020013515156113ff565b34801561059d57600080fd5b5061039b6118e9565b3480156105b257600080fd5b506104016118ef565b3480156105c757600080fd5b50610472600480360360208110156105de57600080fd5b50356118fe565b3480156105f157600080fd5b506104726004803603602081101561060857600080fd5b50356001600160a01b031661194a565b34801561062457600080fd5b506104726004803603602081101561063b57600080fd5b50356001600160a01b03166119b9565b34801561065757600080fd5b506104016004803603602081101561066e57600080fd5b50356001600160a01b0316611b2c565b34801561068a57600080fd5b5061039b611b47565b34801561069f57600080fd5b50610401611b4d565b3480156106b457600080fd5b50610401611b5c565b3480156106c957600080fd5b50610401611b6b565b3480156106de57600080fd5b50610472600480360360408110156106f557600080fd5b5080359060200135611b7b565b6104726004803603602081101561071857600080fd5b5035611ca4565b34801561072b57600080fd5b506107526004803603602081101561074257600080fd5b50356001600160a01b0316611dd4565b6040805165ffffffffffff90941684526001600160681b039283166020850152911682820152519081900360600190f35b34801561078f57600080fd5b50610472600480360360608110156107a657600080fd5b81359190810190604081016020820135600160201b8111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460208302840111600160201b831117156107fa57600080fd5b919390929091602081019035600160201b81111561081757600080fd5b82018360208201111561082957600080fd5b803590602001918460208302840111600160201b8311171561084a57600080fd5b509092509050611e0d565b34801561086157600080fd5b506104726004803603606081101561087857600080fd5b508035906001600160a01b0360208201351690604001351515611ec2565b3480156108a257600080fd5b506104726121d6565b3480156108b757600080fd5b5061039b600480360360208110156108ce57600080fd5b50356001600160a01b0316612246565b3480156108ea57600080fd5b506104016004803603602081101561090157600080fd5b5035612258565b34801561091457600080fd5b5061040161227f565b34801561092957600080fd5b5061047261228e565b34801561093e57600080fd5b50610947612353565b604080519115158252519081900360200190f35b34801561096757600080fd5b506104726004803603606081101561097e57600080fd5b506001600160a01b0381358116916020810135909116906040013561237a565b3480156109aa57600080fd5b50610472600480360360208110156109c157600080fd5b50356124ec565b3480156109d457600080fd5b50610472600480360360208110156109eb57600080fd5b503561257a565b3480156109fe57600080fd5b5061047260048036036020811015610a1557600080fd5b5035612607565b348015610a2857600080fd5b5061047260048036036020811015610a3f57600080fd5b5035612695565b348015610a5257600080fd5b50610472612722565b348015610a6757600080fd5b5061039b60048036036020811015610a7e57600080fd5b50356127a7565b348015610a9157600080fd5b5061039b61289d565b348015610aa657600080fd5b5061047260048036036020811015610abd57600080fd5b50356128a3565b348015610ad057600080fd5b5061039b612930565b348015610ae557600080fd5b5061039b612936565b348015610afa57600080fd5b506104726129c2565b348015610b0f57600080fd5b5061047260048036036080811015610b2657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b5057600080fd5b820183602082011115610b6257600080fd5b803590602001918460208302840111600160201b83111715610b8357600080fd5b919390929091602081019035600160201b811115610ba057600080fd5b820183602082011115610bb257600080fd5b803590602001918460208302840111600160201b83111715610bd357600080fd5b919390929091602081019035600160201b811115610bf057600080fd5b820183602082011115610c0257600080fd5b803590602001918460208302840111600160201b83111715610c2357600080fd5b509092509050612c8d565b348015610c3a57600080fd5b5061047260048036036020811015610c5157600080fd5b50356001600160a01b0316612e80565b348015610c6d57600080fd5b5061047260048036036040811015610c8457600080fd5b810190602081018135600160201b811115610c9e57600080fd5b820183602082011115610cb057600080fd5b803590602001918460208302840111600160201b83111715610cd157600080fd5b919390929091602081019035600160201b811115610cee57600080fd5b820183602082011115610d0057600080fd5b803590602001918460208302840111600160201b83111715610d2157600080fd5b509092509050612ee9565b348015610d3857600080fd5b5061039b612f9d565b348015610d4d57600080fd5b5061039b612fa3565b348015610d6257600080fd5b5061039b60048036036020811015610d7957600080fd5b5035612fa9565b348015610d8c57600080fd5b5061039b613062565b348015610da157600080fd5b5061047260048036036020811015610db857600080fd5b50356001600160a01b0316613068565b348015610dd457600080fd5b5061039b6130d7565b348015610de957600080fd5b5061039b6130dd565b348015610dfe57600080fd5b506104726130e3565b60515481565b603b5481565b6000610e1d613132565b905090565b600080610e2d6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d6020811015610ea857600080fd5b5051604080516339ac5eb960e01b815230600482015290519192506000916001600160a01b038516916339ac5eb9916024808301926020929190829003018186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b50519050610f2e828261322c565b935050505090565b6048546001600160a01b031681565b6046546001600160a01b031615610f8d5760405162461bcd60e51b81526004018080602001828103825260268152602001806144326026913960400191505060405180910390fd5b610f95613247565b604480546001600160a01b038088166001600160a01b031992831617835560458054878316908416179055604680548883169084161790819055604780548784169085161790556048805486841690851681179091556000603d8190556019603e556801a055690d9db80000603955620d2f00603b55603c80549095163317909455620bdd806037556040805163095ea7b360e01b81526004810192909252600019602483015251919092169363095ea7b3938382019360209392908390030190829087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b50505050505050565b603f5481565b6001546001600160a01b031633146110e95760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b6001546110fe906001600160a01b0316613316565b600180546001600160a01b0319169055565b600061111a613384565b90506000816001600160a01b0316630325ea37846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d604081101561118b57600080fd5b5060209081015160408051630a9a1f1b60e31b81526004810187905290519193506000926001600160a01b038616926354d0f8d8926024808201939291829003018186803b1580156111dc57600080fd5b505afa1580156111f0573d6000803e3d6000fd5b505050506040513d602081101561120657600080fd5b50519050600e82148015611226575062093a8061122342836133d3565b11155b156112305742603a555b50505050565b61123e612353565b61127d576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b605155565b61128a612353565b6112c9576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604554604080516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d602081101561134f57600080fd5b5061135b9050826133e8565b604480546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529151919092169263a9059cbb928082019260209290918290030181600087803b1580156113b057600080fd5b505af11580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b5050505050565b6045546001600160a01b031681565b603c546001600160a01b031681565b326000908152604f6020526040902054421161144c5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f602052604090204290819055603b54603a549091611471916133d3565b116114ad5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b60006114b883612fa9565b604554604080516370a0823160e01b815230600482015290519293506001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b505160525461153f908361322c565b111561157c5760405162461bcd60e51b81526004018080602001828103825260298152602001806144fc6029913960400191505060405180910390fd5b81156116a05760006115a56103e861159f6050548561345f90919063ffffffff16565b90613486565b905060006115b383836133d3565b60465460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac916044808201926020929091908290030181600087803b15801561160a57600080fd5b505af115801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b506116409050816133e8565b604454611657906001600160a01b031633836134a8565b60408051848152602081018790524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250506118e4565b6052546116ad908261322c565b6052556046546116c8906001600160a01b03163330866134fa565b6116d061430f565b60536000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060600160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a90046001600160681b03166001600160681b03166001600160681b031681526020016000820160139054906101000a90046001600160681b03166001600160681b03166001600160681b031681525050905060405180606001604052804265ffffffffffff168152602001838360200151016001600160681b03168152602001858360400151016001600160681b031681525060536000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a8154816001600160681b0302191690836001600160681b0316021790555060408201518160000160136101000a8154816001600160681b0302191690836001600160681b03160217905550905050336001600160a01b03167f1f0d204a59639d21245dbaa239dfc9a6227aa86cb614bdda19843c52d155fcfa8584426118bd6051544261322c90919063ffffffff16565b604080519485526020850193909352838301919091526060830152519081900360800190a2505b505050565b60525481565b6046546001600160a01b031681565b611906612353565b611945576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603955565b6002546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6119c1612353565b611a00576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6045546001600160a01b03828116911614801590611a2c57506044546001600160a01b03828116911614155b8015611a4657506046546001600160a01b03828116911614155b611a97576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420726573637565204e584d2d626173656420746f6b656e730000604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b50519050611b286001600160a01b03831633836134a8565b5050565b6049602052600090815260409020546001600160a01b031681565b60395481565b6044546001600160a01b031681565b6047546001600160a01b031681565b6002546001600160a01b03165b90565b611b83612353565b611bc2576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604754604080516227050b60e31b81526123ab60f11b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b505160408051636f93bfb760e01b8152600481018690526024810185905290519192506001600160a01b03831691636f93bfb79160448082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611091573d6000803e3d6000fd5b731337def157efdef167a81b3bab95385ce5a144773314611d0c576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206d7573742062652045786368616e67654d616e616765722e00604482015290519081900360640190fd5b604754604080516227050b60e31b815261503160f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611d5b57600080fd5b505afa158015611d6f573d6000803e3d6000fd5b505050506040513d6020811015611d8557600080fd5b5051604080516304b1dde360e51b81526004810185905290519192506001600160a01b0383169163963bbc60914791602480830192600092919082900301818588803b158015611c9057600080fd5b60536020526000908152604090205465ffffffffffff8116906001600160681b0366010000000000008204811691600160981b90041683565b611e15612353565b611e54576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061355492505050565b326000908152604f60205260409020544211611f0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f6020908152604080832042905533835260499091529020546001600160a01b03166120bd576001600160a01b038216611f5b57603c546001600160a01b0316611f5d565b815b33600090815260496020526040812080546001600160a01b0319166001600160a01b03938416179055908316611f9e57603c546001600160a01b0316611fa0565b825b33600081815260496020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915560465482516370a0823160e01b81526004810196909652915195965092949216926370a082319260248083019392829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051905080156120ba576048546040805163bf6eac2f60e01b81526001600160a01b038581166004830152336024830152604482018590529151919092169163bf6eac2f91606480830192600092919082900301818387803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050505b50505b60006120c8846127a7565b905081156120ed576045546120e8906001600160a01b03163330876134fa565b61210e565b604454612105906001600160a01b03163330876134fa565b61210e84613650565b604654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b505060408051858152602081018390524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a250505050565b6003546001600160a01b0316331461221f5760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b600354612234906001600160a01b031661369d565b600380546001600160a01b0319169055565b604f6020526000908152604090205481565b6041818154811061226557fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031690565b3332146122db576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b60006122e5610e22565b905060006122f161370c565b905080156123445742604a819055604080518381526020810192909252818101849052517f1574d0bf0b356a89be9bcfedeed722e6c9b5ba2f0d3aa4be6ef11888b1d1f7f79181900360600190a1611b28565b604a54611b285742604a555050565b600080546001600160a01b0316331480610e1d5750506002546001600160a01b0316331490565b6046546001600160a01b031633146123c35760405162461bcd60e51b81526004018080602001828103825260228152602001806143e26022913960400191505060405180910390fd5b6001600160a01b038381166000908152604960205260409020541615612464576048546001600160a01b03848116600081815260496020526040808220548151636ce5768960e11b8152908516600482015260248101939093526044830186905251929093169263d9caed129260648084019382900301818387803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050505b6001600160a01b0382811660009081526049602052604090205416156118e4576048546001600160a01b0383811660008181526049602052604080822054815163bf6eac2f60e01b8152908516600482015260248101939093526044830186905251929093169263bf6eac2f9260648084019382900301818387803b158015611c9057600080fd5b6124f4612353565b612533576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156125755760405162461bcd60e51b815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b603755565b612582612353565b6125c1576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f48111156126025760405162461bcd60e51b815260040180806020018281038252602e815260200180614404602e913960400191505060405180910390fd5b603e55565b61260f612353565b61264e576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156126905760405162461bcd60e51b815260040180806020018281038252602b815260200180614458602b913960400191505060405180910390fd5b603b55565b61269d612353565b6126dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6103e881111561271d5760405162461bcd60e51b815260040180806020018281038252602681526020018061438b6026913960400191505060405180910390fd5b605055565b604454604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561276d57600080fd5b505afa158015612781573d6000803e3d6000fd5b505050506040513d602081101561279757600080fd5b505190506127a481613650565b50565b6000806127b2613132565b905060006127d46040546127ce846127c8610e22565b9061322c565b906133d3565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282657600080fd5b505afa15801561283a573d6000803e3d6000fd5b505050506040513d602081101561285057600080fd5b505190508161286157849350612895565b60006128798361159f84670de0b6b3a764000061345f565b9050612891670de0b6b3a764000061159f888461345f565b9450505b505050919050565b603d5481565b6128ab612353565b6128ea576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f481111561292b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614545602b913960400191505060405180910390fd5b603d55565b60405481565b6000806129416131ac565b9050806001600160a01b03166339ac5eb9306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561299057600080fd5b505afa1580156129a4573d6000803e3d6000fd5b505050506040513d60208110156129ba57600080fd5b505192915050565b326000908152604f60205260409020544211612a0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f60205260409020429055612a2961430f565b50336000908152605360209081526040918290208251606081018452905465ffffffffffff81168083526001600160681b03660100000000000083048116948401859052600160981b909204909116938201849052603b54603a54929492612a929042906133d3565b11612ace5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b42612ae46051548361322c90919063ffffffff16565b1115612b2f576040805162461bcd60e51b81526020600482015260156024820152744e6f7420726561647920746f20776974686472617760581b604482015290519081900360640190fd5b60008311612b84576040805162461bcd60e51b815260206004820152601d60248201527f4e6f2070656e64696e6720616d6f756e7420746f207769746864726177000000604482015290519081900360640190fd5b60465460408051632770a7eb60e21b81523060048201526024810185905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b158015612bd857600080fd5b505af1158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b50612c0e9050836133e8565b604454612c25906001600160a01b031633856134a8565b33600090815260536020526040812055605254612c4290846133d3565b60525560408051848152602081018490524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250505050565b333214612cda576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b866001600160a01b031663a82e84e98787878787876040518763ffffffff1660e01b81526004018080602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f19169091018581038352868152602090810191508790870280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612dec57600080fd5b8101908080516040519392919084600160201b821115612e0b57600080fd5b908301906020820185811115612e2057600080fd5b82518660208202830111600160201b82111715612e3c57600080fd5b82525081516020918201928201910280838360005b83811015612e69578181015183820152602001612e51565b505050509050016040525050505050505050505050565b612e88612353565b612ec7576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0392909216919091179055565b612ef1612353565b612f30576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061381492505050565b60505481565b603a5481565b600080612fb4613132565b90506000612fca6040546127ce846127c8610e22565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301c57600080fd5b505afa158015613030573d6000803e3d6000fd5b505050506040513d602081101561304657600080fd5b5051905060006128798261159f85670de0b6b3a764000061345f565b603e5481565b6000546001600160a01b031633146130b5576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60375481565b604a5481565b6130eb612353565b61312a576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6127a4613d37565b603754604a546000919082906131499042906133d3565b90508061315b57600092505050611b78565b81811061316c5760405492506131a7565b60006131848261159f85670de0b6b3a764000061345f565b9050610f2e8161159f670de0b6b3a764000060405461345f90919063ffffffff16565b505090565b604754604080516227050b60e31b815261505360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b505afa15801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051919050565b60008282018381101561323e57600080fd5b90505b92915050565b6000546001600160a01b03161561329b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60008054336001600160a01b0319918216811783556002805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360405133906000907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca908290a3565b6001600160a01b03811661332957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604754604080516227050b60e31b81526110d160f21b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000828211156133e257600080fd5b50900390565b6044546133fe906001600160a01b031682613e25565b60445460408051630ea598cb60e41b81526004810184905290516001600160a01b039092169163ea598cb09160248082019260009290919082900301818387803b15801561344b57600080fd5b505af11580156113da573d6000803e3d6000fd5b60008261346e57506000613241565b8282028284828161347b57fe5b041461323e57600080fd5b600080821161349457600080fd5b600082848161349f57fe5b04949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526118e4908490613ea5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611230908590613ea5565b600061355e6131ac565b9050806001600160a01b0316638e91e6bd8484876040518463ffffffff1660e01b8152600401808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156135cb5781810151838201526020016135b3565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561360a5781810151838201526020016135f2565b5050505090500195505050505050600060405180830381600087803b15801561363257600080fd5b505af1158015613646573d6000803e3d6000fd5b5050505050505050565b60445460408051636f074d1f60e11b81526004810184905290516001600160a01b039092169163de0e9a3e9160248082019260009290919082900301818387803b15801561344b57600080fd5b6001600160a01b0381166136b057600080fd5b6002546040516001600160a01b038084169216907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806137176131ac565b90506000816001600160a01b0316630ea474c7306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561376857600080fd5b505afa15801561377c573d6000803e3d6000fd5b505050506040513d602081101561379257600080fd5b5051905061379f8161405d565b9250816001600160a01b031663b86e321c306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156137f057600080fd5b505af1158015613804573d6000803e3d6000fd5b5050505082604081905550505090565b60008061381f6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561387057600080fd5b505afa158015613884573d6000803e3d6000fd5b505050506040513d602081101561389a57600080fd5b505160525460395491925082916138b09161322c565b11156138bf57600092506138f3565b6138e06138d960525460395461322c90919063ffffffff16565b82906133d3565b92506138f36138ed614235565b84613e25565b6060826001600160a01b0316635840ee44306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561397f57600080fd5b8101908080516040519392919084600160201b82111561399e57600080fd5b9083019060208201858111156139b357600080fd5b82518660208202830111600160201b821117156139cf57600080fd5b82525081516020918201928201910280838360005b838110156139fc5781810151838201526020016139e4565b50505050905001604052505050905060005b8151811015613b22576042846001600160a01b031663eae0171830858581518110613a3557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d6020811015613ab457600080fd5b5051815460018101835560009283526020909220909101558151604390839083908110613add57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501613a0e565b5060005b8651811015613c1d576000878281518110613b3d57fe5b602002602001015190506000613b538483614284565b9050600019811415613bdf57604380546001810182556000919091527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027930180546001600160a01b0319166001600160a01b0384161790558751604290899085908110613bbb57fe5b60209081029190910181015182546001810184556000938452919092200155613c13565b878381518110613beb57fe5b602002602001015160428281548110613c0057fe5b6000918252602090912001805490910190555b5050600101613b26565b50826001600160a01b031663c001472e85604360426040518463ffffffff1660e01b81526004018084815260200180602001806020018381038352858181548152602001915080548015613c9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613c7c575b50508381038252848181548152602001915080548015613cd957602002820191906000526020600020905b815481526020019060010190808311613cc5575b505095505050505050600060405180830381600087803b158015613cfc57600080fd5b505af1158015613d10573d6000803e3d6000fd5b5050505060436000613d22919061432f565b613d2e6042600061432f565b50505092915050565b600080613d426131ac565b9050806001600160a01b031663afd369fd306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d9157600080fd5b505afa158015613da5573d6000803e3d6000fd5b505050506040513d6020811015613dbb57600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519193506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b158015613e0957600080fd5b505af1158015613e1d573d6000803e3d6000fd5b505050505090565b6045546040805163095ea7b360e01b81526001600160a01b038581166004830152602482018590529151919092169163095ea7b39160448083019260209291908290030181600087803b158015613e7b57600080fd5b505af1158015613e8f573d6000803e3d6000fd5b505050506040513d602081101561123057600080fd5b613eb7826001600160a01b03166142d8565b613f08576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613f465780518252601f199092019160209182019101613f27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b509150915081614004576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112305780806020019051602081101561402057600080fd5b50516112305760405162461bcd60e51b815260040180806020018281038252602a8152602001806144af602a913960400191505060405180910390fd5b60008061408361407e6103e861159f603d548761345f90919063ffffffff16565b6127a7565b905060006140a561407e6103e861159f603e548861345f90919063ffffffff16565b9050811561413357604654603c54604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f199160448083019260209291908290030181600087803b15801561410657600080fd5b505af115801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b50505b801561421f57604654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d60208110156141b757600080fd5b505060485460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561420657600080fd5b505af115801561421a573d6000803e3d6000fd5b505050505b61422d816127ce86856133d3565b949350505050565b604754604080516227050b60e31b815261544360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000805b83518110156142cd57826001600160a01b03168482815181106142a757fe5b60200260200101516001600160a01b031614156142c5579050613241565b600101614288565b506000199392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061422d5750141592915050565b604080516060810182526000808252602082018190529181019190915290565b50805460008255906000526020600020908101906127a491905b8082111561435d5760008155600101614349565b509056fe6f6e6c792070656e64696e67206f776e65722063616e2063616c6c20746869732066756e6374696f6e43616e6e6f742074616b65206d6f7265207468616e2031303025206f662077697468647261774d6179206f6e6c792063616c6c207468697320636f6e7472616374206f6e636520706572207472616e73616374696f6e2e53656e646572206d7573742062652074686520746f6b656e20636f6e74726163742e43616e6e6f742067697665207265666572726572206d6f7265207468616e20353025206f6620726577617264732e436f6e74726163742068617320616c7265616479206265656e20696e697469616c697a65642e5061757365206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e526577617264206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645769746864726177616c73206172652074656d706f726172696c79207061757365642e4e6f7420656e6f756768204e584d20617661696c61626c6520666f7220776974746864726177616c2e6d73672e73656e646572206973206e6f74206f776e657200000000000000000043616e6e6f7420676976652061646d696e206d6f7265207468616e20353025206f6620726577617264732ea26469706673582212208e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f64736f6c634300060c0033

Deployed Bytecode Sourcemap

22939:29955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52713:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23879;;;;;;;;;;;;;:::i;35632:132::-;;;;;;;;;;;;;:::i;34827:322::-;;;;;;;;;;;;;:::i;25062:35::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;25062:35:0;;;;;;;;;;;;;;26463:895;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26463:895:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24331:26;;;;;;;;;;;;;:::i;2516:216::-;;;;;;;;;;;;;:::i;36085:509::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36085:509:0;;:::i;49999:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49999:140:0;;:::i;47060:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47060:232:0;;;;;;;;;;;;;;;;;:::i;24908:17::-;;;;;;;;;;;;;:::i;23990:26::-;;;;;;;;;;;;;:::i;29071:1499::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29071:1499:0;;;;;;;;;:::i;52795:27::-;;;;;;;;;;;;;:::i;24932:19::-;;;;;;;;;;;;;:::i;48984:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48984:140:0;;:::i;3246:118::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3246:118:0;-1:-1:-1;;;;;3246:118:0;;:::i;48408:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48408:335:0;-1:-1:-1;;;;;48408:335:0;;:::i;25135:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25135:45:0;-1:-1:-1;;;;;25135:45:0;;:::i;23633:28::-;;;;;;;;;;;;;:::i;24883:18::-;;;;;;;;;;;;;:::i;24988:27::-;;;;;;;;;;;;;:::i;1466:91::-;;;;;;;;;;;;;:::i;48049:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48049:237:0;;;;;;;:::i;47478:326::-;;;;;;;;;;;;;;;;-1:-1:-1;47478:326:0;;:::i;52831:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52831:57:0;-1:-1:-1;;;;;52831:57:0;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;52831:57:0;;;;;;;;;;;;;;;;;;;;;;39864:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;-1:-1:-1;39864:190:0;;-1:-1:-1;39864:190:0;-1:-1:-1;39864:190:0;:::i;27631:1207::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27631:1207:0;;;-1:-1:-1;;;;;27631:1207:0;;;;;;;;;;;;:::i;3372:231::-;;;;;;;;;;;;;:::i;52510:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52510:44:0;-1:-1:-1;;;;;52510:44:0;;:::i;24529:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24529:26:0;;:::i;1319:79::-;;;;;;;;;;;;;:::i;31714:407::-;;;;;;;;;;;;;:::i;2097:124::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37023:481;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37023:481:0;;;;;;;;;;;;;;;;;:::i;50796:238::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50796:238:0;;:::i;49307:226::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49307:226:0;;:::i;51250:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51250:232:0;;:::i;49656:221::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49656:221:0;;:::i;39354:140::-;;;;;;;;;;;;;:::i;32957:775::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32957:775:0;;:::i;24128:27::-;;;;;;;;;;;;;:::i;50367:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50367:223:0;;:::i;24405:25::-;;;;;;;;;;;;;:::i;35294:206::-;;;;;;;;;;;;;:::i;30631:971::-;;;;;;;;;;;;;:::i;32445:276::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32445:276:0;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;-1:-1:-1;32445:276:0;;-1:-1:-1;32445:276:0;-1:-1:-1;32445:276:0;:::i;51649:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51649:138:0;-1:-1:-1;;;;;51649:138:0;;:::i;39599:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;-1:-1:-1;39599:156:0;;-1:-1:-1;39599:156:0;-1:-1:-1;39599:156:0;:::i;52652:26::-;;;;;;;;;;;;;:::i;23775:32::-;;;;;;;;;;;;;:::i;33969:674::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33969:674:0;;:::i;24219:27::-;;;;;;;;;;;;;:::i;2398:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2398:110:0;-1:-1:-1;;;;;2398:110:0;;:::i;23229:29::-;;;;;;;;;;;;;:::i;51866:34::-;;;;;;;;;;;;;:::i;39187:94::-;;;;;;;;;;;;;:::i;52713:28::-;;;;:::o;23879:::-;;;;:::o;35632:132::-;35699:14;35740:16;:14;:16::i;:::-;35731:25;;35632:132;:::o;34827:322::-;34882:16;34916:19;34954:10;:8;:10::i;:::-;34995:3;;:30;;;-1:-1:-1;;;34995:30:0;;35018:4;34995:30;;;;;;34916:50;;-1:-1:-1;34977:15:0;;-1:-1:-1;;;;;34995:3:0;;;;:13;;:30;;;;;;;;;;;;;;;:3;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34995:30:0;35059:35;;;-1:-1:-1;;;35059:35:0;;35087:4;35059:35;;;;;;34995:30;;-1:-1:-1;35036:20:0;;-1:-1:-1;;;;;35059:18:0;;;;;:35;;;;;34995:30;;35059:35;;;;;;;:18;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35059:35:0;;-1:-1:-1;35116:25:0;:7;35059:35;35116:11;:25::i;:::-;35105:36;;34827:322;;;;:::o;25062:35::-;;;-1:-1:-1;;;;;25062:35:0;;:::o;26463:895::-;26670:5;;-1:-1:-1;;;;;26670:5:0;26662:28;26654:79;;;;-1:-1:-1;;;26654:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26746:27;:25;:27::i;:::-;26784:4;:20;;-1:-1:-1;;;;;26784:20:0;;;-1:-1:-1;;;;;;26784:20:0;;;;;;26815:3;:18;;;;;;;;;;;26844:5;:22;;;;;;;;;;;;;26877:9;:34;;;;;;;;;;;26922:13;:46;;;;;;;;;;;;;26784:4;27013:12;:16;;;27055:2;27040:12;:17;27084:8;27068:13;:24;27119:7;27103:13;:23;27137:11;:24;;;;;27151:10;27137:24;;;;27225:6;27208:14;:23;27306:44;;;-1:-1:-1;;;27306:44:0;;-1:-1:-1;27306:44:0;;;;;;-1:-1:-1;;27306:44:0;;;;;:5;;;;;:13;;:44;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;26463:895:0:o;24331:26::-;;;;:::o;2516:216::-;2584:13;;-1:-1:-1;;;;;2584:13:0;2570:10;:27;2562:81;;;;-1:-1:-1;;;2562:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2673:13;;2654:33;;-1:-1:-1;;;;;2673:13:0;2654:18;:33::i;:::-;2698:13;:26;;-1:-1:-1;;;;;;2698:26:0;;;2516:216::o;36085:509::-;36161:22;36199:16;:14;:16::i;:::-;36161:56;;36244:14;36262:10;-1:-1:-1;;;;;36262:31:0;;36294:8;36262:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36262:41:0;;;;;;36335:36;;-1:-1:-1;;;36335:36:0;;;;;;;;;;36262:41;;-1:-1:-1;36314:18:0;;-1:-1:-1;;;;;36335:26:0;;;;;:36;;;;;36262:41;36335:36;;;;;;:26;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36335:36:0;;-1:-1:-1;36476:2:0;36466:12;;:57;;;;-1:-1:-1;36517:6:0;36482:31;:15;36502:10;36482:19;:31::i;:::-;:41;;36466:57;36462:125;;;36560:15;36540:17;:35;36462:125;36085:509;;;;:::o;49999:140::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50101:13:::1;:30:::0;49999:140::o;47060:232::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;47171:3:::1;::::0;:47:::1;::::0;;-1:-1:-1;;;47171:47:0;;-1:-1:-1;;;;;47171:47:0;;::::1;;::::0;::::1;::::0;47203:4:::1;47171:47:::0;;;;;;;;;;;;:3;;;::::1;::::0;:16:::1;::::0;:47;;;;;::::1;::::0;;;;;;;;:3:::1;::::0;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47229:17:0::1;::::0;-1:-1:-1;47238:7:0;47229:8:::1;:17::i;:::-;47257:4;::::0;;:27:::1;::::0;;-1:-1:-1;;;47257:27:0;;-1:-1:-1;;;;;47257:27:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:4;;;::::1;::::0;:13:::1;::::0;:27;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;47060:232:0:o;24908:17::-;;;-1:-1:-1;;;;;24908:17:0;;:::o;23990:26::-;;;-1:-1:-1;;;;;23990:26:0;;:::o;29071:1499::-;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;26143:15;26121:37;;;;29220:13:::1;::::0;29199:17:::1;::::0;29220:13;;29179:38:::1;::::0;:19:::1;:38::i;:::-;:54;29171:102;;;;-1:-1:-1::0;;;29171:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29348:15;29366:19;29375:9;29366:8;:19::i;:::-;29433:3;::::0;:28:::1;::::0;;-1:-1:-1;;;29433:28:0;;29455:4:::1;29433:28;::::0;::::1;::::0;;;29348:37;;-1:-1:-1;;;;;;29433:3:0;;::::1;::::0;:13:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;:3;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29433:28:0;29404:12:::1;::::0;:25:::1;::::0;29421:7;29404:16:::1;:25::i;:::-;:57;;29396:111;;;;-1:-1:-1::0;;;29396:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29524:7;29520:1043;;;29548:11;29562:34;29591:4;29562:24;29574:11;;29562:7;:11;;:24;;;;:::i;:::-;:28:::0;::::1;:34::i;:::-;29548:48:::0;-1:-1:-1;29611:20:0::1;29634:16;:7:::0;29548:48;29634:11:::1;:16::i;:::-;29752:5;::::0;:33:::1;::::0;;-1:-1:-1;;;29752:33:0;;29763:10:::1;29752:33;::::0;::::1;::::0;;;;;;;;;29611:39;;-1:-1:-1;;;;;;29752:5:0;;::::1;::::0;:10:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29800:22:0::1;::::0;-1:-1:-1;29809:12:0;29800:8:::1;:22::i;:::-;29837:4;::::0;:43:::1;::::0;-1:-1:-1;;;;;29837:4:0::1;29855:10;29867:12:::0;29837:17:::1;:43::i;:::-;29902:59;::::0;;;;;::::1;::::0;::::1;::::0;;;29945:15:::1;29902:59:::0;;;;;;29913:10:::1;::::0;29902:59:::1;::::0;;;;;;;;::::1;29520:1043;;;;;30009:12;::::0;:25:::1;::::0;30026:7;30009:16:::1;:25::i;:::-;29994:12;:40:::0;30049:5:::1;::::0;:60:::1;::::0;-1:-1:-1;;;;;30049:5:0::1;30072:10;30092:4;30099:9:::0;30049:22:::1;:60::i;:::-;30124:39;;:::i;:::-;30166:11;:23;30178:10;-1:-1:-1::0;;;;;30166:23:0::1;-1:-1:-1::0;;;;;30166:23:0::1;;;;;;;;;;;;30124:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;;;::::0;::::1;;;30230:197;;;;;;;;30273:15;30230:197;;;;;;30341:7;30308:14;:22;;;:41;-1:-1:-1::0;;;;;30230:197:0::1;;;;;30402:9;30368:14;:23;;;:44;-1:-1:-1::0;;;;;30230:197:0::1;;;::::0;30204:11:::1;:23;30216:10;-1:-1:-1::0;;;;;30204:23:0::1;-1:-1:-1::0;;;;;30204:23:0::1;;;;;;;;;;;;:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;;;;;30467:10;-1:-1:-1::0;;;;;30449:102:0::1;;30479:9;30490:7;30499:15;30516:34;30536:13;;30516:15;:19;;:34;;;;:::i;:::-;30449:102;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;29520:1043;;26169:1;29071:1499:::0;;:::o;52795:27::-;;;;:::o;24932:19::-;;;-1:-1:-1;;;;;24932:19:0;;:::o;48984:140::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;49086:13:::1;:30:::0;48984:140::o;3246:118::-;1944:12;;-1:-1:-1;;;;;1944:12:0;1930:10;:26;1922:62;;;;;-1:-1:-1;;;1922:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1922:62:0;;;;;;;;;;;;;;;3331:14:::1;:25:::0;;-1:-1:-1;;;;;;3331:25:0::1;-1:-1:-1::0;;;;;3331:25:0;;;::::1;::::0;;;::::1;::::0;;3246:118::o;48408:335::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;48518:3:::1;::::0;-1:-1:-1;;;;;48501:21:0;;::::1;48518:3:::0;::::1;48501:21;::::0;::::1;::::0;:47:::1;;-1:-1:-1::0;48543:4:0::1;::::0;-1:-1:-1;;;;;48526:22:0;;::::1;48543:4:::0;::::1;48526:22;;48501:47;:74;;;;-1:-1:-1::0;48569:5:0::1;::::0;-1:-1:-1;;;;;48552:23:0;;::::1;48569:5:::0;::::1;48552:23;;48501:74;48493:117;;;::::0;;-1:-1:-1;;;48493:117:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48621:15;48646:5;-1:-1:-1::0;;;;;48639:23:0::1;;48671:4;48639:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;48639:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48639:38:0;;-1:-1:-1;48688:47:0::1;-1:-1:-1::0;;;;;48688:26:0;::::1;48715:10;48639:38:::0;48688:26:::1;:47::i;:::-;1738:1;48408:335:::0;:::o;25135:45::-;;;;;;;;;;;;-1:-1:-1;;;;;25135:45:0;;:::o;23633:28::-;;;;:::o;24883:18::-;;;-1:-1:-1;;;;;24883:18:0;;:::o;24988:27::-;;;-1:-1:-1;;;;;24988:27:0;;:::o;1466:91::-;1537:12;;-1:-1:-1;;;;;1537:12:0;1466:91;;:::o;48049:237::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;48178:9:::1;::::0;:32:::1;::::0;;-1:-1:-1;;;48178:32:0;;-1:-1:-1;;;48178:32:0::1;::::0;::::1;::::0;;;48164:11:::1;::::0;-1:-1:-1;;;;;48178:9:0::1;::::0;:26:::1;::::0;:32;;;;;::::1;::::0;;;;;;;;:9;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48178:32:0;48221:57:::1;::::0;;-1:-1:-1;;;48221:57:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;48178:32;;-1:-1:-1;;;;;;48221:27:0;::::1;::::0;::::1;::::0;:57;;;;;-1:-1:-1;;48221:57:0;;;;;;;;-1:-1:-1;48221:27:0;:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;47478:326:::0;47589:42;47575:10;:56;47567:100;;;;;-1:-1:-1;;;47567:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47703:9;;:32;;;-1:-1:-1;;;47703:32:0;;-1:-1:-1;;;47703:32:0;;;;;;47678:13;;-1:-1:-1;;;;;47703:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47703:32:0;47747:49;;;-1:-1:-1;;;47747:49:0;;;;;;;;;;47703:32;;-1:-1:-1;;;;;;47747:11:0;;;;;47765:21;;47747:49;;;;;-1:-1:-1;;47747:49:0;;;;;;;47765:21;47747:11;:49;;;;;;;;;;52831:57;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52831:57:0;;;;;;-1:-1:-1;;;52831:57:0;;;;:::o;39864:190::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39997:49:::1;40009:7;40018:10;;39997:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39997:49:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;40030:15:0;;-1:-1:-1;40030:15:0;;;;39997:49;::::1;::::0;40030:15;;39997:49;40030:15;39997:49;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39997:11:0::1;::::0;-1:-1:-1;;;39997:49:0:i:1;27631:1207::-:0;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;;;;26143:15;26121:37;;27762:10:::1;27752:21:::0;;:9:::1;:21:::0;;;;;;-1:-1:-1;;;;;27752:21:0::1;27747:535;;-1:-1:-1::0;;;;;27829:23:0;::::1;:49;;27867:11;::::0;-1:-1:-1;;;;;27867:11:0::1;27829:49;;;27855:9;27829:49;27815:10;27805:21;::::0;;;:9:::1;:21;::::0;;;;:73;;-1:-1:-1;;;;;;27805:73:0::1;-1:-1:-1::0;;;;;27805:73:0;;::::1;;::::0;;:21;27912:23;::::1;:49;;27950:11;::::0;-1:-1:-1;;;;;27950:11:0::1;27912:49;;;27938:9;27912:49;27986:10;27976:21;::::0;;;:9:::1;:21;::::0;;;;;;;:32;;-1:-1:-1;;;;;;27976:32:0::1;-1:-1:-1::0;;;;;27976:32:0;;::::1;::::0;;;::::1;::::0;;;28161:5:::1;::::0;:27;;-1:-1:-1;;;28161:27:0;;::::1;::::0;::::1;::::0;;;;;;27976:32;;-1:-1:-1;27976:21:0;;28161:5;::::1;::::0;:15:::1;::::0;:27;;;;;27976:21;28161:27;;;;;:5;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28161:27:0;;-1:-1:-1;28207:11:0;;28203:67:::1;;28220:13;::::0;:50:::1;::::0;;-1:-1:-1;;;28220:50:0;;-1:-1:-1;;;;;28220:50:0;;::::1;;::::0;::::1;::::0;28250:10:::1;28220:50:::0;;;;;;;;;;;;:13;;;::::1;::::0;:19:::1;::::0;:50;;;;;:13:::1;::::0;:50;;;;;;;:13;;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28203:67;27747:535;;;28356:16;28375:20;28386:8;28375:10;:20::i;:::-;28356:39;;28412:6;28408:223;;;28435:3;::::0;:57:::1;::::0;-1:-1:-1;;;;;28435:3:0::1;28456:10;28476:4;28483:8:::0;28435:20:::1;:57::i;:::-;28408:223;;;28525:4;::::0;:58:::1;::::0;-1:-1:-1;;;;;28525:4:0::1;28547:10;28567:4;28574:8:::0;28525:21:::1;:58::i;:::-;28598:21;28610:8;28598:11;:21::i;:::-;28724:5;::::0;:32:::1;::::0;;-1:-1:-1;;;28724:32:0;;28735:10:::1;28724:32;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;28724:5:0;;::::1;::::0;:10:::1;::::0;:32;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;28774:56:0::1;::::0;;;;;28724:32:::1;28774:56:::0;::::1;::::0;;;28814:15:::1;28774:56:::0;;;;;;28782:10:::1;::::0;28774:56:::1;::::0;;;;;;;;::::1;26169:1;27631:1207:::0;;;:::o;3372:231::-;3446:14;;-1:-1:-1;;;;;3446:14:0;3432:10;:28;3424:82;;;;-1:-1:-1;;;3424:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3542:14;;3517:40;;-1:-1:-1;;;;;3542:14:0;3517:24;:40::i;:::-;3568:14;:27;;-1:-1:-1;;;;;;3568:27:0;;;3372:231::o;52510:44::-;;;;;;;;;;;;;:::o;24529:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24529:26:0;;-1:-1:-1;24529:26:0;:::o;1319:79::-;1357:7;1384:6;-1:-1:-1;;;;;1384:6:0;1319:79;:::o;31714:407::-;25793:10;25807:9;25793:23;25785:58;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;;;;31789:15:::1;31807:5;:3;:5::i;:::-;31789:23;;31823:15;31841:16;:14;:16::i;:::-;31823:34:::0;-1:-1:-1;31874:11:0;;31870:244:::1;;31924:15;31902:19;:37:::0;;;31959:44:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;31870:244;;;32024:19;::::0;32021:93:::1;;32087:15;32065:19;:37:::0;25854:1:::1;;31714:407::o:0;2097:124::-;2137:4;2175:6;;-1:-1:-1;;;;;2175:6:0;2161:10;:20;;:50;;-1:-1:-1;;2199:12:0;;-1:-1:-1;;;;;2199:12:0;2185:10;:26;;2097:124::o;37023:481::-;37153:5;;-1:-1:-1;;;;;37153:5:0;37131:10;:28;37123:75;;;;-1:-1:-1;;;37123:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37311:16:0;;;37339:1;37311:16;;;:9;:16;;;;;;;:30;37306:94;;37344:13;;-1:-1:-1;;;;;37367:16:0;;;37344:13;37367:16;;;:9;:16;;;;;;;37344:56;;-1:-1:-1;;;37344:56:0;;37367:16;;;37344:56;;;;;;;;;;;;;;;;;;:13;;;;;:22;;:56;;;;;;;;;;:13;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37306:94;-1:-1:-1;;;;;37416:14:0;;;37442:1;37416:14;;;:9;:14;;;;;;;:28;37411:85;;37447:13;;-1:-1:-1;;;;;37467:14:0;;;37447:13;37467:14;;;:9;:14;;;;;;;37447:49;;-1:-1:-1;;;37447:49:0;;37467:14;;;37447:49;;;;;;;;;;;;;;;;;;:13;;;;;:19;;:49;;;;;;;;;;:13;;:49;;;;;;;;;;50796:238;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50927:7:::1;50908:15;:26;;50900:83;;;;-1:-1:-1::0;;;50900:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50994:14;:32:::0;50796:238::o;49307:226::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;49432:3:::1;49415:13;:20;;49407:79;;;;-1:-1:-1::0;;;49407:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49497:12;:28:::0;49307:226::o;51250:232::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;51378:7:::1;51360:14;:25;;51352:81;;;;-1:-1:-1::0;;;51352:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:13;:30:::0;51250:232::o;49656:221::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;23083:4:::1;49762:12;:27;;49754:78;;;;-1:-1:-1::0;;;49754:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49843:11;:26:::0;49656:221::o;39354:140::-;39426:4;;:29;;;-1:-1:-1;;;39426:29:0;;39449:4;39426:29;;;;;;39408:15;;-1:-1:-1;;;;;39426:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39426:29:0;;-1:-1:-1;39466:20:0;39426:29;39466:11;:20::i;:::-;39354:140;:::o;32957:775::-;33035:16;33119:14;33136:16;:14;:16::i;:::-;33119:33;;33317:14;33334:33;33356:10;;33334:17;33344:6;33334:5;:3;:5::i;:::-;:9;;:17::i;:::-;:21;;:33::i;:::-;33317:50;;33378:15;33396:5;;;;;;;;;-1:-1:-1;;;;;33396:5:0;-1:-1:-1;;;;;33396:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33396:19:0;;-1:-1:-1;33521:11:0;33517:208;;33560:8;33549:19;;33517:208;;;33601:17;33621:33;33647:6;33623:17;:7;33635:4;33623:11;:17::i;33621:33::-;33601:53;-1:-1:-1;33680:33:0;33708:4;33680:23;:8;33601:53;33680:12;:23::i;:33::-;33669:44;;33517:208;;32957:775;;;;;;:::o;24128:27::-;;;;:::o;50367:223::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50492:3:::1;50475:13;:20;;50467:76;;;;-1:-1:-1::0;;;50467:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50554:12;:28:::0;50367:223::o;24405:25::-;;;;:::o;35294:206::-;35355:14;35387:19;35425:10;:8;:10::i;:::-;35387:50;;35457:4;-1:-1:-1;;;;;35457:18:0;;35485:4;35457:35;;;;;;;;;;;;;-1:-1:-1;;;;;35457:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35457:35:0;;35294:206;-1:-1:-1;;35294:206:0:o;30631:971::-;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;26143:15;26121:37;;30708:35:::1;;:::i;:::-;-1:-1:-1::0;30758:10:0::1;30746:23;::::0;;;:11:::1;:23;::::0;;;;;;;;30708:61;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;30708:61:0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;30708:61:0;;::::1;::::0;;::::1;::::0;;;;;;31009:13:::1;::::0;30988:17:::1;::::0;30708:61;;;30968:38:::1;::::0;:15:::1;::::0;:19:::1;:38::i;:::-;:54;30960:102;;;;-1:-1:-1::0;;;30960:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31115:15;31081:30;31097:13;;31081:11;:15;;:30;;;;:::i;:::-;:49;;31073:83;;;::::0;;-1:-1:-1;;;31073:83:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31073:83:0;;;;;;;;;;;;;::::1;;31185:1;31175:7;:11;31167:53;;;::::0;;-1:-1:-1;;;31167:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31314:5;::::0;:35:::1;::::0;;-1:-1:-1;;;31314:35:0;;31333:4:::1;31314:35;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;31314:5:0;;::::1;::::0;:10:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31360:17:0::1;::::0;-1:-1:-1;31369:7:0;31360:8:::1;:17::i;:::-;31388:4;::::0;:38:::1;::::0;-1:-1:-1;;;;;31388:4:0::1;31406:10;31418:7:::0;31388:17:::1;:38::i;:::-;31456:10;31444:23;::::0;;;:11:::1;:23;::::0;;;;31437:30;31493:12:::1;::::0;:25:::1;::::0;31510:7;31493:16:::1;:25::i;:::-;31478:12;:40:::0;31536:58:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;31578:15:::1;31536:58:::0;;;;;;31547:10:::1;::::0;31536:58:::1;::::0;;;;;;;;::::1;26169:1;;;;30631:971::o:0;32445:276::-;25793:10;25807:9;25793:23;25785:58;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;;;;32654:13:::1;-1:-1:-1::0;;;;;32640:41:0::1;;32682:10;;32694:9;;32705:7;;32640:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;32640:73:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;32640:73:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;32640:73:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;32640:73:0;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;32640:73:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;32640:73:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;32640:73:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;32640:73:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;32445:276:::0;;;;;;;:::o;51649:138::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;51750:11:::1;:29:::0;;-1:-1:-1;;;;;;51750:29:0::1;-1:-1:-1::0;;;;;51750:29:0;;;::::1;::::0;;;::::1;::::0;;51649:138::o;39599:156::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39711:36:::1;39721:10;;39711:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39711:36:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;39733:13:0;;-1:-1:-1;39733:13:0;;;;39711:36;::::1;::::0;39733:13;;39711:36;39733:13;39711:36;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39711:9:0::1;::::0;-1:-1:-1;;;39711:36:0:i:1;52652:26::-:0;;;;:::o;23775:32::-;;;;:::o;33969:674::-;34046:15;34129:14;34146:16;:14;:16::i;:::-;34129:33;;34327:14;34344:33;34366:10;;34344:17;34354:6;34344:5;:3;:5::i;:33::-;34327:50;;34388:15;34406:5;;;;;;;;;-1:-1:-1;;;;;34406:5:0;-1:-1:-1;;;;;34406:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34406:19:0;;-1:-1:-1;34527:17:0;34547:33;34406:19;34549:16;:6;34560:4;34549:10;:16::i;24219:27::-;;;;:::o;2398:110::-;1818:6;;-1:-1:-1;;;;;1818:6:0;1804:10;:20;1796:56;;;;;-1:-1:-1;;;1796:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1796:56:0;;;;;;;;;;;;;;;2476:13:::1;:24:::0;;-1:-1:-1;;;;;;2476:24:0::1;-1:-1:-1::0;;;;;2476:24:0;;;::::1;::::0;;;::::1;::::0;;2398:110::o;23229:29::-;;;;:::o;51866:34::-;;;;:::o;39187:94::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39259:14:::1;:12;:14::i;44227:719::-:0;44346:14;;44413:19;;44295:14;;44346;44295;;44393:40;;:15;;:19;:40::i;:::-;44371:62;-1:-1:-1;44447:16:0;44444:55;;44486:1;44479:8;;;;;;44444:55;44628:8;44613:11;:23;44609:330;;44662:10;;44653:19;;44609:330;;;44809:15;44827:39;44854:11;44829:18;:8;44842:4;44829:12;:18::i;44827:39::-;44809:57;;44890:37;44919:7;44892:20;44907:4;44892:10;;:14;;:20;;;;:::i;44609:330::-;44227:719;;;:::o;45861:139::-;45960:9;;:32;;;-1:-1:-1;;;45960:32:0;;-1:-1:-1;;;45960:32:0;;;;;;45923:12;;-1:-1:-1;;;;;45960:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45960:32:0;;45861:139;-1:-1:-1;45861:139:0:o;8703:150::-;8761:7;8793:5;;;8817:6;;;;8809:15;;;;;;8844:1;-1:-1:-1;8703:150:0;;;;;:::o;948:301::-;1023:1;1005:6;-1:-1:-1;;;;;1005:6:0;:20;997:52;;;;;-1:-1:-1;;;997:52:0;;;;;;;;;;;;-1:-1:-1;;;997:52:0;;;;;;;;;;;;;;;1060:6;:19;;1069:10;-1:-1:-1;;;;;;1060:19:0;;;;;;;1090:12;:25;;;;;;;;;;1131:44;;1069:10;;1060:6;1131:44;;1060:6;;1131:44;1191:50;;1230:10;;1226:1;;1191:50;;1226:1;;1191:50;948:301::o;2882:187::-;-1:-1:-1;;;;;2956:22:0;;2948:31;;;;;;3016:6;;;2995:38;;-1:-1:-1;;;;;2995:38:0;;;;3016:6;;;2995:38;;;3044:6;:17;;-1:-1:-1;;;;;;3044:17:0;-1:-1:-1;;;;;3044:17:0;;;;;;;;;;2882:187::o;46498:157::-;46615:9;;:32;;;-1:-1:-1;;;46615:32:0;;-1:-1:-1;;;46615:32:0;;;;;;46566:18;;-1:-1:-1;;;;;46615:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;8465:150;8523:7;8556:1;8551;:6;;8543:15;;;;;;-1:-1:-1;8581:5:0;;;8465:150::o;45037:155::-;45124:4;;45104:35;;-1:-1:-1;;;;;45124:4:0;45131:7;45104:11;:35::i;:::-;45164:4;;45150:34;;;-1:-1:-1;;;45150:34:0;;;;;;;;;;-1:-1:-1;;;;;45164:4:0;;;;45150:25;;:34;;;;;45164:4;;45150:34;;;;;;;;45164:4;;45150:34;;;;;;;;;;;;;;;;;;;;;;;;;;7456:433;7514:7;7758:6;7754:47;;-1:-1:-1;7788:1:0;7781:8;;7754:47;7825:5;;;7829:1;7825;:5;:1;7849:5;;;;;:10;7841:19;;;;;8024:303;8082:7;8181:1;8177;:5;8169:14;;;;;;8194:9;8210:1;8206;:5;;;;;;;8024:303;-1:-1:-1;;;;8024:303:0:o;12714:176::-;12823:58;;;-1:-1:-1;;;;;12823:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12823:58:0;-1:-1:-1;;;12823:58:0;;;12797:85;;12816:5;;12797:18;:85::i;12898:204::-;13025:68;;;-1:-1:-1;;;;;13025:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13025:68:0;-1:-1:-1;;;13025:68:0;;;12999:95;;13018:5;;12999:18;:95::i;42780:245::-;42906:19;42944:10;:8;:10::i;:::-;42906:50;;42967:4;-1:-1:-1;;;;;42967:19:0;;42987:10;42999:8;43009:7;42967:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42780:245;;;;:::o;45366:114::-;45450:4;;45436:36;;;-1:-1:-1;;;45436:36:0;;;;;;;;;;-1:-1:-1;;;;;45450:4:0;;;;45436:27;;:36;;;;;45450:4;;45436:36;;;;;;;;45450:4;;45436:36;;;;;;;;;;3753:211;-1:-1:-1;;;;;3833:22:0;;3825:31;;;;;;3899:12;;3872:50;;-1:-1:-1;;;;;3872:50:0;;;;3899:12;;3872:50;;3899:12;;3872:50;3933:12;:23;;-1:-1:-1;;;;;;3933:23:0;-1:-1:-1;;;;;3933:23:0;;;;;;;;;;3753:211::o;37705:447::-;37763:19;37800;37838:10;:8;:10::i;:::-;37800:50;;37954:18;37975:4;-1:-1:-1;;;;;37975:17:0;;38002:4;37975:34;;;;;;;;;;;;;-1:-1:-1;;;;;37975:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37975:34:0;;-1:-1:-1;38034:26:0;37975:34;38034:14;:26::i;:::-;38020:40;;38073:4;-1:-1:-1;;;;;38073:19:0;;38102:4;38073:36;;;;;;;;;;;;;-1:-1:-1;;;;;38073:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38133:11;38120:10;:24;;;;37705:447;;;:::o;40887:1684::-;40999:15;41032:19;41070:10;:8;:10::i;:::-;41111:3;;:30;;;-1:-1:-1;;;41111:30:0;;41134:4;41111:30;;;;;;41032:50;;-1:-1:-1;41093:15:0;;-1:-1:-1;;;;;41111:3:0;;;;:13;;:30;;;;;;;;;;;;;;;:3;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41111:30:0;41279:12;;41261:13;;41111:30;;-1:-1:-1;41111:30:0;;41261:31;;:17;:31::i;:::-;:41;41257:230;;;41329:1;41319:11;;41257:230;;;41373:44;41385:31;41403:12;;41385:13;;:17;;:31;;;;:::i;:::-;41373:7;;:11;:44::i;:::-;41363:54;;41432:43;41444:21;:19;:21::i;:::-;41467:7;41432:11;:43::i;:::-;41548:33;41584:4;-1:-1:-1;;;;;41584:25:0;;41618:4;41584:40;;;;;;;;;;;;;-1:-1:-1;;;;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;;-1:-1:-1;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41548:76;;41706:9;41701:211;41725:16;:23;41721:1;:27;41701:211;;;41770:7;41783:4;-1:-1:-1;;;;;41783:24:0;;41816:4;41823:16;41840:1;41823:19;;;;;;;;;;;;;;41783:60;;;;;;;;;;;;;-1:-1:-1;;;;;41783:60:0;;;;;;-1:-1:-1;;;;;41783:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41783:60:0;41770:74;;;;;;;-1:-1:-1;41770:74:0;;;41783:60;41770:74;;;;;;;41880:19;;41859:15;;41880:16;;41897:1;;41880:19;;;;;;;;;;;;;;;;;41859:41;;;;;;;;-1:-1:-1;41859:41:0;;;;;;;;;;;;-1:-1:-1;;;;;;41859:41:0;-1:-1:-1;;;;;41859:41:0;;;;;;;;;;41750:3;41701:211;;;;41967:9;41963:425;41986:10;:17;41982:1;:21;41963:425;;;42025:16;42044:10;42055:1;42044:13;;;;;;;;;;;;;;42025:32;;42072:16;42091:45;42109:16;42127:8;42091:17;:45::i;:::-;42072:64;;-1:-1:-1;;42154:8:0;:29;42151:226;;;42204:15;:30;;;;;;;-1:-1:-1;42204:30:0;;;;;;;;-1:-1:-1;;;;;;42204:30:0;-1:-1:-1;;;;;42204:30:0;;;;;42266:16;;42253:7;;42266:16;;42280:1;;42266:16;;;;;;;;;;;;;;;;;42253:30;;;;;;;-1:-1:-1;42253:30:0;;;;;;;;;42151:226;;;42345:13;42359:1;42345:16;;;;;;;;;;;;;;42324:7;42332:8;42324:17;;;;;;;;;;;;;;;;;:37;;;;;;;42151:226;-1:-1:-1;;42005:3:0;;41963:425;;;;42450:4;-1:-1:-1;;;;;42450:20:0;;42471:7;42480:15;42497:7;42450:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42450:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42523:15;;42516:22;;;;:::i;:::-;42549:14;42556:7;;42549:14;:::i;:::-;40887:1684;;;;;;;:::o;40213:241::-;40269:14;40301:19;40339:10;:8;:10::i;:::-;40301:50;;40371:4;-1:-1:-1;;;;;40371:26:0;;40407:4;40371:43;;;;;;;;;;;;;-1:-1:-1;;;;;40371:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40371:43:0;40425:21;;;-1:-1:-1;;;40425:21:0;;;;;;;;;;40371:43;;-1:-1:-1;;;;;;40425:13:0;;;;;:21;;;;;-1:-1:-1;;40425:21:0;;;;;;;;-1:-1:-1;40425:13:0;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:241;;:::o;45592:118::-;45675:3;;:27;;;-1:-1:-1;;;45675:27:0;;-1:-1:-1;;;;;45675:27:0;;;;;;;;;;;;;;;:3;;;;;:11;;:27;;;;;;;;;;;;;;:3;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14708:1114;15312:27;15320:5;-1:-1:-1;;;;;15312:25:0;;:27::i;:::-;15304:71;;;;;-1:-1:-1;;;15304:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15449:12;15463:23;15498:5;-1:-1:-1;;;;;15490:19:0;15510:4;15490:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15490:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15448:67;;;;15534:7;15526:52;;;;;-1:-1:-1;;;15526:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15595:17;;:21;15591:224;;15737:10;15726:30;;;;;;;;;;;;;;;-1:-1:-1;15726:30:0;15718:85;;;;-1:-1:-1;;;15718:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38376:733;38446:18;38532:19;38554:55;38566:41;23083:4;38566:24;38577:12;;38566:6;:10;;:24;;;;:::i;:41::-;38554:10;:55::i;:::-;38532:77;;38620:19;38642:55;38654:41;23083:4;38654:24;38665:12;;38654:6;:10;;:24;;;;:::i;38642:55::-;38620:77;-1:-1:-1;38800:15:0;;38796:84;;38832:5;;38843:11;;38832:36;;;-1:-1:-1;;;38832:36:0;;-1:-1:-1;;;;;38843:11:0;;;38832:36;;;;;;;;;;;;:5;;;;;:10;;:36;;;;;;;;;;;;;;:5;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38796:84:0;38894:15;;38890:146;;38926:5;;:38;;;-1:-1:-1;;;38926:38:0;;38945:4;38926:38;;;;;;;;;;;;-1:-1:-1;;;;;38926:5:0;;;;:10;;:38;;;;;;;;;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38979:13:0;;:45;;;-1:-1:-1;;;38979:45:0;;;;;;;;;;-1:-1:-1;;;;;38979:13:0;;;;:32;;:45;;;;;:13;;:45;;;;;;;;:13;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38890:146;39061:40;39089:11;39061:23;:6;39072:11;39061:10;:23::i;:40::-;39048:53;38376:733;-1:-1:-1;;;;38376:733:0:o;46173:161::-;46294:9;;:32;;;-1:-1:-1;;;46294:32:0;;-1:-1:-1;;;46294:32:0;;;;;;46245:18;;-1:-1:-1;;;;;46294:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;46663:279;46748:13;;46774:126;46795:3;:10;46793:1;:12;46774:126;;;46840:4;-1:-1:-1;;;;;46830:14:0;:3;46834:1;46830:6;;;;;;;;;;;;;;-1:-1:-1;;;;;46830:14:0;;46827:62;;;46872:1;-1:-1:-1;46865:8:0;;46827:62;46807:3;;46774:126;;;-1:-1:-1;;;46917:17:0;46663:279;-1:-1:-1;;;46663:279:0:o;4624:810::-;4684:4;5343:20;;5186:66;5383:15;;;;;:42;;-1:-1:-1;5402:23:0;;;4624:810;-1:-1:-1;;4624:810:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://8e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f

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

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.