ETH Price: $3,884.69 (+0.04%)

Token

ERC-20: Staked Roya (stkRoya)
 

Overview

Max Total Supply

2,565,116.959837883435153633 stkRoya

Holders

89

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
g3nghis.eth
Balance
1,500 stkRoya

Value
$0.00
0xe116d5F4CcD817e93a4827B4B1166fB3fA61BEC5
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StakedRoya

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
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);

  /**
   * @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/IStakedRoya.sol


pragma solidity 0.6.12;

interface IStakedRoya {
  function stake(address to, uint256 amount) external;

  function redeem(address to, uint256 amount) external;

  function cooldown() external;

  function claimRewards(address to, uint256 amount) external;
}

// File: contracts/interfaces/ITransferHook.sol


pragma solidity 0.6.12;

interface ITransferHook {
    function onTransfer(address from, address to, uint256 amount) external;
}

// File: contracts/lib/Context.sol



pragma solidity 0.6.12;

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

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

// File: contracts/interfaces/IERC20Detailed.sol


pragma solidity 0.6.12;


/**
 * @dev Interface for ERC20 including metadata
 **/
interface IERC20Detailed is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// File: contracts/lib/SafeMath.sol


pragma solidity 0.6.12;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// File: contracts/lib/ERC20.sol


pragma solidity 0.6.12;





/**
 * @title ERC20
 * @notice Basic ERC20 implementation
 * @author Roya
 **/
contract ERC20 is Context, IERC20, IERC20Detailed {
  using SafeMath for uint256;

  mapping(address => uint256) private _balances;
  mapping(address => mapping(address => uint256)) private _allowances;
  uint256 private _totalSupply;
  string private _name;
  string private _symbol;
  uint8 private _decimals;

  constructor(
    string memory name,
    string memory symbol,
    uint8 decimals
  ) public {
    _name = name;
    _symbol = symbol;
    _decimals = decimals;
  }

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

  /**
   * @return the symbol of the token
   **/
  function symbol() public override view returns (string memory) {
    return _symbol;
  }

  /**
   * @return the decimals of the token
   **/
  function decimals() public override view returns (uint8) {
    return _decimals;
  }

  /**
   * @return the total supply of the token
   **/
  function totalSupply() public override view returns (uint256) {
    return _totalSupply;
  }

  /**
   * @return the balance of the token
   **/
  function balanceOf(address account) public override view returns (uint256) {
    return _balances[account];
  }

  /**
   * @dev executes a transfer of tokens from msg.sender to recipient
   * @param recipient the recipient of the tokens
   * @param amount the amount of tokens being transferred
   * @return true if the transfer succeeds, false otherwise
   **/
  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

  /**
   * @dev returns the allowance of spender on the tokens owned by owner
   * @param owner the owner of the tokens
   * @param spender the user allowed to spend the owner's tokens
   * @return the amount of owner's tokens spender is allowed to spend
   **/
  function allowance(address owner, address spender)
    public
    virtual
    override
    view
    returns (uint256)
  {
    return _allowances[owner][spender];
  }

  /**
   * @dev allows spender to spend the tokens owned by msg.sender
   * @param spender the user allowed to spend msg.sender tokens
   * @return true
   **/
  function approve(address spender, uint256 amount) public virtual override returns (bool) {
    _approve(_msgSender(), spender, amount);
    return true;
  }

  /**
   * @dev executes a transfer of token from sender to recipient, if msg.sender is allowed to do so
   * @param sender the owner of the tokens
   * @param recipient the recipient of the tokens
   * @param amount the amount of tokens being transferred
   * @return true if the transfer succeeds, false otherwise
   **/
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) public virtual override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(
      sender,
      _msgSender(),
      _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance')
    );
    return true;
  }

  /**
   * @dev increases the allowance of spender to spend msg.sender tokens
   * @param spender the user allowed to spend on behalf of msg.sender
   * @param addedValue the amount being added to the allowance
   * @return true
   **/
  function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
    _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
    return true;
  }

  /**
   * @dev decreases the allowance of spender to spend msg.sender tokens
   * @param spender the user allowed to spend on behalf of msg.sender
   * @param subtractedValue the amount being subtracted to the allowance
   * @return true
   **/
  function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
  {
    _approve(
      _msgSender(),
      spender,
      _allowances[_msgSender()][spender].sub(
        subtractedValue,
        'ERC20: decreased allowance below zero'
      )
    );
    return true;
  }

  function _transfer(
    address sender,
    address recipient,
    uint256 amount
  ) internal virtual {
    require(sender != address(0), 'ERC20: transfer from the zero address');
    require(recipient != address(0), 'ERC20: transfer to the zero address');

    _beforeTokenTransfer(sender, recipient, amount);

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

  function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: mint to the zero address');

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

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

  function _burn(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: burn from the zero address');

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

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

  function _approve(
    address owner,
    address spender,
    uint256 amount
  ) internal virtual {
    require(owner != address(0), 'ERC20: approve from the zero address');
    require(spender != address(0), 'ERC20: approve to the zero address');

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

  function _setName(string memory newName) internal {
    _name = newName;
  }

  function _setSymbol(string memory newSymbol) internal {
    _symbol = newSymbol;
  }

  function _setDecimals(uint8 newDecimals) internal {
    _decimals = newDecimals;
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual {}
}

// File: contracts/lib/ERC20WithSnapshot.sol


pragma solidity 0.6.12;



/**
 * @title ERC20WithSnapshot
 * @notice ERC20 including snapshots of balances on transfer-related actions
 * @author Roya
 **/
contract ERC20WithSnapshot is ERC20 {

    /// @dev snapshot of a value on a specific block, used for balances
    struct Snapshot {
        uint128 blockNumber;
        uint128 value;
    }

    mapping (address => mapping (uint256 => Snapshot)) public _snapshots;
    mapping (address => uint256) public _countsSnapshots;
    /// @dev reference to the Roya governance contract to call (if initialized) on _beforeTokenTransfer
    /// !!! IMPORTANT The Roya governance is considered a trustable contract, being its responsibility
    /// to control all potential reentrancies by calling back the this contract
    ITransferHook public _royaGovernance;

    event SnapshotDone(address owner, uint128 oldValue, uint128 newValue);

    constructor(string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol, decimals) {}

    function _setRoyaGovernance(ITransferHook royaGovernance) internal virtual {
        _royaGovernance = royaGovernance;
    }

    /**
    * @dev Writes a snapshot for an owner of tokens
    * @param owner The owner of the tokens
    * @param oldValue The value before the operation that is gonna be executed after the snapshot
    * @param newValue The value after the operation
    */
    function _writeSnapshot(address owner, uint128 oldValue, uint128 newValue) internal virtual {
        uint128 currentBlock = uint128(block.number);

        uint256 ownerCountOfSnapshots = _countsSnapshots[owner];
        mapping (uint256 => Snapshot) storage snapshotsOwner = _snapshots[owner];

        // Doing multiple operations in the same block
        if (ownerCountOfSnapshots != 0 && snapshotsOwner[ownerCountOfSnapshots.sub(1)].blockNumber == currentBlock) {
            snapshotsOwner[ownerCountOfSnapshots.sub(1)].value = newValue;
        } else {
            snapshotsOwner[ownerCountOfSnapshots] = Snapshot(currentBlock, newValue);
            _countsSnapshots[owner] = ownerCountOfSnapshots.add(1);
        }

        emit SnapshotDone(owner, oldValue, newValue);
    }

    /**
    * @dev Writes a snapshot before any operation involving transfer of value: _transfer, _mint and _burn
    * - On _transfer, it writes snapshots for both "from" and "to"
    * - On _mint, only for _to
    * - On _burn, only for _from
    * @param from the from address
    * @param to the to address
    * @param amount the amount to transfer
    */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
        if (from == to) {
            return;
        }

        if (from != address(0)) {
            uint256 fromBalance = balanceOf(from);
            _writeSnapshot(from, uint128(fromBalance), uint128(fromBalance.sub(amount)));
        }
        if (to != address(0)) {
            uint256 toBalance = balanceOf(to);
            _writeSnapshot(to, uint128(toBalance), uint128(toBalance.add(amount)));
        }

        // caching the roya governance address to avoid multiple state loads
        ITransferHook royaGovernance = _royaGovernance;
        if (royaGovernance != ITransferHook(0)) {
            royaGovernance.onTransfer(from, to, amount);
        }
    }
}

// File: contracts/lib/Address.sol


pragma solidity 0.6.12;

/**
 * @dev Collection of functions related to the address type
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev 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].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, 'Address: insufficient balance');

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

// File: contracts/lib/SafeERC20.sol



pragma solidity 0.6.12;




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

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        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/utils/VersionedInitializable.sol


pragma solidity 0.6.12;

/**
 * @title VersionedInitializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 *
 * @author Roya, inspired by the OpenZeppelin Initializable contract
 */
abstract contract VersionedInitializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    uint256 internal lastInitializedRevision = 0;

    /**
     * @dev Modifier to use in the initializer function of a contract.
     */
    modifier initializer() {
        uint256 revision = getRevision();
        require(
            revision > lastInitializedRevision,
            'Contract instance has already been initialized'
        );

        lastInitializedRevision = revision;

        _;
    }

    /// @dev returns the revision number of the contract.
    /// Needs to be defined in the inherited class as a constant.
    function getRevision() internal virtual pure returns (uint256);

    // Reserved storage space to allow for layout changes in the future.
    uint256[50] private ______gap;
}

// File: contracts/lib/DistributionTypes.sol


pragma solidity 0.6.12;


library DistributionTypes {
  struct AssetConfigInput {
    uint128 emissionPerSecond;
    uint256 totalStaked;
    address underlyingAsset;
  }

  struct UserStakeInput {
    address underlyingAsset;
    uint256 stakedByUser;
    uint256 totalStaked;
  }
}

// File: contracts/interfaces/IRoyaDistributionManager.sol


pragma solidity 0.6.12;



interface IRoyaDistributionManager {
  function configureAssets(DistributionTypes.AssetConfigInput[] calldata assetsConfigInput) external;
}

// File: contracts/stake/RoyaDistributionManager.sol


pragma solidity 0.6.12;





/**
 * @title RoyaDistributionManager
 * @notice Accounting contract to manage multiple staking distributions
 * @author Roya
 **/
contract RoyaDistributionManager is IRoyaDistributionManager {
  using SafeMath for uint256;

  struct AssetData {
    uint128 emissionPerSecond;
    uint128 lastUpdateTimestamp;
    uint256 index;
    mapping(address => uint256) users;
  }

  uint256 public immutable DISTRIBUTION_END;

  address public immutable EMISSION_MANAGER;

  uint8 public constant PRECISION = 18;

  mapping(address => AssetData) public assets;

  event AssetConfigUpdated(address indexed asset, uint256 emission);
  event AssetIndexUpdated(address indexed asset, uint256 index);
  event UserIndexUpdated(address indexed user, address indexed asset, uint256 index);

  constructor(address emissionManager, uint256 distributionDuration) public {
    DISTRIBUTION_END = block.timestamp.add(distributionDuration);
    EMISSION_MANAGER = emissionManager;
  }

  /**
   * @dev Configures the distribution of rewards for a list of assets
   * @param assetsConfigInput The list of configurations to apply
   **/
  function configureAssets(DistributionTypes.AssetConfigInput[] calldata assetsConfigInput) external override {
    require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER');

    for (uint256 i = 0; i < assetsConfigInput.length; i++) {
      AssetData storage assetConfig = assets[assetsConfigInput[i].underlyingAsset];

      _updateAssetStateInternal(
        assetsConfigInput[i].underlyingAsset,
        assetConfig,
        assetsConfigInput[i].totalStaked
      );

      assetConfig.emissionPerSecond = assetsConfigInput[i].emissionPerSecond;

      emit AssetConfigUpdated(
        assetsConfigInput[i].underlyingAsset,
        assetsConfigInput[i].emissionPerSecond
      );
    }
  }

  /**
   * @dev Updates the state of one distribution, mainly rewards index and timestamp
   * @param underlyingAsset The address used as key in the distribution, for example sAAVE or the aTokens addresses on Roya
   * @param assetConfig Storage pointer to the distribution's config
   * @param totalStaked Current total of staked assets for this distribution
   * @return The new distribution index
   **/
  function _updateAssetStateInternal(
    address underlyingAsset,
    AssetData storage assetConfig,
    uint256 totalStaked
  ) internal returns (uint256) {
    uint256 oldIndex = assetConfig.index;
    uint128 lastUpdateTimestamp = assetConfig.lastUpdateTimestamp;

    if (block.timestamp == lastUpdateTimestamp) {
      return oldIndex;
    }

    uint256 newIndex = _getAssetIndex(
      oldIndex,
      assetConfig.emissionPerSecond,
      lastUpdateTimestamp,
      totalStaked
    );

    if (newIndex != oldIndex) {
      assetConfig.index = newIndex;
      emit AssetIndexUpdated(underlyingAsset, newIndex);
    }

    assetConfig.lastUpdateTimestamp = uint128(block.timestamp);

    return newIndex;
  }

  /**
   * @dev Updates the state of an user in a distribution
   * @param user The user's address
   * @param asset The address of the reference asset of the distribution
   * @param stakedByUser Amount of tokens staked by the user in the distribution at the moment
   * @param totalStaked Total tokens staked in the distribution
   * @return The accrued rewards for the user until the moment
   **/
  function _updateUserAssetInternal(
    address user,
    address asset,
    uint256 stakedByUser,
    uint256 totalStaked
  ) internal returns (uint256) {
    AssetData storage assetData = assets[asset];
    uint256 userIndex = assetData.users[user];
    uint256 accruedRewards = 0;

    uint256 newIndex = _updateAssetStateInternal(asset, assetData, totalStaked);

    if (userIndex != newIndex) {
      if (stakedByUser != 0) {
        accruedRewards = _getRewards(stakedByUser, newIndex, userIndex);
      }

      assetData.users[user] = newIndex;
      emit UserIndexUpdated(user, asset, newIndex);
    }

    return accruedRewards;
  }

  /**
   * @dev Used by "frontend" stake contracts to update the data of an user when claiming rewards from there
   * @param user The address of the user
   * @param stakes List of structs of the user data related with his stake
   * @return The accrued rewards for the user until the moment
   **/
  function _claimRewards(address user, DistributionTypes.UserStakeInput[] memory stakes)
    internal
    returns (uint256)
  {
    uint256 accruedRewards = 0;

    for (uint256 i = 0; i < stakes.length; i++) {
      accruedRewards = accruedRewards.add(
        _updateUserAssetInternal(
          user,
          stakes[i].underlyingAsset,
          stakes[i].stakedByUser,
          stakes[i].totalStaked
        )
      );
    }

    return accruedRewards;
  }

  /**
   * @dev Return the accrued rewards for an user over a list of distribution
   * @param user The address of the user
   * @param stakes List of structs of the user data related with his stake
   * @return The accrued rewards for the user until the moment
   **/
  function _getUnclaimedRewards(address user, DistributionTypes.UserStakeInput[] memory stakes)
    internal
    view
    returns (uint256)
  {
    uint256 accruedRewards = 0;

    for (uint256 i = 0; i < stakes.length; i++) {
      AssetData storage assetConfig = assets[stakes[i].underlyingAsset];
      uint256 assetIndex = _getAssetIndex(
        assetConfig.index,
        assetConfig.emissionPerSecond,
        assetConfig.lastUpdateTimestamp,
        stakes[i].totalStaked
      );

      accruedRewards = accruedRewards.add(
        _getRewards(stakes[i].stakedByUser, assetIndex, assetConfig.users[user])
      );
    }
    return accruedRewards;
  }

  /**
   * @dev Internal function for the calculation of user's rewards on a distribution
   * @param principalUserBalance Amount staked by the user on a distribution
   * @param reserveIndex Current index of the distribution
   * @param userIndex Index stored for the user, representation his staking moment
   * @return The rewards
   **/
  function _getRewards(
    uint256 principalUserBalance,
    uint256 reserveIndex,
    uint256 userIndex
  ) internal pure returns (uint256) {
    return principalUserBalance.mul(reserveIndex.sub(userIndex)).div(10**uint256(PRECISION));
  }

  /**
   * @dev Calculates the next value of an specific distribution index, with validations
   * @param currentIndex Current index of the distribution
   * @param emissionPerSecond Representing the total rewards distributed per second per asset unit, on the distribution
   * @param lastUpdateTimestamp Last moment this distribution was updated
   * @param totalBalance of tokens considered for the distribution
   * @return The new index.
   **/
  function _getAssetIndex(
    uint256 currentIndex,
    uint256 emissionPerSecond,
    uint128 lastUpdateTimestamp,
    uint256 totalBalance
  ) internal view returns (uint256) {
    if (
      emissionPerSecond == 0 ||
      totalBalance == 0 ||
      lastUpdateTimestamp == block.timestamp ||
      lastUpdateTimestamp >= DISTRIBUTION_END
    ) {
      return currentIndex;
    }

    uint256 currentTimestamp = block.timestamp > DISTRIBUTION_END
      ? DISTRIBUTION_END
      : block.timestamp;
    uint256 timeDelta = currentTimestamp.sub(lastUpdateTimestamp);
    return
      emissionPerSecond.mul(timeDelta).mul(10**uint256(PRECISION)).div(totalBalance).add(
        currentIndex
      );
  }

  /**
   * @dev Returns the data of an user on a distribution
   * @param user Address of the user
   * @param asset The address of the reference asset of the distribution
   * @return The new index
   **/
  function getUserAssetData(address user, address asset) public view returns (uint256) {
    return assets[asset].users[user];
  }
}

// File: contracts/stake/StakedToken.sol


pragma solidity 0.6.12;










/**
 * @title StakedToken
 * @notice Contract to stake Roya token, tokenize the position and get rewards, inheriting from a distribution manager contract
 * @author Roya
 **/
contract StakedToken is IStakedRoya, ERC20WithSnapshot, VersionedInitializable, RoyaDistributionManager {
  using SafeERC20 for IERC20;

  uint256 public constant REVISION = 1;

  IERC20 public immutable STAKED_TOKEN;
  IERC20 public immutable REWARD_TOKEN;
  uint256 public immutable COOLDOWN_SECONDS;

  /// @notice Seconds available to redeem once the cooldown period is fullfilled
  uint256 public immutable UNSTAKE_WINDOW;

  /// @notice Address to pull from the rewards, needs to have approved this contract
  address public immutable REWARDS_VAULT;

  mapping(address => uint256) public stakerRewardsToClaim;
  mapping(address => uint256) public stakersCooldowns;

  event Staked(address indexed from, address indexed onBehalfOf, uint256 amount);
  event Redeem(address indexed from, address indexed to, uint256 amount);

  event RewardsAccrued(address user, uint256 amount);
  event RewardsClaimed(address indexed from, address indexed to, uint256 amount);

  event Cooldown(address indexed user);

  constructor(
    IERC20 stakedToken,
    IERC20 rewardToken,
    uint256 cooldownSeconds,
    uint256 unstakeWindow,
    address rewardsVault,
    address emissionManager,
    uint128 distributionDuration,
    string memory name,
    string memory symbol,
    uint8 decimals
  ) public ERC20WithSnapshot(name, symbol, decimals) RoyaDistributionManager(emissionManager, distributionDuration) {
    STAKED_TOKEN = stakedToken;
    REWARD_TOKEN = rewardToken;
    COOLDOWN_SECONDS = cooldownSeconds;
    UNSTAKE_WINDOW = unstakeWindow;
    REWARDS_VAULT = rewardsVault;
  }

  /**
   * @dev Called by the proxy contract
   **/
  function initialize(ITransferHook royaGovernance, string calldata name, string calldata symbol, uint8 decimals) external initializer {
    _setName(name);
    _setSymbol(symbol);
    _setDecimals(decimals);
    _setRoyaGovernance(royaGovernance);
  }

  function getStakersCooldowns(address user) public view returns(uint256){
    uint256 cooldownStartTimestamp = stakersCooldowns[user];
    if (block.timestamp < cooldownStartTimestamp.add(COOLDOWN_SECONDS))
        return 1;
    else if (block.timestamp.sub(cooldownStartTimestamp.add(COOLDOWN_SECONDS)) <= UNSTAKE_WINDOW)
        return 2;
    else 
        return 0;
  }

  function stake(address onBehalfOf, uint256 amount) external override {
    require(amount != 0, 'INVALID_ZERO_AMOUNT');
    uint256 balanceOfUser = balanceOf(onBehalfOf);

    uint256 accruedRewards = _updateUserAssetInternal(
      onBehalfOf,
      address(this),
      balanceOfUser,
      totalSupply()
    );
    if (accruedRewards != 0) {
      emit RewardsAccrued(onBehalfOf, accruedRewards);
      stakerRewardsToClaim[onBehalfOf] = stakerRewardsToClaim[onBehalfOf].add(accruedRewards);
    }

    stakersCooldowns[onBehalfOf] = getNextCooldownTimestamp(0, amount, onBehalfOf, balanceOfUser);

    _mint(onBehalfOf, amount);
    IERC20(STAKED_TOKEN).safeTransferFrom(msg.sender, address(this), amount);

    emit Staked(msg.sender, onBehalfOf, amount);
  }

  /**
   * @dev Redeems staked tokens, and stop earning rewards
   * @param to Address to redeem to
   * @param amount Amount to redeem
   **/
  function redeem(address to, uint256 amount) external override {
    require(amount != 0, 'INVALID_ZERO_AMOUNT');
    //solium-disable-next-line
    uint256 cooldownStartTimestamp = stakersCooldowns[msg.sender];
    require(
      block.timestamp > cooldownStartTimestamp.add(COOLDOWN_SECONDS),
      'INSUFFICIENT_COOLDOWN'
    );
    require(
      block.timestamp.sub(cooldownStartTimestamp.add(COOLDOWN_SECONDS)) <= UNSTAKE_WINDOW,
      'UNSTAKE_WINDOW_FINISHED'
    );
    uint256 balanceOfMessageSender = balanceOf(msg.sender);

    uint256 amountToRedeem = (amount > balanceOfMessageSender) ? balanceOfMessageSender : amount;

    _updateCurrentUnclaimedRewards(msg.sender, balanceOfMessageSender, true);

    _burn(msg.sender, amountToRedeem);

    if (balanceOfMessageSender.sub(amountToRedeem) == 0) {
      stakersCooldowns[msg.sender] = 0;
    }

    IERC20(STAKED_TOKEN).safeTransfer(to, amountToRedeem);

    emit Redeem(msg.sender, to, amountToRedeem);
  }

  /**
   * @dev Activates the cooldown period to unstake
   * - It can't be called if the user is not staking
   **/
  function cooldown() external override {
    require(balanceOf(msg.sender) != 0, "INVALID_BALANCE_ON_COOLDOWN");
    //solium-disable-next-line
    stakersCooldowns[msg.sender] = block.timestamp;

    emit Cooldown(msg.sender);
  }

  /**
   * @dev Claims an `amount` of `REWARD_TOKEN` to the address `to`
   * @param to Address to stake for
   * @param amount Amount to stake
   **/
  function claimRewards(address to, uint256 amount) external override {
    uint256 newTotalRewards = _updateCurrentUnclaimedRewards(
      msg.sender,
      balanceOf(msg.sender),
      false
    );
    uint256 amountToClaim = (amount == type(uint256).max) ? newTotalRewards : amount;

    stakerRewardsToClaim[msg.sender] = newTotalRewards.sub(amountToClaim, "INVALID_AMOUNT");

    REWARD_TOKEN.safeTransferFrom(REWARDS_VAULT, to, amountToClaim);

    emit RewardsClaimed(msg.sender, to, amountToClaim);
  }

  /**
   * @dev Internal ERC20 _transfer of the tokenized staked tokens
   * @param from Address to transfer from
   * @param to Address to transfer to
   * @param amount Amount to transfer
   **/
  function _transfer(
    address from,
    address to,
    uint256 amount
  ) internal override {
    uint256 balanceOfFrom = balanceOf(from);
    // Sender
    _updateCurrentUnclaimedRewards(from, balanceOfFrom, true);

    // Recipient
    if (from != to) {
      uint256 balanceOfTo = balanceOf(to);
      _updateCurrentUnclaimedRewards(to, balanceOfTo, true);

      uint256 previousSenderCooldown = stakersCooldowns[from];
      stakersCooldowns[to] = getNextCooldownTimestamp(previousSenderCooldown, amount, to, balanceOfTo);
      // if cooldown was set and whole balance of sender was transferred - clear cooldown
      if (balanceOfFrom == amount && previousSenderCooldown != 0) {
        stakersCooldowns[from] = 0;
      }
    }

    super._transfer(from, to, amount);
  }

  /**
   * @dev Updates the user state related with his accrued rewards
   * @param user Address of the user
   * @param userBalance The current balance of the user
   * @param updateStorage Boolean flag used to update or not the stakerRewardsToClaim of the user
   * @return The unclaimed rewards that were added to the total accrued
   **/
  function _updateCurrentUnclaimedRewards(
    address user,
    uint256 userBalance,
    bool updateStorage
  ) internal returns (uint256) {
    uint256 accruedRewards = _updateUserAssetInternal(
      user,
      address(this),
      userBalance,
      totalSupply()
    );
    uint256 unclaimedRewards = stakerRewardsToClaim[user].add(accruedRewards);

    if (accruedRewards != 0) {
      if (updateStorage) {
        stakerRewardsToClaim[user] = unclaimedRewards;
      }
      emit RewardsAccrued(user, accruedRewards);
    }

    return unclaimedRewards;
  }

  /**
   * @dev Calculates the how is gonna be a new cooldown timestamp depending on the sender/receiver situation
   *  - If the timestamp of the sender is "better" or the timestamp of the recipient is 0, we take the one of the recipient
   *  - Weighted average of from/to cooldown timestamps if:
   *    # The sender doesn't have the cooldown activated (timestamp 0).
   *    # The sender timestamp is expired
   *    # The sender has a "worse" timestamp
   *  - If the receiver's cooldown timestamp expired (too old), the next is 0
   * @param fromCooldownTimestamp Cooldown timestamp of the sender
   * @param amountToReceive Amount
   * @param toAddress Address of the recipient
   * @param toBalance Current balance of the receiver
   * @return The new cooldown timestamp
   **/
  function getNextCooldownTimestamp(
    uint256 fromCooldownTimestamp,
    uint256 amountToReceive,
    address toAddress,
    uint256 toBalance
  ) public view returns (uint256) {
    uint256 toCooldownTimestamp = stakersCooldowns[toAddress];
    if (toCooldownTimestamp == 0) {
      return 0;
    }

    uint256 minimalValidCooldownTimestamp = block.timestamp.sub(COOLDOWN_SECONDS).sub(
      UNSTAKE_WINDOW
    );

    if (minimalValidCooldownTimestamp > toCooldownTimestamp) {
      toCooldownTimestamp = 0;
    } else {
      uint256 fromCooldownTimestamp = (minimalValidCooldownTimestamp > fromCooldownTimestamp)
        ? block.timestamp
        : fromCooldownTimestamp;

      if (fromCooldownTimestamp < toCooldownTimestamp) {
        return toCooldownTimestamp;
      } else {
        toCooldownTimestamp = (
          amountToReceive.mul(fromCooldownTimestamp).add(toBalance.mul(toCooldownTimestamp))
        )
          .div(amountToReceive.add(toBalance));
      }
    }
    //stakersCooldowns[toAddress] = toCooldownTimestamp;

    return toCooldownTimestamp;
  }

  /**
   * @dev Return the total rewards pending to claim by an staker
   * @param staker The staker address
   * @return The rewards
   */
  function getTotalRewardsBalance(address staker) external view returns (uint256) {

      DistributionTypes.UserStakeInput[] memory userStakeInputs
     = new DistributionTypes.UserStakeInput[](1);
    userStakeInputs[0] = DistributionTypes.UserStakeInput({
      underlyingAsset: address(this),
      stakedByUser: balanceOf(staker),
      totalStaked: totalSupply()
    });
    return stakerRewardsToClaim[staker].add(_getUnclaimedRewards(staker, userStakeInputs));
  }

  /**
   * @dev returns the revision of the implementation contract
   * @return The revision
   */
  function getRevision() internal override pure returns (uint256) {
    return REVISION;
  }
}

// File: contracts/stake/StakedRoya.sol


pragma solidity 0.6.12;




/**
 * @title StakedRoya
 * @notice StakedToken with AAVE token as staked token
 * @author Roya
 **/
contract StakedRoya is StakedToken {
  string internal constant NAME = 'Staked Roya';
  string internal constant SYMBOL = 'stkRoya';
  uint8 internal constant DECIMALS = 18;
  
  constructor(
    IERC20 stakedToken,
    IERC20 rewardToken,
    uint256 cooldownSeconds,
    uint256 unstakeWindow,
    address rewardsVault,
    address emissionManager,
    uint128 distributionDuration
  ) public StakedToken(
    stakedToken,
    rewardToken,
    cooldownSeconds,
    unstakeWindow,
    rewardsVault,
    emissionManager,
    distributionDuration,
    NAME,
    SYMBOL,
    DECIMALS) {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"stakedToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"cooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"unstakeWindow","type":"uint256"},{"internalType":"address","name":"rewardsVault","type":"address"},{"internalType":"address","name":"emissionManager","type":"address"},{"internalType":"uint128","name":"distributionDuration","type":"uint128"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"emission","type":"uint256"}],"name":"AssetConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AssetIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Cooldown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint128","name":"oldValue","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newValue","type":"uint128"}],"name":"SnapshotDone","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"UserIndexUpdated","type":"event"},{"inputs":[],"name":"COOLDOWN_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTION_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_MANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDS_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKED_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSTAKE_WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_countsSnapshots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_royaGovernance","outputs":[{"internalType":"contract ITransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_snapshots","outputs":[{"internalType":"uint128","name":"blockNumber","type":"uint128"},{"internalType":"uint128","name":"value","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assets","outputs":[{"internalType":"uint128","name":"emissionPerSecond","type":"uint128"},{"internalType":"uint128","name":"lastUpdateTimestamp","type":"uint128"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint128","name":"emissionPerSecond","type":"uint128"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"address","name":"underlyingAsset","type":"address"}],"internalType":"struct DistributionTypes.AssetConfigInput[]","name":"assetsConfigInput","type":"tuple[]"}],"name":"configureAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromCooldownTimestamp","type":"uint256"},{"internalType":"uint256","name":"amountToReceive","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"toBalance","type":"uint256"}],"name":"getNextCooldownTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakersCooldowns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTotalRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"asset","type":"address"}],"name":"getUserAssetData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITransferHook","name":"royaGovernance","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakerRewardsToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakersCooldowns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

61016060405260006009553480156200001757600080fd5b5060405162004f4838038062004f4883398181016040528101906200003d9190620003a2565b868686868686866040518060400160405280600b81526020017f5374616b656420526f79610000000000000000000000000000000000000000008152506040518060400160405280600781526020017f73746b526f796100000000000000000000000000000000000000000000000000815250601284846fffffffffffffffffffffffffffffffff168484848282828260039080519060200190620000e4929190620002a0565b508160049080519060200190620000fd929190620002a0565b5080600560006101000a81548160ff021916908360ff1602179055505050505050506200013981426200024860201b62001d911790919060201c565b608081815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050508973ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508761010081815250508661012081815250508573ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050505050505050505050505050505050506200059a565b60008082840190508381101562000296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028d9062000491565b60405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e357805160ff191683800117855562000314565b8280016001018555821562000314579182015b8281111562000313578251825591602001919060010190620002f6565b5b50905062000323919062000327565b5090565b5b808211156200034257600081600090555060010162000328565b5090565b600081519050620003578162000532565b92915050565b6000815190506200036e816200054c565b92915050565b600081519050620003858162000566565b92915050565b6000815190506200039c8162000580565b92915050565b600080600080600080600060e0888a031215620003be57600080fd5b6000620003ce8a828b016200035d565b9750506020620003e18a828b016200035d565b9650506040620003f48a828b016200038b565b9550506060620004078a828b016200038b565b94505060806200041a8a828b0162000346565b93505060a06200042d8a828b0162000346565b92505060c0620004408a828b0162000374565b91505092959891949750929550565b60006200045e601b83620004b3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006020820190508181036000830152620004ac816200044f565b9050919050565b600082825260208201905092915050565b6000620004d18262000508565b9050919050565b6000620004e582620004c4565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200053d81620004c4565b81146200054957600080fd5b50565b6200055781620004d8565b81146200056357600080fd5b50565b6200057181620004ec565b81146200057d57600080fd5b50565b6200058b8162000528565b81146200059757600080fd5b50565b60805160a05160601c60c05160601c60e05160601c61010051610120516101405160601c6148fe6200064a600039806110bb528061128052508061093e5280610d3b5280611a765280611d135250806108cd52806109655280610e5a5280611a9a5280611cd25280611d3a52508061118152806112a3525080610a825280610c7652806115e452508061169652806118e152508061109752806132a852806132ee528061331b52506148fe6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063919cd40f11610125578063b2a5dbfa116100ad578063dde43cba1161007c578063dde43cba14610692578063f11b8188146106b0578063f1cc432a146106e2578063f6d2ee8614610712578063fec2105b1461072e5761021c565b8063b2a5dbfa1461060a578063cbcbb50714610626578063d38a3d3c14610644578063dd62ed3e146106625761021c565b80639a99b4f0116100f45780639a99b4f014610554578063a457c2d714610570578063a9059cbb146105a0578063aaf5eb68146105d0578063adc9772e146105ee5761021c565b8063919cd40f146104dc578063946776cd146104fa57806395d89b411461051857806399248ea7146105365761021c565b80633373ee4c116101a857806372b49d631161017757806372b49d6314610424578063787a08a6146104425780637e90d7ef1461044c5780638779588c1461047c5780638dbefee2146104ac5761021c565b80633373ee4c14610376578063359c4a96146103a657806339509351146103c457806370a08231146103f45761021c565b80631e9a6950116101ef5780631e9a6950146102bd57806323b872dd146102d95780632acbf82314610309578063312f6b831461033a578063313ce567146103585761021c565b806306fdde0314610221578063091030c31461023f578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61022961075e565b6040516102369190614363565b60405180910390f35b61025960048036038101906102549190613972565b610800565b6040516102669190614620565b60405180910390f35b61028960048036038101906102849190613a26565b610818565b6040516102969190614312565b60405180910390f35b6102a7610836565b6040516102b49190614620565b60405180910390f35b6102d760048036038101906102d29190613a26565b610840565b005b6102f360048036038101906102ee91906139d7565b610b32565b6040516103009190614312565b60405180910390f35b610323600480360381019061031e9190613a26565b610c0b565b6040516103319291906145c0565b60405180910390f35b610342610c74565b60405161034f919061432d565b60405180910390f35b610360610c98565b60405161036d919061463b565b60405180910390f35b610390600480360381019061038b919061399b565b610caf565b60405161039d9190614620565b60405180910390f35b6103ae610d39565b6040516103bb9190614620565b60405180910390f35b6103de60048036038101906103d99190613a26565b610d5d565b6040516103eb9190614312565b60405180910390f35b61040e60048036038101906104099190613972565b610e10565b60405161041b9190614620565b60405180910390f35b61042c610e58565b6040516104399190614620565b60405180910390f35b61044a610e7c565b005b61046660048036038101906104619190613972565b610f51565b6040516104739190614620565b60405180910390f35b61049660048036038101906104919190613972565b610f69565b6040516104a39190614620565b60405180910390f35b6104c660048036038101906104c19190613972565b610f81565b6040516104d39190614620565b60405180910390f35b6104e4611095565b6040516104f19190614620565b60405180910390f35b6105026110b9565b60405161050f9190614260565b60405180910390f35b6105206110dd565b60405161052d9190614363565b60405180910390f35b61053e61117f565b60405161054b919061432d565b60405180910390f35b61056e60048036038101906105699190613a26565b6111a3565b005b61058a60048036038101906105859190613a26565b611353565b6040516105979190614312565b60405180910390f35b6105ba60048036038101906105b59190613a26565b611420565b6040516105c79190614312565b60405180910390f35b6105d861143e565b6040516105e5919061463b565b60405180910390f35b61060860048036038101906106039190613a26565b611443565b005b610624600480360381019061061f9190613a62565b611694565b005b61062e6118df565b60405161063b9190614260565b60405180910390f35b61064c611903565b6040516106599190614348565b60405180910390f35b61067c6004803603810190610677919061399b565b611929565b6040516106899190614620565b60405180910390f35b61069a6119b0565b6040516106a79190614620565b60405180910390f35b6106ca60048036038101906106c59190613972565b6119b5565b6040516106d9939291906145e9565b60405180910390f35b6106fc60048036038101906106f79190613b94565b611a17565b6040516107099190614620565b60405180910390f35b61072c60048036038101906107279190613ad0565b611b7c565b005b61074860048036038101906107439190613972565b611c88565b6040516107559190614620565b60405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b603e6020528060005260406000206000915090505481565b600061082c610825611de6565b8484611dee565b6001905092915050565b6000600254905090565b6000811415610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906143e5565b60405180910390fd5b6000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506108fb7f000000000000000000000000000000000000000000000000000000000000000082611d9190919063ffffffff16565b421161093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390614425565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006109a26109937f000000000000000000000000000000000000000000000000000000000000000084611d9190919063ffffffff16565b42611fb990919063ffffffff16565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da906144e5565b60405180910390fd5b60006109ee33610e10565b905060008184116109ff5783610a01565b815b9050610a0f33836001612003565b50610a1a338261210a565b6000610a2f8284611fb990919063ffffffff16565b1415610a7b576000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610ac685827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166122b89092919063ffffffff16565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd12200efa34901b99367694174c3b0d32c99585fdf37c7c26892136ddd0836d983604051610b239190614620565b60405180910390a35050505050565b6000610b3f84848461233e565b610c0084610b4b611de6565b610bfb8560405180606001604052806028815260200161487c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bb1611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b611dee565b600190509392505050565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900460ff16905090565b6000603c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e06610d6a611de6565b84610e018560016000610d7b611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b611dee565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e8733610e10565b1415610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614545565b60405180910390fd5b42603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167ff52f50426b32362d3e6bb8cb36b7074756b224622def6352a59eac7f66ebe6e860405160405180910390a2565b603d6020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b60006060600167ffffffffffffffff81118015610f9d57600080fd5b50604051908082528060200260200182016040528015610fd757816020015b610fc461378c565b815260200190600190039081610fbc5790505b50905060405180606001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200161100a85610e10565b8152602001611017610836565b8152508160008151811061102757fe5b602002602001018190525061108d61103f8483612502565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111755780601f1061114a57610100808354040283529160200191611175565b820191906000526020600020905b81548152906001019060200180831161115857829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006111b9336111b233610e10565b6000612003565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146111ea57826111ec565b815b9050611238816040518060400160405280600e81526020017f494e56414c49445f414d4f554e54000000000000000000000000000000000000815250846124a79092919063ffffffff16565b603d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112e87f000000000000000000000000000000000000000000000000000000000000000085837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661267d909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c7836040516113459190614620565b60405180910390a350505050565b6000611416611360611de6565b84611411856040518060600160405280602581526020016148a4602591396001600061138a611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b611dee565b6001905092915050565b600061143461142d611de6565b848461233e565b6001905092915050565b601281565b6000811415611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e906143e5565b60405180910390fd5b600061149283610e10565b905060006114a98430846114a4610836565b612706565b905060008114611582577f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a7684826040516114e49291906142e9565b60405180910390a161153e81603d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61158f6000848685611a17565b603e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115dc8484612878565b6116293330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661267d909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd7856040516116869190614620565b60405180910390a350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614485565b60405180910390fd5b60005b828290508110156118da576000603c600085858581811061174257fe5b905060600201604001602081019061175a9190613972565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506117d98484848181106117a557fe5b90506060020160400160208101906117bd9190613972565b828686868181106117ca57fe5b90506060020160200135612a0c565b508383838181106117e657fe5b90506060020160000160208101906117fe9190613b6b565b8160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083838381811061184457fe5b905060600201604001602081019061185c9190613972565b73ffffffffffffffffffffffffffffffffffffffff167f87fa03892a0556cb6b8f97e6d533a150d4d55fcbf275fff5fa003fa636bcc7fa85858581811061189f57fe5b90506060020160000160208101906118b79190613b6b565b6040516118c491906145a5565b60405180910390a2508080600101915050611725565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600181565b603c6020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16908060010154905083565b600080603e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415611a6f576000915050611b74565b6000611ad67f0000000000000000000000000000000000000000000000000000000000000000611ac87f000000000000000000000000000000000000000000000000000000000000000042611fb990919063ffffffff16565b611fb990919063ffffffff16565b905081811115611ae95760009150611b6e565b6000878211611af85787611afa565b425b905082811015611b0f57829350505050611b74565b611b6a611b258689611d9190919063ffffffff16565b611b5c611b3b8689612b4990919063ffffffff16565b611b4e858c612b4990919063ffffffff16565b611d9190919063ffffffff16565b612bb990919063ffffffff16565b9250505b81925050505b949350505050565b6000611b86612c03565b90506009548111611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614465565b60405180910390fd5b80600981905550611c2086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c0c565b611c6d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c26565b611c7682612c40565b611c7f87612c5e565b50505050505050565b600080603e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d007f000000000000000000000000000000000000000000000000000000000000000082611d9190919063ffffffff16565b421015611d11576001915050611d8c565b7f0000000000000000000000000000000000000000000000000000000000000000611d77611d687f000000000000000000000000000000000000000000000000000000000000000084611d9190919063ffffffff16565b42611fb990919063ffffffff16565b11611d86576002915050611d8c565b60009150505b919050565b600080828401905083811015611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd3906143c5565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590614505565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec5906143a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611fac9190614620565b60405180910390a3505050565b6000611ffb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124a7565b905092915050565b600080612019853086612014610836565b612706565b9050600061206f82603d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b9050600082146120fe5783156120c45780603d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a7686836040516120f59291906142e9565b60405180910390a15b80925050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561217a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612171906144a5565b60405180910390fd5b61218682600083612ca2565b6121f181604051806060016040528060228152602001614834602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061224881600254611fb990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122ac9190614620565b60405180910390a35050565b6123398363a9059cbb60e01b84846040516024016122d79291906142e9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e6d565b505050565b600061234984610e10565b905061235784826001612003565b508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461249657600061239684610e10565b90506123a484826001612003565b506000603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506123f581858785611a17565b603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508383148015612448575060008114155b15612493576000603e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50505b6124a1848484612fdf565b50505050565b60008383111582906124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e69190614363565b60405180910390fd5b5060008385039050809150509392505050565b6000806000905060005b8351811015612672576000603c600086848151811061252757fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006125ea82600101548360000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460000160109054906101000a90046fffffffffffffffffffffffffffffffff168987815181106125d957fe5b602002602001015160400151613274565b90506126616126528785815181106125fe57fe5b602002602001015160200151838560020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c3565b85611d9190919063ffffffff16565b93505050808060010191505061250c565b508091505092915050565b612700846323b872dd60e01b85858560405160240161269e9392919061427b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e6d565b50505050565b600080603c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008061279e888588612a0c565b905080831461286957600087146127bd576127ba8782856133c3565b91505b808460020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fbb123b5c06d5408bbea3c4fef481578175cfb432e3b482c6186f02ed9086585b836040516128609190614620565b60405180910390a35b81945050505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90614585565b60405180910390fd5b6128f460008383612ca2565b61290981600254611d9190919063ffffffff16565b600281905550612960816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612a009190614620565b60405180910390a35050565b6000808360010154905060008460000160109054906101000a90046fffffffffffffffffffffffffffffffff169050806fffffffffffffffffffffffffffffffff16421415612a5f578192505050612b42565b6000612a9f838760000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168488613274565b9050828114612b00578086600101819055508673ffffffffffffffffffffffffffffffffffffffff167f5777ca300dfe5bead41006fbce4389794dbc0ed8d6cccebfaf94630aa04184bc82604051612af79190614620565b60405180910390a25b428660000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508093505050505b9392505050565b600080831415612b5c5760009050612bb3565b6000828402905082848281612b6d57fe5b0414612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba590614445565b60405180910390fd5b809150505b92915050565b6000612bfb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061340c565b905092915050565b60006001905090565b8060039080519060200190612c229291906137c3565b5050565b8060049080519060200190612c3c9291906137c3565b5050565b80600560006101000a81548160ff021916908360ff16021790555050565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cdb57612e68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3b576000612d1a84610e10565b9050612d398482612d348585611fb990919063ffffffff16565b61346d565b505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d9b576000612d7a83610e10565b9050612d998382612d948585611d9190919063ffffffff16565b61346d565b505b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e66578073ffffffffffffffffffffffffffffffffffffffff16634a3931498585856040518463ffffffff1660e01b8152600401612e339392919061427b565b600060405180830381600087803b158015612e4d57600080fd5b505af1158015612e61573d6000803e3d6000fd5b505050505b505b505050565b612e8c8273ffffffffffffffffffffffffffffffffffffffff16613741565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290614565565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612ef49190614249565b6000604051808303816000865af19150503d8060008114612f31576040519150601f19603f3d011682016040523d82523d6000602084013e612f36565b606091505b509150915081612f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7290614405565b60405180910390fd5b600081511115612fd95780806020019051810190612f999190613aa7565b612fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcf90614525565b60405180910390fd5b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561304f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613046906144c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614385565b60405180910390fd5b6130ca838383612ca2565b61313581604051806060016040528060268152602001614856602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131c8816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132679190614620565b60405180910390a3505050565b6000808414806132845750600082145b806132a0575042836fffffffffffffffffffffffffffffffff16145b806132dd57507f0000000000000000000000000000000000000000000000000000000000000000836fffffffffffffffffffffffffffffffff1610155b156132ea578490506133bb565b60007f00000000000000000000000000000000000000000000000000000000000000004211613319574261333b565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613364856fffffffffffffffffffffffffffffffff1683611fb990919063ffffffff16565b90506133b6876133a88661339a601260ff16600a0a61338c878d612b4990919063ffffffff16565b612b4990919063ffffffff16565b612bb990919063ffffffff16565b611d9190919063ffffffff16565b925050505b949350505050565b6000613403601260ff16600a0a6133f56133e68587611fb990919063ffffffff16565b87612b4990919063ffffffff16565b612bb990919063ffffffff16565b90509392505050565b60008083118290613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a9190614363565b60405180910390fd5b50600083858161345f57fe5b049050809150509392505050565b60004390506000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082141580156135715750826fffffffffffffffffffffffffffffffff1681600061352f600186611fb990919063ffffffff16565b815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16145b156135da578381600061358e600186611fb990919063ffffffff16565b815260200190815260200160002060000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506136fe565b6040518060400160405280846fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681525081600084815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506136ba600183611d9190919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2cd3c83ddac2953ee75f53265d9ea4463eaf05030e5459a1b7e63819b7ce88f7868686604051613731939291906142b2565b60405180910390a1505050505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561378357506000801b8214155b92505050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061380457805160ff1916838001178555613832565b82800160010185558215613832579182015b82811115613831578251825591602001919060010190613816565b5b50905061383f9190613843565b5090565b5b8082111561385c576000816000905550600101613844565b5090565b60008135905061386f816147a9565b92915050565b60008083601f84011261388757600080fd5b8235905067ffffffffffffffff8111156138a057600080fd5b6020830191508360608202830111156138b857600080fd5b9250929050565b6000815190506138ce816147c0565b92915050565b6000813590506138e3816147d7565b92915050565b60008083601f8401126138fb57600080fd5b8235905067ffffffffffffffff81111561391457600080fd5b60208301915083600182028301111561392c57600080fd5b9250929050565b600081359050613942816147ee565b92915050565b60008135905061395781614805565b92915050565b60008135905061396c8161481c565b92915050565b60006020828403121561398457600080fd5b600061399284828501613860565b91505092915050565b600080604083850312156139ae57600080fd5b60006139bc85828601613860565b92505060206139cd85828601613860565b9150509250929050565b6000806000606084860312156139ec57600080fd5b60006139fa86828701613860565b9350506020613a0b86828701613860565b9250506040613a1c86828701613948565b9150509250925092565b60008060408385031215613a3957600080fd5b6000613a4785828601613860565b9250506020613a5885828601613948565b9150509250929050565b60008060208385031215613a7557600080fd5b600083013567ffffffffffffffff811115613a8f57600080fd5b613a9b85828601613875565b92509250509250929050565b600060208284031215613ab957600080fd5b6000613ac7848285016138bf565b91505092915050565b60008060008060008060808789031215613ae957600080fd5b6000613af789828a016138d4565b965050602087013567ffffffffffffffff811115613b1457600080fd5b613b2089828a016138e9565b9550955050604087013567ffffffffffffffff811115613b3f57600080fd5b613b4b89828a016138e9565b93509350506060613b5e89828a0161395d565b9150509295509295509295565b600060208284031215613b7d57600080fd5b6000613b8b84828501613933565b91505092915050565b60008060008060808587031215613baa57600080fd5b6000613bb887828801613948565b9450506020613bc987828801613948565b9350506040613bda87828801613860565b9250506060613beb87828801613948565b91505092959194509250565b613c0081614688565b82525050565b613c0f8161469a565b82525050565b6000613c2082614656565b613c2a818561466c565b9350613c3a818560208601614765565b80840191505092915050565b613c4f8161470b565b82525050565b613c5e8161472f565b82525050565b6000613c6f82614661565b613c798185614677565b9350613c89818560208601614765565b613c9281614798565b840191505092915050565b6000613caa602383614677565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d10602283614677565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d76601b83614677565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613db6601383614677565b91507f494e56414c49445f5a45524f5f414d4f554e54000000000000000000000000006000830152602082019050919050565b6000613df6602083614677565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000613e36601583614677565b91507f494e53554646494349454e545f434f4f4c444f574e00000000000000000000006000830152602082019050919050565b6000613e76602183614677565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613edc602e83614677565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613f42601583614677565b91507f4f4e4c595f454d495353494f4e5f4d414e4147455200000000000000000000006000830152602082019050919050565b6000613f82602183614677565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe8602583614677565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061404e601783614677565b91507f554e5354414b455f57494e444f575f46494e49534845440000000000000000006000830152602082019050919050565b600061408e602483614677565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f4602a83614677565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061415a601b83614677565b91507f494e56414c49445f42414c414e43455f4f4e5f434f4f4c444f574e00000000006000830152602082019050919050565b600061419a601f83614677565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b60006141da601f83614677565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b614216816146b8565b82525050565b61422581614753565b82525050565b614234816146f4565b82525050565b614243816146fe565b82525050565b60006142558284613c15565b915081905092915050565b60006020820190506142756000830184613bf7565b92915050565b60006060820190506142906000830186613bf7565b61429d6020830185613bf7565b6142aa604083018461422b565b949350505050565b60006060820190506142c76000830186613bf7565b6142d4602083018561420d565b6142e1604083018461420d565b949350505050565b60006040820190506142fe6000830185613bf7565b61430b602083018461422b565b9392505050565b60006020820190506143276000830184613c06565b92915050565b60006020820190506143426000830184613c46565b92915050565b600060208201905061435d6000830184613c55565b92915050565b6000602082019050818103600083015261437d8184613c64565b905092915050565b6000602082019050818103600083015261439e81613c9d565b9050919050565b600060208201905081810360008301526143be81613d03565b9050919050565b600060208201905081810360008301526143de81613d69565b9050919050565b600060208201905081810360008301526143fe81613da9565b9050919050565b6000602082019050818103600083015261441e81613de9565b9050919050565b6000602082019050818103600083015261443e81613e29565b9050919050565b6000602082019050818103600083015261445e81613e69565b9050919050565b6000602082019050818103600083015261447e81613ecf565b9050919050565b6000602082019050818103600083015261449e81613f35565b9050919050565b600060208201905081810360008301526144be81613f75565b9050919050565b600060208201905081810360008301526144de81613fdb565b9050919050565b600060208201905081810360008301526144fe81614041565b9050919050565b6000602082019050818103600083015261451e81614081565b9050919050565b6000602082019050818103600083015261453e816140e7565b9050919050565b6000602082019050818103600083015261455e8161414d565b9050919050565b6000602082019050818103600083015261457e8161418d565b9050919050565b6000602082019050818103600083015261459e816141cd565b9050919050565b60006020820190506145ba600083018461421c565b92915050565b60006040820190506145d5600083018561420d565b6145e2602083018461420d565b9392505050565b60006060820190506145fe600083018661420d565b61460b602083018561420d565b614618604083018461422b565b949350505050565b6000602082019050614635600083018461422b565b92915050565b6000602082019050614650600083018461423a565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000614693826146d4565b9050919050565b60008115159050919050565b60006146b182614688565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006147168261471d565b9050919050565b6000614728826146d4565b9050919050565b600061473a82614741565b9050919050565b600061474c826146d4565b9050919050565b600061475e826146b8565b9050919050565b60005b83811015614783578082015181840152602081019050614768565b83811115614792576000848401525b50505050565b6000601f19601f8301169050919050565b6147b281614688565b81146147bd57600080fd5b50565b6147c98161469a565b81146147d457600080fd5b50565b6147e0816146a6565b81146147eb57600080fd5b50565b6147f7816146b8565b811461480257600080fd5b50565b61480e816146f4565b811461481957600080fd5b50565b614825816146fe565b811461483057600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220370cc8f74b0cbfd1fe13c34bafd209542f5581a9853e2f038f3623475c9e365564736f6c634300060c00330000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db000000000000000000000000a9a933e0d816b36dbf7da87f27ac3bc4dcc2582e00000000000000000000000000000000000000000000000000000000000d2f00000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981100000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a39811000000000000000000000000000000000000000000000000000000000332b380

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063919cd40f11610125578063b2a5dbfa116100ad578063dde43cba1161007c578063dde43cba14610692578063f11b8188146106b0578063f1cc432a146106e2578063f6d2ee8614610712578063fec2105b1461072e5761021c565b8063b2a5dbfa1461060a578063cbcbb50714610626578063d38a3d3c14610644578063dd62ed3e146106625761021c565b80639a99b4f0116100f45780639a99b4f014610554578063a457c2d714610570578063a9059cbb146105a0578063aaf5eb68146105d0578063adc9772e146105ee5761021c565b8063919cd40f146104dc578063946776cd146104fa57806395d89b411461051857806399248ea7146105365761021c565b80633373ee4c116101a857806372b49d631161017757806372b49d6314610424578063787a08a6146104425780637e90d7ef1461044c5780638779588c1461047c5780638dbefee2146104ac5761021c565b80633373ee4c14610376578063359c4a96146103a657806339509351146103c457806370a08231146103f45761021c565b80631e9a6950116101ef5780631e9a6950146102bd57806323b872dd146102d95780632acbf82314610309578063312f6b831461033a578063313ce567146103585761021c565b806306fdde0314610221578063091030c31461023f578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61022961075e565b6040516102369190614363565b60405180910390f35b61025960048036038101906102549190613972565b610800565b6040516102669190614620565b60405180910390f35b61028960048036038101906102849190613a26565b610818565b6040516102969190614312565b60405180910390f35b6102a7610836565b6040516102b49190614620565b60405180910390f35b6102d760048036038101906102d29190613a26565b610840565b005b6102f360048036038101906102ee91906139d7565b610b32565b6040516103009190614312565b60405180910390f35b610323600480360381019061031e9190613a26565b610c0b565b6040516103319291906145c0565b60405180910390f35b610342610c74565b60405161034f919061432d565b60405180910390f35b610360610c98565b60405161036d919061463b565b60405180910390f35b610390600480360381019061038b919061399b565b610caf565b60405161039d9190614620565b60405180910390f35b6103ae610d39565b6040516103bb9190614620565b60405180910390f35b6103de60048036038101906103d99190613a26565b610d5d565b6040516103eb9190614312565b60405180910390f35b61040e60048036038101906104099190613972565b610e10565b60405161041b9190614620565b60405180910390f35b61042c610e58565b6040516104399190614620565b60405180910390f35b61044a610e7c565b005b61046660048036038101906104619190613972565b610f51565b6040516104739190614620565b60405180910390f35b61049660048036038101906104919190613972565b610f69565b6040516104a39190614620565b60405180910390f35b6104c660048036038101906104c19190613972565b610f81565b6040516104d39190614620565b60405180910390f35b6104e4611095565b6040516104f19190614620565b60405180910390f35b6105026110b9565b60405161050f9190614260565b60405180910390f35b6105206110dd565b60405161052d9190614363565b60405180910390f35b61053e61117f565b60405161054b919061432d565b60405180910390f35b61056e60048036038101906105699190613a26565b6111a3565b005b61058a60048036038101906105859190613a26565b611353565b6040516105979190614312565b60405180910390f35b6105ba60048036038101906105b59190613a26565b611420565b6040516105c79190614312565b60405180910390f35b6105d861143e565b6040516105e5919061463b565b60405180910390f35b61060860048036038101906106039190613a26565b611443565b005b610624600480360381019061061f9190613a62565b611694565b005b61062e6118df565b60405161063b9190614260565b60405180910390f35b61064c611903565b6040516106599190614348565b60405180910390f35b61067c6004803603810190610677919061399b565b611929565b6040516106899190614620565b60405180910390f35b61069a6119b0565b6040516106a79190614620565b60405180910390f35b6106ca60048036038101906106c59190613972565b6119b5565b6040516106d9939291906145e9565b60405180910390f35b6106fc60048036038101906106f79190613b94565b611a17565b6040516107099190614620565b60405180910390f35b61072c60048036038101906107279190613ad0565b611b7c565b005b61074860048036038101906107439190613972565b611c88565b6040516107559190614620565b60405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b603e6020528060005260406000206000915090505481565b600061082c610825611de6565b8484611dee565b6001905092915050565b6000600254905090565b6000811415610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906143e5565b60405180910390fd5b6000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506108fb7f00000000000000000000000000000000000000000000000000000000000d2f0082611d9190919063ffffffff16565b421161093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390614425565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000002a3006109a26109937f00000000000000000000000000000000000000000000000000000000000d2f0084611d9190919063ffffffff16565b42611fb990919063ffffffff16565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da906144e5565b60405180910390fd5b60006109ee33610e10565b905060008184116109ff5783610a01565b815b9050610a0f33836001612003565b50610a1a338261210a565b6000610a2f8284611fb990919063ffffffff16565b1415610a7b576000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610ac685827f0000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db73ffffffffffffffffffffffffffffffffffffffff166122b89092919063ffffffff16565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd12200efa34901b99367694174c3b0d32c99585fdf37c7c26892136ddd0836d983604051610b239190614620565b60405180910390a35050505050565b6000610b3f84848461233e565b610c0084610b4b611de6565b610bfb8560405180606001604052806028815260200161487c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bb1611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b611dee565b600190509392505050565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f0000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db81565b6000600560009054906101000a900460ff16905090565b6000603c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000002a30081565b6000610e06610d6a611de6565b84610e018560016000610d7b611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b611dee565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f00000000000000000000000000000000000000000000000000000000000d2f0081565b6000610e8733610e10565b1415610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614545565b60405180910390fd5b42603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167ff52f50426b32362d3e6bb8cb36b7074756b224622def6352a59eac7f66ebe6e860405160405180910390a2565b603d6020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b60006060600167ffffffffffffffff81118015610f9d57600080fd5b50604051908082528060200260200182016040528015610fd757816020015b610fc461378c565b815260200190600190039081610fbc5790505b50905060405180606001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200161100a85610e10565b8152602001611017610836565b8152508160008151811061102757fe5b602002602001018190525061108d61103f8483612502565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b915050919050565b7f0000000000000000000000000000000000000000000000000000000063bbd36d81565b7f00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981181565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111755780601f1061114a57610100808354040283529160200191611175565b820191906000526020600020905b81548152906001019060200180831161115857829003601f168201915b5050505050905090565b7f000000000000000000000000a9a933e0d816b36dbf7da87f27ac3bc4dcc2582e81565b60006111b9336111b233610e10565b6000612003565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146111ea57826111ec565b815b9050611238816040518060400160405280600e81526020017f494e56414c49445f414d4f554e54000000000000000000000000000000000000815250846124a79092919063ffffffff16565b603d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112e87f00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981185837f000000000000000000000000a9a933e0d816b36dbf7da87f27ac3bc4dcc2582e73ffffffffffffffffffffffffffffffffffffffff1661267d909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c7836040516113459190614620565b60405180910390a350505050565b6000611416611360611de6565b84611411856040518060600160405280602581526020016148a4602591396001600061138a611de6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b611dee565b6001905092915050565b600061143461142d611de6565b848461233e565b6001905092915050565b601281565b6000811415611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e906143e5565b60405180910390fd5b600061149283610e10565b905060006114a98430846114a4610836565b612706565b905060008114611582577f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a7684826040516114e49291906142e9565b60405180910390a161153e81603d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61158f6000848685611a17565b603e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115dc8484612878565b6116293330857f0000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db73ffffffffffffffffffffffffffffffffffffffff1661267d909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd7856040516116869190614620565b60405180910390a350505050565b7f00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614485565b60405180910390fd5b60005b828290508110156118da576000603c600085858581811061174257fe5b905060600201604001602081019061175a9190613972565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506117d98484848181106117a557fe5b90506060020160400160208101906117bd9190613972565b828686868181106117ca57fe5b90506060020160200135612a0c565b508383838181106117e657fe5b90506060020160000160208101906117fe9190613b6b565b8160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083838381811061184457fe5b905060600201604001602081019061185c9190613972565b73ffffffffffffffffffffffffffffffffffffffff167f87fa03892a0556cb6b8f97e6d533a150d4d55fcbf275fff5fa003fa636bcc7fa85858581811061189f57fe5b90506060020160000160208101906118b79190613b6b565b6040516118c491906145a5565b60405180910390a2508080600101915050611725565b505050565b7f00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981181565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600181565b603c6020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16908060010154905083565b600080603e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415611a6f576000915050611b74565b6000611ad67f000000000000000000000000000000000000000000000000000000000002a300611ac87f00000000000000000000000000000000000000000000000000000000000d2f0042611fb990919063ffffffff16565b611fb990919063ffffffff16565b905081811115611ae95760009150611b6e565b6000878211611af85787611afa565b425b905082811015611b0f57829350505050611b74565b611b6a611b258689611d9190919063ffffffff16565b611b5c611b3b8689612b4990919063ffffffff16565b611b4e858c612b4990919063ffffffff16565b611d9190919063ffffffff16565b612bb990919063ffffffff16565b9250505b81925050505b949350505050565b6000611b86612c03565b90506009548111611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614465565b60405180910390fd5b80600981905550611c2086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c0c565b611c6d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c26565b611c7682612c40565b611c7f87612c5e565b50505050505050565b600080603e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d007f00000000000000000000000000000000000000000000000000000000000d2f0082611d9190919063ffffffff16565b421015611d11576001915050611d8c565b7f000000000000000000000000000000000000000000000000000000000002a300611d77611d687f00000000000000000000000000000000000000000000000000000000000d2f0084611d9190919063ffffffff16565b42611fb990919063ffffffff16565b11611d86576002915050611d8c565b60009150505b919050565b600080828401905083811015611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd3906143c5565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590614505565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec5906143a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611fac9190614620565b60405180910390a3505050565b6000611ffb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124a7565b905092915050565b600080612019853086612014610836565b612706565b9050600061206f82603d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b9050600082146120fe5783156120c45780603d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a7686836040516120f59291906142e9565b60405180910390a15b80925050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561217a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612171906144a5565b60405180910390fd5b61218682600083612ca2565b6121f181604051806060016040528060228152602001614834602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061224881600254611fb990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122ac9190614620565b60405180910390a35050565b6123398363a9059cbb60e01b84846040516024016122d79291906142e9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e6d565b505050565b600061234984610e10565b905061235784826001612003565b508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461249657600061239684610e10565b90506123a484826001612003565b506000603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506123f581858785611a17565b603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508383148015612448575060008114155b15612493576000603e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50505b6124a1848484612fdf565b50505050565b60008383111582906124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e69190614363565b60405180910390fd5b5060008385039050809150509392505050565b6000806000905060005b8351811015612672576000603c600086848151811061252757fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006125ea82600101548360000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460000160109054906101000a90046fffffffffffffffffffffffffffffffff168987815181106125d957fe5b602002602001015160400151613274565b90506126616126528785815181106125fe57fe5b602002602001015160200151838560020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c3565b85611d9190919063ffffffff16565b93505050808060010191505061250c565b508091505092915050565b612700846323b872dd60e01b85858560405160240161269e9392919061427b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e6d565b50505050565b600080603c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008061279e888588612a0c565b905080831461286957600087146127bd576127ba8782856133c3565b91505b808460020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fbb123b5c06d5408bbea3c4fef481578175cfb432e3b482c6186f02ed9086585b836040516128609190614620565b60405180910390a35b81945050505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90614585565b60405180910390fd5b6128f460008383612ca2565b61290981600254611d9190919063ffffffff16565b600281905550612960816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612a009190614620565b60405180910390a35050565b6000808360010154905060008460000160109054906101000a90046fffffffffffffffffffffffffffffffff169050806fffffffffffffffffffffffffffffffff16421415612a5f578192505050612b42565b6000612a9f838760000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168488613274565b9050828114612b00578086600101819055508673ffffffffffffffffffffffffffffffffffffffff167f5777ca300dfe5bead41006fbce4389794dbc0ed8d6cccebfaf94630aa04184bc82604051612af79190614620565b60405180910390a25b428660000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508093505050505b9392505050565b600080831415612b5c5760009050612bb3565b6000828402905082848281612b6d57fe5b0414612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba590614445565b60405180910390fd5b809150505b92915050565b6000612bfb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061340c565b905092915050565b60006001905090565b8060039080519060200190612c229291906137c3565b5050565b8060049080519060200190612c3c9291906137c3565b5050565b80600560006101000a81548160ff021916908360ff16021790555050565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cdb57612e68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3b576000612d1a84610e10565b9050612d398482612d348585611fb990919063ffffffff16565b61346d565b505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d9b576000612d7a83610e10565b9050612d998382612d948585611d9190919063ffffffff16565b61346d565b505b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e66578073ffffffffffffffffffffffffffffffffffffffff16634a3931498585856040518463ffffffff1660e01b8152600401612e339392919061427b565b600060405180830381600087803b158015612e4d57600080fd5b505af1158015612e61573d6000803e3d6000fd5b505050505b505b505050565b612e8c8273ffffffffffffffffffffffffffffffffffffffff16613741565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290614565565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612ef49190614249565b6000604051808303816000865af19150503d8060008114612f31576040519150601f19603f3d011682016040523d82523d6000602084013e612f36565b606091505b509150915081612f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7290614405565b60405180910390fd5b600081511115612fd95780806020019051810190612f999190613aa7565b612fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcf90614525565b60405180910390fd5b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561304f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613046906144c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614385565b60405180910390fd5b6130ca838383612ca2565b61313581604051806060016040528060268152602001614856602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a79092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131c8816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132679190614620565b60405180910390a3505050565b6000808414806132845750600082145b806132a0575042836fffffffffffffffffffffffffffffffff16145b806132dd57507f0000000000000000000000000000000000000000000000000000000063bbd36d836fffffffffffffffffffffffffffffffff1610155b156132ea578490506133bb565b60007f0000000000000000000000000000000000000000000000000000000063bbd36d4211613319574261333b565b7f0000000000000000000000000000000000000000000000000000000063bbd36d5b90506000613364856fffffffffffffffffffffffffffffffff1683611fb990919063ffffffff16565b90506133b6876133a88661339a601260ff16600a0a61338c878d612b4990919063ffffffff16565b612b4990919063ffffffff16565b612bb990919063ffffffff16565b611d9190919063ffffffff16565b925050505b949350505050565b6000613403601260ff16600a0a6133f56133e68587611fb990919063ffffffff16565b87612b4990919063ffffffff16565b612bb990919063ffffffff16565b90509392505050565b60008083118290613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344a9190614363565b60405180910390fd5b50600083858161345f57fe5b049050809150509392505050565b60004390506000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082141580156135715750826fffffffffffffffffffffffffffffffff1681600061352f600186611fb990919063ffffffff16565b815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16145b156135da578381600061358e600186611fb990919063ffffffff16565b815260200190815260200160002060000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506136fe565b6040518060400160405280846fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681525081600084815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506136ba600183611d9190919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2cd3c83ddac2953ee75f53265d9ea4463eaf05030e5459a1b7e63819b7ce88f7868686604051613731939291906142b2565b60405180910390a1505050505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561378357506000801b8214155b92505050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061380457805160ff1916838001178555613832565b82800160010185558215613832579182015b82811115613831578251825591602001919060010190613816565b5b50905061383f9190613843565b5090565b5b8082111561385c576000816000905550600101613844565b5090565b60008135905061386f816147a9565b92915050565b60008083601f84011261388757600080fd5b8235905067ffffffffffffffff8111156138a057600080fd5b6020830191508360608202830111156138b857600080fd5b9250929050565b6000815190506138ce816147c0565b92915050565b6000813590506138e3816147d7565b92915050565b60008083601f8401126138fb57600080fd5b8235905067ffffffffffffffff81111561391457600080fd5b60208301915083600182028301111561392c57600080fd5b9250929050565b600081359050613942816147ee565b92915050565b60008135905061395781614805565b92915050565b60008135905061396c8161481c565b92915050565b60006020828403121561398457600080fd5b600061399284828501613860565b91505092915050565b600080604083850312156139ae57600080fd5b60006139bc85828601613860565b92505060206139cd85828601613860565b9150509250929050565b6000806000606084860312156139ec57600080fd5b60006139fa86828701613860565b9350506020613a0b86828701613860565b9250506040613a1c86828701613948565b9150509250925092565b60008060408385031215613a3957600080fd5b6000613a4785828601613860565b9250506020613a5885828601613948565b9150509250929050565b60008060208385031215613a7557600080fd5b600083013567ffffffffffffffff811115613a8f57600080fd5b613a9b85828601613875565b92509250509250929050565b600060208284031215613ab957600080fd5b6000613ac7848285016138bf565b91505092915050565b60008060008060008060808789031215613ae957600080fd5b6000613af789828a016138d4565b965050602087013567ffffffffffffffff811115613b1457600080fd5b613b2089828a016138e9565b9550955050604087013567ffffffffffffffff811115613b3f57600080fd5b613b4b89828a016138e9565b93509350506060613b5e89828a0161395d565b9150509295509295509295565b600060208284031215613b7d57600080fd5b6000613b8b84828501613933565b91505092915050565b60008060008060808587031215613baa57600080fd5b6000613bb887828801613948565b9450506020613bc987828801613948565b9350506040613bda87828801613860565b9250506060613beb87828801613948565b91505092959194509250565b613c0081614688565b82525050565b613c0f8161469a565b82525050565b6000613c2082614656565b613c2a818561466c565b9350613c3a818560208601614765565b80840191505092915050565b613c4f8161470b565b82525050565b613c5e8161472f565b82525050565b6000613c6f82614661565b613c798185614677565b9350613c89818560208601614765565b613c9281614798565b840191505092915050565b6000613caa602383614677565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d10602283614677565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d76601b83614677565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613db6601383614677565b91507f494e56414c49445f5a45524f5f414d4f554e54000000000000000000000000006000830152602082019050919050565b6000613df6602083614677565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000613e36601583614677565b91507f494e53554646494349454e545f434f4f4c444f574e00000000000000000000006000830152602082019050919050565b6000613e76602183614677565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613edc602e83614677565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613f42601583614677565b91507f4f4e4c595f454d495353494f4e5f4d414e4147455200000000000000000000006000830152602082019050919050565b6000613f82602183614677565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe8602583614677565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061404e601783614677565b91507f554e5354414b455f57494e444f575f46494e49534845440000000000000000006000830152602082019050919050565b600061408e602483614677565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f4602a83614677565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061415a601b83614677565b91507f494e56414c49445f42414c414e43455f4f4e5f434f4f4c444f574e00000000006000830152602082019050919050565b600061419a601f83614677565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b60006141da601f83614677565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b614216816146b8565b82525050565b61422581614753565b82525050565b614234816146f4565b82525050565b614243816146fe565b82525050565b60006142558284613c15565b915081905092915050565b60006020820190506142756000830184613bf7565b92915050565b60006060820190506142906000830186613bf7565b61429d6020830185613bf7565b6142aa604083018461422b565b949350505050565b60006060820190506142c76000830186613bf7565b6142d4602083018561420d565b6142e1604083018461420d565b949350505050565b60006040820190506142fe6000830185613bf7565b61430b602083018461422b565b9392505050565b60006020820190506143276000830184613c06565b92915050565b60006020820190506143426000830184613c46565b92915050565b600060208201905061435d6000830184613c55565b92915050565b6000602082019050818103600083015261437d8184613c64565b905092915050565b6000602082019050818103600083015261439e81613c9d565b9050919050565b600060208201905081810360008301526143be81613d03565b9050919050565b600060208201905081810360008301526143de81613d69565b9050919050565b600060208201905081810360008301526143fe81613da9565b9050919050565b6000602082019050818103600083015261441e81613de9565b9050919050565b6000602082019050818103600083015261443e81613e29565b9050919050565b6000602082019050818103600083015261445e81613e69565b9050919050565b6000602082019050818103600083015261447e81613ecf565b9050919050565b6000602082019050818103600083015261449e81613f35565b9050919050565b600060208201905081810360008301526144be81613f75565b9050919050565b600060208201905081810360008301526144de81613fdb565b9050919050565b600060208201905081810360008301526144fe81614041565b9050919050565b6000602082019050818103600083015261451e81614081565b9050919050565b6000602082019050818103600083015261453e816140e7565b9050919050565b6000602082019050818103600083015261455e8161414d565b9050919050565b6000602082019050818103600083015261457e8161418d565b9050919050565b6000602082019050818103600083015261459e816141cd565b9050919050565b60006020820190506145ba600083018461421c565b92915050565b60006040820190506145d5600083018561420d565b6145e2602083018461420d565b9392505050565b60006060820190506145fe600083018661420d565b61460b602083018561420d565b614618604083018461422b565b949350505050565b6000602082019050614635600083018461422b565b92915050565b6000602082019050614650600083018461423a565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000614693826146d4565b9050919050565b60008115159050919050565b60006146b182614688565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006147168261471d565b9050919050565b6000614728826146d4565b9050919050565b600061473a82614741565b9050919050565b600061474c826146d4565b9050919050565b600061475e826146b8565b9050919050565b60005b83811015614783578082015181840152602081019050614768565b83811115614792576000848401525b50505050565b6000601f19601f8301169050919050565b6147b281614688565b81146147bd57600080fd5b50565b6147c98161469a565b81146147d457600080fd5b50565b6147e0816146a6565b81146147eb57600080fd5b50565b6147f7816146b8565b811461480257600080fd5b50565b61480e816146f4565b811461481957600080fd5b50565b614825816146fe565b811461483057600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220370cc8f74b0cbfd1fe13c34bafd209542f5581a9853e2f038f3623475c9e365564736f6c634300060c0033

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

0000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db000000000000000000000000a9a933e0d816b36dbf7da87f27ac3bc4dcc2582e00000000000000000000000000000000000000000000000000000000000d2f00000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a3981100000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a39811000000000000000000000000000000000000000000000000000000000332b380

-----Decoded View---------------
Arg [0] : stakedToken (address): 0x7eaF9C89037e4814DC0d9952Ac7F888C784548DB
Arg [1] : rewardToken (address): 0xA9a933E0d816B36Dbf7Da87F27AC3BC4DCC2582E
Arg [2] : cooldownSeconds (uint256): 864000
Arg [3] : unstakeWindow (uint256): 172800
Arg [4] : rewardsVault (address): 0x35F8B9A3F0C5A08AF11ab6817E180ccA52A39811
Arg [5] : emissionManager (address): 0x35F8B9A3F0C5A08AF11ab6817E180ccA52A39811
Arg [6] : distributionDuration (uint128): 53654400

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eaf9c89037e4814dc0d9952ac7f888c784548db
Arg [1] : 000000000000000000000000a9a933e0d816b36dbf7da87f27ac3bc4dcc2582e
Arg [2] : 00000000000000000000000000000000000000000000000000000000000d2f00
Arg [3] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [4] : 00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a39811
Arg [5] : 00000000000000000000000035f8b9a3f0c5a08af11ab6817e180cca52a39811
Arg [6] : 000000000000000000000000000000000000000000000000000000000332b380


Deployed Bytecode Sourcemap

45770:611:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10940:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36198:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12699:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11387:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38832:998;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13194:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17064:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35749:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11236:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35156:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35961:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13797:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11541:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35831:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39957:236;;;:::i;:::-;;36138:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17139:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44897:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27687:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36093:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11085:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35790:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40355:521;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14263:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11916:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27783:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37893:785;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28448:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27735:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17488:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12355:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35706:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27826:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;43635:1111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37247:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37508:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10940:86;10986:13;11015:5;11008:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10940:86;:::o;36198:51::-;;;;;;;;;;;;;;;;;:::o;12699:159::-;12782:4;12795:39;12804:12;:10;:12::i;:::-;12818:7;12827:6;12795:8;:39::i;:::-;12848:4;12841:11;;12699:159;;;;:::o;11387:94::-;11440:7;11463:12;;11456:19;;11387:94;:::o;38832:998::-;38919:1;38909:6;:11;;38901:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38983:30;39016:16;:28;39033:10;39016:28;;;;;;;;;;;;;;;;38983:61;;39085:44;39112:16;39085:22;:26;;:44;;;;:::i;:::-;39067:15;:62;39051:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;39260:14;39191:65;39211:44;39238:16;39211:22;:26;;:44;;;;:::i;:::-;39191:15;:19;;:65;;;;:::i;:::-;:83;;39175:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;39322:30;39355:21;39365:10;39355:9;:21::i;:::-;39322:54;;39385:22;39420;39411:6;:31;39410:67;;39471:6;39410:67;;;39446:22;39410:67;39385:92;;39486:72;39517:10;39529:22;39553:4;39486:30;:72::i;:::-;;39567:33;39573:10;39585:14;39567:5;:33::i;:::-;39659:1;39613:42;39640:14;39613:22;:26;;:42;;;;:::i;:::-;:47;39609:102;;;39702:1;39671:16;:28;39688:10;39671:28;;;;;;;;;;;;;;;:32;;;;39609:102;39719:53;39753:2;39757:14;39726:12;39719:33;;;;:53;;;;;:::i;:::-;39805:2;39786:38;;39793:10;39786:38;;;39809:14;39786:38;;;;;;:::i;:::-;;;;;;;;38832:998;;;;;:::o;13194:355::-;13320:4;13333:36;13343:6;13351:9;13362:6;13333:9;:36::i;:::-;13376:149;13393:6;13408:12;:10;:12::i;:::-;13429:89;13467:6;13429:89;;;;;;;;;;;;;;;;;:11;:19;13441:6;13429:19;;;;;;;;;;;;;;;:33;13449:12;:10;:12::i;:::-;13429:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;13376:8;:149::i;:::-;13539:4;13532:11;;13194:355;;;;;:::o;17064:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35749:36::-;;;:::o;11236:86::-;11286:5;11307:9;;;;;;;;;;;11300:16;;11236:86;:::o;35156:130::-;35232:7;35255:6;:13;35262:5;35255:13;;;;;;;;;;;;;;;:19;;:25;35275:4;35255:25;;;;;;;;;;;;;;;;35248:32;;35156:130;;;;:::o;35961:39::-;;;:::o;13797:208::-;13885:4;13898:83;13907:12;:10;:12::i;:::-;13921:7;13930:50;13969:10;13930:11;:25;13942:12;:10;:12::i;:::-;13930:25;;;;;;;;;;;;;;;:34;13956:7;13930:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13898:8;:83::i;:::-;13995:4;13988:11;;13797:208;;;;:::o;11541:113::-;11607:7;11630:9;:18;11640:7;11630:18;;;;;;;;;;;;;;;;11623:25;;11541:113;;;:::o;35831:41::-;;;:::o;39957:236::-;40035:1;40010:21;40020:10;40010:9;:21::i;:::-;:26;;40002:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40138:15;40107:16;:28;40124:10;40107:28;;;;;;;;;;;;;;;:46;;;;40176:10;40167:20;;;;;;;;;;;;39957:236::o;36138:55::-;;;;;;;;;;;;;;;;;:::o;17139:52::-;;;;;;;;;;;;;;;;;:::o;44897:480::-;44968:7;44988:57;45093:1;45054:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44988:107;;45123:155;;;;;;;;45190:4;45123:155;;;;;;45218:17;45228:6;45218:9;:17::i;:::-;45123:155;;;;45257:13;:11;:13::i;:::-;45123:155;;;45102:15;45118:1;45102:18;;;;;;;;;;;;;:176;;;;45292:79;45325:45;45346:6;45354:15;45325:20;:45::i;:::-;45292:20;:28;45313:6;45292:28;;;;;;;;;;;;;;;;:32;;:79;;;;:::i;:::-;45285:86;;;44897:480;;;:::o;27687:41::-;;;:::o;36093:38::-;;;:::o;11085:90::-;11133:13;11162:7;11155:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11085:90;:::o;35790:36::-;;;:::o;40355:521::-;40430:23;40456:100;40495:10;40514:21;40524:10;40514:9;:21::i;:::-;40544:5;40456:30;:100::i;:::-;40430:126;;40563:21;40598:17;40588:6;:27;40587:56;;40637:6;40587:56;;;40619:15;40587:56;40563:80;;40687:52;40707:13;40687:52;;;;;;;;;;;;;;;;;:15;:19;;:52;;;;;:::i;:::-;40652:20;:32;40673:10;40652:32;;;;;;;;;;;;;;;:87;;;;40748:63;40778:13;40793:2;40797:13;40748:12;:29;;;;:63;;;;;;:::i;:::-;40852:2;40825:45;;40840:10;40825:45;;;40856:13;40825:45;;;;;;:::i;:::-;;;;;;;;40355:521;;;;:::o;14263:332::-;14371:4;14387:184;14404:12;:10;:12::i;:::-;14425:7;14441:123;14490:15;14441:123;;;;;;;;;;;;;;;;;:11;:25;14453:12;:10;:12::i;:::-;14441:25;;;;;;;;;;;;;;;:34;14467:7;14441:34;;;;;;;;;;;;;;;;:38;;:123;;;;;:::i;:::-;14387:8;:184::i;:::-;14585:4;14578:11;;14263:332;;;;:::o;11916:165::-;12002:4;12015:42;12025:12;:10;:12::i;:::-;12039:9;12050:6;12015:9;:42::i;:::-;12071:4;12064:11;;11916:165;;;;:::o;27783:36::-;27817:2;27783:36;:::o;37893:785::-;37987:1;37977:6;:11;;37969:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38019:21;38043;38053:10;38043:9;:21::i;:::-;38019:45;;38073:22;38098:116;38131:10;38158:4;38172:13;38194;:11;:13::i;:::-;38098:24;:116::i;:::-;38073:141;;38243:1;38225:14;:19;38221:185;;38260:42;38275:10;38287:14;38260:42;;;;;;;:::i;:::-;;;;;;;;38346:52;38383:14;38346:20;:32;38367:10;38346:32;;;;;;;;;;;;;;;;:36;;:52;;;;:::i;:::-;38311:20;:32;38332:10;38311:32;;;;;;;;;;;;;;;:87;;;;38221:185;38445:62;38470:1;38473:6;38481:10;38493:13;38445:24;:62::i;:::-;38414:16;:28;38431:10;38414:28;;;;;;;;;;;;;;;:93;;;;38516:25;38522:10;38534:6;38516:5;:25::i;:::-;38548:72;38586:10;38606:4;38613:6;38555:12;38548:37;;;;:72;;;;;;:::i;:::-;38653:10;38634:38;;38641:10;38634:38;;;38665:6;38634:38;;;;;;:::i;:::-;;;;;;;;37893:785;;;;:::o;28448:718::-;28585:16;28571:30;;:10;:30;;;28563:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28641:9;28636:525;28660:17;;:24;;28656:1;:28;28636:525;;;28700:29;28732:6;:44;28739:17;;28757:1;28739:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;28732:44;;;;;;;;;;;;;;;28700:76;;28787:146;28823:17;;28841:1;28823:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;28870:11;28892:17;;28910:1;28892:20;;;;;;;;;;;;:32;;;28787:25;:146::i;:::-;;28976:17;;28994:1;28976:20;;;;;;;;;;;;:38;;;;;;;;;;:::i;:::-;28944:11;:29;;;:70;;;;;;;;;;;;;;;;;;29059:17;;29077:1;29059:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;29030:123;;;29106:17;;29124:1;29106:20;;;;;;;;;;;;:38;;;;;;;;;;:::i;:::-;29030:123;;;;;;:::i;:::-;;;;;;;;28636:525;28686:3;;;;;;;28636:525;;;;28448:718;;:::o;27735:41::-;;;:::o;17488:36::-;;;;;;;;;;;;;:::o;12355:173::-;12469:7;12495:11;:18;12507:5;12495:18;;;;;;;;;;;;;;;:27;12514:7;12495:27;;;;;;;;;;;;;;;;12488:34;;12355:173;;;;:::o;35706:36::-;35741:1;35706:36;:::o;27826:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43635:1111::-;43809:7;43825:27;43855:16;:27;43872:9;43855:27;;;;;;;;;;;;;;;;43825:57;;43916:1;43893:19;:24;43889:55;;;43935:1;43928:8;;;;;43889:55;43952:37;43992:71;44042:14;43992:37;44012:16;43992:15;:19;;:37;;;;:::i;:::-;:41;;:71;;;;:::i;:::-;43952:111;;44108:19;44076:29;:51;44072:576;;;44160:1;44138:23;;44072:576;;;44184:29;44249:21;44217:29;:53;44216:115;;44310:21;44216:115;;;44283:15;44216:115;44184:147;;44370:19;44346:21;:43;44342:299;;;44409:19;44402:26;;;;;;;44342:299;44477:154;44600:30;44620:9;44600:15;:19;;:30;;;;:::i;:::-;44490:82;44537:34;44551:19;44537:9;:13;;:34;;;;:::i;:::-;44490:42;44510:21;44490:15;:19;;:42;;;;:::i;:::-;:46;;:82;;;;:::i;:::-;44477:122;;:154;;;;:::i;:::-;44455:176;;44072:576;;44721:19;44714:26;;;;43635:1111;;;;;;;:::o;37247:255::-;26053:16;26072:13;:11;:13::i;:::-;26053:32;;26129:23;;26118:8;:34;26096:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;26265:8;26239:23;:34;;;;37387:14:::1;37396:4;;37387:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:14::i;:::-;37408:18;37419:6;;37408:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:18::i;:::-;37433:22;37446:8;37433:12;:22::i;:::-;37462:34;37481:14;37462:18;:34::i;:::-;37247:255:::0;;;;;;;:::o;37508:379::-;37571:7;37586:30;37619:16;:22;37636:4;37619:22;;;;;;;;;;;;;;;;37586:55;;37670:44;37697:16;37670:22;:26;;:44;;;;:::i;:::-;37652:15;:62;37648:233;;;37732:1;37725:8;;;;;37648:233;37818:14;37749:65;37769:44;37796:16;37769:22;:26;;:44;;;;:::i;:::-;37749:15;:19;;:65;;;;:::i;:::-;:83;37745:136;;37850:1;37843:8;;;;;37745:136;37880:1;37873:8;;;37508:379;;;;:::o;5656:181::-;5714:7;5734:9;5750:1;5746;:5;5734:17;;5775:1;5770;:6;;5762:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5828:1;5821:8;;;5656:181;;;;:::o;3975:106::-;4028:15;4063:10;4056:17;;3975:106;:::o;15904:348::-;16039:1;16022:19;;:5;:19;;;;16014:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16116:1;16097:21;;:7;:21;;;;16089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16196:6;16166:11;:18;16178:5;16166:18;;;;;;;;;;;;;;;:27;16185:7;16166:27;;;;;;;;;;;;;;;:36;;;;16230:7;16214:32;;16223:5;16214:32;;;16239:6;16214:32;;;;;;:::i;:::-;;;;;;;;15904:348;;;:::o;6112:136::-;6170:7;6197:43;6201:1;6204;6197:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6190:50;;6112:136;;;;:::o;42245:584::-;42378:7;42394:22;42419:108;42452:4;42473;42487:11;42507:13;:11;:13::i;:::-;42419:24;:108::i;:::-;42394:133;;42534:24;42561:46;42592:14;42561:20;:26;42582:4;42561:26;;;;;;;;;;;;;;;;:30;;:46;;;;:::i;:::-;42534:73;;42638:1;42620:14;:19;42616:176;;42654:13;42650:85;;;42709:16;42680:20;:26;42701:4;42680:26;;;;;;;;;;;;;;;:45;;;;42650:85;42748:36;42763:4;42769:14;42748:36;;;;;;;:::i;:::-;;;;;;;;42616:176;42807:16;42800:23;;;;42245:584;;;;;:::o;15502:396::-;15601:1;15582:21;;:7;:21;;;;15574:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15650:49;15671:7;15688:1;15692:6;15650:20;:49::i;:::-;15729:68;15752:6;15729:68;;;;;;;;;;;;;;;;;:9;:18;15739:7;15729:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;15708:9;:18;15718:7;15708:18;;;;;;;;;;;;;;;:89;;;;15819:24;15836:6;15819:12;;:16;;:24;;;;:::i;:::-;15804:12;:39;;;;15881:1;15855:37;;15864:7;15855:37;;;15885:6;15855:37;;;;;;:::i;:::-;;;;;;;;15502:396;;:::o;23586:176::-;23669:85;23688:5;23718:23;;;23743:2;23747:5;23695:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23669:18;:85::i;:::-;23586:176;;;:::o;41085:805::-;41191:21;41215:15;41225:4;41215:9;:15::i;:::-;41191:39;;41252:57;41283:4;41289:13;41304:4;41252:30;:57::i;:::-;;41348:2;41340:10;;:4;:10;;;41336:507;;41361:19;41383:13;41393:2;41383:9;:13::i;:::-;41361:35;;41405:53;41436:2;41440:11;41453:4;41405:30;:53::i;:::-;;41469:30;41502:16;:22;41519:4;41502:22;;;;;;;;;;;;;;;;41469:55;;41556:73;41581:22;41605:6;41613:2;41617:11;41556:24;:73::i;:::-;41533:16;:20;41550:2;41533:20;;;;;;;;;;;;;;;:96;;;;41750:6;41733:13;:23;:54;;;;;41786:1;41760:22;:27;;41733:54;41729:107;;;41825:1;41800:16;:22;41817:4;41800:22;;;;;;;;;;;;;;;:26;;;;41729:107;41336:507;;;41851:33;41867:4;41873:2;41877:6;41851:15;:33::i;:::-;41085:805;;;;:::o;6543:226::-;6663:7;6696:1;6691;:6;;6699:12;6683:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6723:9;6739:1;6735;:5;6723:17;;6760:1;6753:8;;;6543:226;;;;;:::o;32476:678::-;32608:7;32627:22;32652:1;32627:26;;32667:9;32662:459;32686:6;:13;32682:1;:17;32662:459;;;32715:29;32747:6;:33;32754:6;32761:1;32754:9;;;;;;;;;;;;;;:25;;;32747:33;;;;;;;;;;;;;;;32715:65;;32789:18;32810:165;32835:11;:17;;;32863:11;:29;;;;;;;;;;;;32810:165;;32903:11;:31;;;;;;;;;;;;32945:6;32952:1;32945:9;;;;;;;;;;;;;;:21;;;32810:14;:165::i;:::-;32789:186;;33003:110;33032:72;33044:6;33051:1;33044:9;;;;;;;;;;;;;;:22;;;33068:10;33080:11;:17;;:23;33098:4;33080:23;;;;;;;;;;;;;;;;33032:11;:72::i;:::-;33003:14;:18;;:110;;;;:::i;:::-;32986:127;;32662:459;;32701:3;;;;;;;32662:459;;;;33134:14;33127:21;;;32476:678;;;;:::o;23770:204::-;23871:95;23890:5;23920:27;;;23949:4;23955:2;23959:5;23897:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23871:18;:95::i;:::-;23770:204;;;;:::o;30741:663::-;30890:7;30906:27;30936:6;:13;30943:5;30936:13;;;;;;;;;;;;;;;30906:43;;30956:17;30976:9;:15;;:21;30992:4;30976:21;;;;;;;;;;;;;;;;30956:41;;31004:22;31039:16;31058:56;31084:5;31091:9;31102:11;31058:25;:56::i;:::-;31039:75;;31140:8;31127:9;:21;31123:246;;31179:1;31163:12;:17;31159:107;;31210:46;31222:12;31236:8;31246:9;31210:11;:46::i;:::-;31193:63;;31159:107;31300:8;31276:9;:15;;:21;31292:4;31276:21;;;;;;;;;;;;;;;:32;;;;31345:5;31322:39;;31339:4;31322:39;;;31352:8;31322:39;;;;;;:::i;:::-;;;;;;;;31123:246;31384:14;31377:21;;;;;;30741:663;;;;;;:::o;15140:356::-;15239:1;15220:21;;:7;:21;;;;15212:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15286:49;15315:1;15319:7;15328:6;15286:20;:49::i;:::-;15359:24;15376:6;15359:12;;:16;;:24;;;;:::i;:::-;15344:12;:39;;;;15411:30;15434:6;15411:9;:18;15421:7;15411:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15390:9;:18;15400:7;15390:18;;;;;;;;;;;;;;;:51;;;;15474:7;15453:37;;15470:1;15453:37;;;15483:6;15453:37;;;;;;:::i;:::-;;;;;;;;15140:356;;:::o;29586:740::-;29736:7;29752:16;29771:11;:17;;;29752:36;;29795:27;29825:11;:31;;;;;;;;;;;;29795:61;;29888:19;29869:38;;:15;:38;29865:76;;;29925:8;29918:15;;;;;;29865:76;29949:16;29968:124;29991:8;30008:11;:29;;;;;;;;;;;;29968:124;;30046:19;30074:11;29968:14;:124::i;:::-;29949:143;;30117:8;30105;:20;30101:129;;30156:8;30136:11;:17;;:28;;;;30196:15;30178:44;;;30213:8;30178:44;;;;;;:::i;:::-;;;;;;;;30101:129;30280:15;30238:11;:31;;;:58;;;;;;;;;;;;;;;;;;30312:8;30305:15;;;;;29586:740;;;;;;:::o;7020:471::-;7078:7;7328:1;7323;:6;7319:47;;;7353:1;7346:8;;;;7319:47;7378:9;7394:1;7390;:5;7378:17;;7423:1;7418;7414;:5;;;;;;:10;7406:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;7482:1;7475:8;;;7020:471;;;;;:::o;7959:132::-;8017:7;8044:39;8048:1;8051;8044:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8037:46;;7959:132;;;;:::o;45487:92::-;45542:7;35741:1;45558:15;;45487:92;:::o;16258:78::-;16323:7;16315:5;:15;;;;;;;;;;;;:::i;:::-;;16258:78;:::o;16342:86::-;16413:9;16403:7;:19;;;;;;;;;;;;:::i;:::-;;16342:86;:::o;16434:::-;16503:11;16491:9;;:23;;;;;;;;;;;;;;;;;;16434:86;:::o;17728:126::-;17832:14;17814:15;;:32;;;;;;;;;;;;;;;;;;17728:126;:::o;19307:782::-;19420:2;19412:10;;:4;:10;;;19408:49;;;19439:7;;19408:49;19489:1;19473:18;;:4;:18;;;19469:179;;19508:19;19530:15;19540:4;19530:9;:15::i;:::-;19508:37;;19560:76;19575:4;19589:11;19611:23;19627:6;19611:11;:15;;:23;;;;:::i;:::-;19560:14;:76::i;:::-;19469:179;;19676:1;19662:16;;:2;:16;;;19658:167;;19695:17;19715:13;19725:2;19715:9;:13::i;:::-;19695:33;;19743:70;19758:2;19770:9;19790:21;19804:6;19790:9;:13;;:21;;;;:::i;:::-;19743:14;:70::i;:::-;19658:167;;19915:28;19946:15;;;;;;;;;;;19915:46;;20008:1;19976:34;;:14;:34;;;19972:110;;20027:14;:25;;;20053:4;20059:2;20063:6;20027:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19972:110;19307:782;;;;;:::o;24341:598::-;24429:27;24437:5;24429:25;;;:27::i;:::-;24421:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24566:12;24580:23;24615:5;24607:19;;24627:4;24607:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24565:67;;;;24651:7;24643:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;24732:1;24712:10;:17;:21;24708:224;;;24854:10;24843:30;;;;;;;;;;;;:::i;:::-;24835:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24708:224;24341:598;;;;:::o;14601:533::-;14741:1;14723:20;;:6;:20;;;;14715:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14821:1;14800:23;;:9;:23;;;;14792:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14872:47;14893:6;14901:9;14912:6;14872:20;:47::i;:::-;14948:71;14970:6;14948:71;;;;;;;;;;;;;;;;;:9;:17;14958:6;14948:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;14928:9;:17;14938:6;14928:17;;;;;;;;;;;;;;;:91;;;;15049:32;15074:6;15049:9;:20;15059:9;15049:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;15026:9;:20;15036:9;15026:20;;;;;;;;;;;;;;;:55;;;;15110:9;15093:35;;15102:6;15093:35;;;15121:6;15093:35;;;;;;:::i;:::-;;;;;;;;14601:533;;;:::o;34216:722::-;34388:7;34437:1;34416:17;:22;:50;;;;34465:1;34449:12;:17;34416:50;:99;;;;34500:15;34477:19;:38;;;34416:99;:149;;;;34549:16;34526:19;:39;;;;34416:149;34404:205;;;34589:12;34582:19;;;;34404:205;34617:24;34662:16;34644:15;:34;:85;;34714:15;34644:85;;;34688:16;34644:85;34617:112;;34736:17;34756:41;34777:19;34756:41;;:16;:20;;:41;;;;:::i;:::-;34736:61;;34818:114;34911:12;34818:78;34883:12;34818:60;27817:2;34859:18;;34855:2;:22;34818:32;34840:9;34818:17;:21;;:32;;;;:::i;:::-;:36;;:60;;;;:::i;:::-;:64;;:78;;;;:::i;:::-;:82;;:114;;;;:::i;:::-;34804:128;;;;34216:722;;;;;;;:::o;33508:245::-;33643:7;33666:81;27817:2;33728:18;;33724:2;:22;33666:53;33691:27;33708:9;33691:12;:16;;:27;;;;:::i;:::-;33666:20;:24;;:53;;;;:::i;:::-;:57;;:81;;;;:::i;:::-;33659:88;;33508:245;;;;;:::o;8579:379::-;8699:7;8798:1;8794;:5;8801:12;8786:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8825:9;8841:1;8837;:5;;;;;;8825:17;;8949:1;8942:8;;;8579:379;;;;;:::o;18128:801::-;18231:20;18262:12;18231:44;;18288:29;18320:16;:23;18337:5;18320:23;;;;;;;;;;;;;;;;18288:55;;18354:52;18409:10;:17;18420:5;18409:17;;;;;;;;;;;;;;;18354:72;;18524:1;18499:21;:26;;:102;;;;;18589:12;18529:72;;:14;:44;18544:28;18570:1;18544:21;:25;;:28;;;;:::i;:::-;18529:44;;;;;;;;;;;:56;;;;;;;;;;;;:72;;;18499:102;18495:370;;;18671:8;18618:14;:44;18633:28;18659:1;18633:21;:25;;:28;;;;:::i;:::-;18618:44;;;;;;;;;;;:50;;;:61;;;;;;;;;;;;;;;;;;18495:370;;;18752:32;;;;;;;;18761:12;18752:32;;;;;;18775:8;18752:32;;;;;18712:14;:37;18727:21;18712:37;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18825:28;18851:1;18825:21;:25;;:28;;;;:::i;:::-;18799:16;:23;18816:5;18799:23;;;;;;;;;;;;;;;:54;;;;18495:370;18882:39;18895:5;18902:8;18912;18882:39;;;;;;;;:::i;:::-;;;;;;;;18128:801;;;;;;:::o;20908:641::-;20968:4;21230:16;21257:19;21279:66;21257:88;;;;21461:7;21449:20;21437:32;;21510:11;21498:8;:23;;:42;;;;;21537:3;21525:15;;:8;:15;;21498:42;21490:51;;;;20908:641;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;194:388::-;;;360:3;353:4;345:6;341:17;337:27;327:2;;378:1;375;368:12;327:2;411:6;398:20;388:30;;438:18;430:6;427:30;424:2;;;470:1;467;460:12;424:2;504:4;496:6;492:17;480:29;;555:3;547:4;539:6;535:17;525:8;521:32;518:41;515:2;;;572:1;569;562:12;515:2;320:262;;;;;:::o;590:128::-;;671:6;665:13;656:22;;683:30;707:5;683:30;:::i;:::-;650:68;;;;:::o;725:172::-;;826:6;813:20;804:29;;838:54;886:5;838:54;:::i;:::-;798:99;;;;:::o;919:337::-;;;1034:3;1027:4;1019:6;1015:17;1011:27;1001:2;;1052:1;1049;1042:12;1001:2;1085:6;1072:20;1062:30;;1112:18;1104:6;1101:30;1098:2;;;1144:1;1141;1134:12;1098:2;1178:4;1170:6;1166:17;1154:29;;1229:3;1221:4;1213:6;1209:17;1199:8;1195:32;1192:41;1189:2;;;1246:1;1243;1236:12;1189:2;994:262;;;;;:::o;1264:130::-;;1344:6;1331:20;1322:29;;1356:33;1383:5;1356:33;:::i;:::-;1316:78;;;;:::o;1401:130::-;;1481:6;1468:20;1459:29;;1493:33;1520:5;1493:33;:::i;:::-;1453:78;;;;:::o;1538:126::-;;1616:6;1603:20;1594:29;;1628:31;1653:5;1628:31;:::i;:::-;1588:76;;;;:::o;1671:241::-;;1775:2;1763:9;1754:7;1750:23;1746:32;1743:2;;;1791:1;1788;1781:12;1743:2;1826:1;1843:53;1888:7;1879:6;1868:9;1864:22;1843:53;:::i;:::-;1833:63;;1805:97;1737:175;;;;:::o;1919:366::-;;;2040:2;2028:9;2019:7;2015:23;2011:32;2008:2;;;2056:1;2053;2046:12;2008:2;2091:1;2108:53;2153:7;2144:6;2133:9;2129:22;2108:53;:::i;:::-;2098:63;;2070:97;2198:2;2216:53;2261:7;2252:6;2241:9;2237:22;2216:53;:::i;:::-;2206:63;;2177:98;2002:283;;;;;:::o;2292:491::-;;;;2430:2;2418:9;2409:7;2405:23;2401:32;2398:2;;;2446:1;2443;2436:12;2398:2;2481:1;2498:53;2543:7;2534:6;2523:9;2519:22;2498:53;:::i;:::-;2488:63;;2460:97;2588:2;2606:53;2651:7;2642:6;2631:9;2627:22;2606:53;:::i;:::-;2596:63;;2567:98;2696:2;2714:53;2759:7;2750:6;2739:9;2735:22;2714:53;:::i;:::-;2704:63;;2675:98;2392:391;;;;;:::o;2790:366::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2927:1;2924;2917:12;2879:2;2962:1;2979:53;3024:7;3015:6;3004:9;3000:22;2979:53;:::i;:::-;2969:63;;2941:97;3069:2;3087:53;3132:7;3123:6;3112:9;3108:22;3087:53;:::i;:::-;3077:63;;3048:98;2873:283;;;;;:::o;3163:469::-;;;3338:2;3326:9;3317:7;3313:23;3309:32;3306:2;;;3354:1;3351;3344:12;3306:2;3417:1;3406:9;3402:17;3389:31;3440:18;3432:6;3429:30;3426:2;;;3472:1;3469;3462:12;3426:2;3500:116;3608:7;3599:6;3588:9;3584:22;3500:116;:::i;:::-;3482:134;;;;3368:254;3300:332;;;;;:::o;3639:257::-;;3751:2;3739:9;3730:7;3726:23;3722:32;3719:2;;;3767:1;3764;3757:12;3719:2;3802:1;3819:61;3872:7;3863:6;3852:9;3848:22;3819:61;:::i;:::-;3809:71;;3781:105;3713:183;;;;:::o;3903:907::-;;;;;;;4117:3;4105:9;4096:7;4092:23;4088:33;4085:2;;;4134:1;4131;4124:12;4085:2;4169:1;4186:74;4252:7;4243:6;4232:9;4228:22;4186:74;:::i;:::-;4176:84;;4148:118;4325:2;4314:9;4310:18;4297:32;4349:18;4341:6;4338:30;4335:2;;;4381:1;4378;4371:12;4335:2;4409:65;4466:7;4457:6;4446:9;4442:22;4409:65;:::i;:::-;4391:83;;;;4276:204;4539:2;4528:9;4524:18;4511:32;4563:18;4555:6;4552:30;4549:2;;;4595:1;4592;4585:12;4549:2;4623:65;4680:7;4671:6;4660:9;4656:22;4623:65;:::i;:::-;4605:83;;;;4490:204;4725:2;4743:51;4786:7;4777:6;4766:9;4762:22;4743:51;:::i;:::-;4733:61;;4704:96;4079:731;;;;;;;;:::o;4817:241::-;;4921:2;4909:9;4900:7;4896:23;4892:32;4889:2;;;4937:1;4934;4927:12;4889:2;4972:1;4989:53;5034:7;5025:6;5014:9;5010:22;4989:53;:::i;:::-;4979:63;;4951:97;4883:175;;;;:::o;5065:617::-;;;;;5220:3;5208:9;5199:7;5195:23;5191:33;5188:2;;;5237:1;5234;5227:12;5188:2;5272:1;5289:53;5334:7;5325:6;5314:9;5310:22;5289:53;:::i;:::-;5279:63;;5251:97;5379:2;5397:53;5442:7;5433:6;5422:9;5418:22;5397:53;:::i;:::-;5387:63;;5358:98;5487:2;5505:53;5550:7;5541:6;5530:9;5526:22;5505:53;:::i;:::-;5495:63;;5466:98;5595:2;5613:53;5658:7;5649:6;5638:9;5634:22;5613:53;:::i;:::-;5603:63;;5574:98;5182:500;;;;;;;:::o;5689:113::-;5772:24;5790:5;5772:24;:::i;:::-;5767:3;5760:37;5754:48;;:::o;5809:104::-;5886:21;5901:5;5886:21;:::i;:::-;5881:3;5874:34;5868:45;;:::o;5920:356::-;;6048:38;6080:5;6048:38;:::i;:::-;6098:88;6179:6;6174:3;6098:88;:::i;:::-;6091:95;;6191:52;6236:6;6231:3;6224:4;6217:5;6213:16;6191:52;:::i;:::-;6264:6;6259:3;6255:16;6248:23;;6028:248;;;;;:::o;6283:152::-;6379:50;6423:5;6379:50;:::i;:::-;6374:3;6367:63;6361:74;;:::o;6442:168::-;6546:58;6598:5;6546:58;:::i;:::-;6541:3;6534:71;6528:82;;:::o;6617:347::-;;6729:39;6762:5;6729:39;:::i;:::-;6780:71;6844:6;6839:3;6780:71;:::i;:::-;6773:78;;6856:52;6901:6;6896:3;6889:4;6882:5;6878:16;6856:52;:::i;:::-;6929:29;6951:6;6929:29;:::i;:::-;6924:3;6920:39;6913:46;;6709:255;;;;;:::o;6972:372::-;;7132:67;7196:2;7191:3;7132:67;:::i;:::-;7125:74;;7232:34;7228:1;7223:3;7219:11;7212:55;7301:5;7296:2;7291:3;7287:12;7280:27;7335:2;7330:3;7326:12;7319:19;;7118:226;;;:::o;7353:371::-;;7513:67;7577:2;7572:3;7513:67;:::i;:::-;7506:74;;7613:34;7609:1;7604:3;7600:11;7593:55;7682:4;7677:2;7672:3;7668:12;7661:26;7715:2;7710:3;7706:12;7699:19;;7499:225;;;:::o;7733:327::-;;7893:67;7957:2;7952:3;7893:67;:::i;:::-;7886:74;;7993:29;7989:1;7984:3;7980:11;7973:50;8051:2;8046:3;8042:12;8035:19;;7879:181;;;:::o;8069:319::-;;8229:67;8293:2;8288:3;8229:67;:::i;:::-;8222:74;;8329:21;8325:1;8320:3;8316:11;8309:42;8379:2;8374:3;8370:12;8363:19;;8215:173;;;:::o;8397:332::-;;8557:67;8621:2;8616:3;8557:67;:::i;:::-;8550:74;;8657:34;8653:1;8648:3;8644:11;8637:55;8720:2;8715:3;8711:12;8704:19;;8543:186;;;:::o;8738:321::-;;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8998:23;8994:1;8989:3;8985:11;8978:44;9050:2;9045:3;9041:12;9034:19;;8884:175;;;:::o;9068:370::-;;9228:67;9292:2;9287:3;9228:67;:::i;:::-;9221:74;;9328:34;9324:1;9319:3;9315:11;9308:55;9397:3;9392:2;9387:3;9383:12;9376:25;9429:2;9424:3;9420:12;9413:19;;9214:224;;;:::o;9447:383::-;;9607:67;9671:2;9666:3;9607:67;:::i;:::-;9600:74;;9707:34;9703:1;9698:3;9694:11;9687:55;9776:16;9771:2;9766:3;9762:12;9755:38;9821:2;9816:3;9812:12;9805:19;;9593:237;;;:::o;9839:321::-;;9999:67;10063:2;10058:3;9999:67;:::i;:::-;9992:74;;10099:23;10095:1;10090:3;10086:11;10079:44;10151:2;10146:3;10142:12;10135:19;;9985:175;;;:::o;10169:370::-;;10329:67;10393:2;10388:3;10329:67;:::i;:::-;10322:74;;10429:34;10425:1;10420:3;10416:11;10409:55;10498:3;10493:2;10488:3;10484:12;10477:25;10530:2;10525:3;10521:12;10514:19;;10315:224;;;:::o;10548:374::-;;10708:67;10772:2;10767:3;10708:67;:::i;:::-;10701:74;;10808:34;10804:1;10799:3;10795:11;10788:55;10877:7;10872:2;10867:3;10863:12;10856:29;10913:2;10908:3;10904:12;10897:19;;10694:228;;;:::o;10931:323::-;;11091:67;11155:2;11150:3;11091:67;:::i;:::-;11084:74;;11191:25;11187:1;11182:3;11178:11;11171:46;11245:2;11240:3;11236:12;11229:19;;11077:177;;;:::o;11263:373::-;;11423:67;11487:2;11482:3;11423:67;:::i;:::-;11416:74;;11523:34;11519:1;11514:3;11510:11;11503:55;11592:6;11587:2;11582:3;11578:12;11571:28;11627:2;11622:3;11618:12;11611:19;;11409:227;;;:::o;11645:379::-;;11805:67;11869:2;11864:3;11805:67;:::i;:::-;11798:74;;11905:34;11901:1;11896:3;11892:11;11885:55;11974:12;11969:2;11964:3;11960:12;11953:34;12015:2;12010:3;12006:12;11999:19;;11791:233;;;:::o;12033:327::-;;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12293:29;12289:1;12284:3;12280:11;12273:50;12351:2;12346:3;12342:12;12335:19;;12179:181;;;:::o;12369:331::-;;12529:67;12593:2;12588:3;12529:67;:::i;:::-;12522:74;;12629:33;12625:1;12620:3;12616:11;12609:54;12691:2;12686:3;12682:12;12675:19;;12515:185;;;:::o;12709:331::-;;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12969:33;12965:1;12960:3;12956:11;12949:54;13031:2;13026:3;13022:12;13015:19;;12855:185;;;:::o;13048:113::-;13131:24;13149:5;13131:24;:::i;:::-;13126:3;13119:37;13113:48;;:::o;13168:126::-;13251:37;13282:5;13251:37;:::i;:::-;13246:3;13239:50;13233:61;;:::o;13301:113::-;13384:24;13402:5;13384:24;:::i;:::-;13379:3;13372:37;13366:48;;:::o;13421:107::-;13500:22;13516:5;13500:22;:::i;:::-;13495:3;13488:35;13482:46;;:::o;13535:271::-;;13688:93;13777:3;13768:6;13688:93;:::i;:::-;13681:100;;13798:3;13791:10;;13669:137;;;;:::o;13813:222::-;;13940:2;13929:9;13925:18;13917:26;;13954:71;14022:1;14011:9;14007:17;13998:6;13954:71;:::i;:::-;13911:124;;;;:::o;14042:444::-;;14225:2;14214:9;14210:18;14202:26;;14239:71;14307:1;14296:9;14292:17;14283:6;14239:71;:::i;:::-;14321:72;14389:2;14378:9;14374:18;14365:6;14321:72;:::i;:::-;14404;14472:2;14461:9;14457:18;14448:6;14404:72;:::i;:::-;14196:290;;;;;;:::o;14493:444::-;;14676:2;14665:9;14661:18;14653:26;;14690:71;14758:1;14747:9;14743:17;14734:6;14690:71;:::i;:::-;14772:72;14840:2;14829:9;14825:18;14816:6;14772:72;:::i;:::-;14855;14923:2;14912:9;14908:18;14899:6;14855:72;:::i;:::-;14647:290;;;;;;:::o;14944:333::-;;15099:2;15088:9;15084:18;15076:26;;15113:71;15181:1;15170:9;15166:17;15157:6;15113:71;:::i;:::-;15195:72;15263:2;15252:9;15248:18;15239:6;15195:72;:::i;:::-;15070:207;;;;;:::o;15284:210::-;;15405:2;15394:9;15390:18;15382:26;;15419:65;15481:1;15470:9;15466:17;15457:6;15419:65;:::i;:::-;15376:118;;;;:::o;15501:248::-;;15641:2;15630:9;15626:18;15618:26;;15655:84;15736:1;15725:9;15721:17;15712:6;15655:84;:::i;:::-;15612:137;;;;:::o;15756:264::-;;15904:2;15893:9;15889:18;15881:26;;15918:92;16007:1;15996:9;15992:17;15983:6;15918:92;:::i;:::-;15875:145;;;;:::o;16027:310::-;;16174:2;16163:9;16159:18;16151:26;;16224:9;16218:4;16214:20;16210:1;16199:9;16195:17;16188:47;16249:78;16322:4;16313:6;16249:78;:::i;:::-;16241:86;;16145:192;;;;:::o;16344:416::-;;16544:2;16533:9;16529:18;16521:26;;16594:9;16588:4;16584:20;16580:1;16569:9;16565:17;16558:47;16619:131;16745:4;16619:131;:::i;:::-;16611:139;;16515:245;;;:::o;16767:416::-;;16967:2;16956:9;16952:18;16944:26;;17017:9;17011:4;17007:20;17003:1;16992:9;16988:17;16981:47;17042:131;17168:4;17042:131;:::i;:::-;17034:139;;16938:245;;;:::o;17190:416::-;;17390:2;17379:9;17375:18;17367:26;;17440:9;17434:4;17430:20;17426:1;17415:9;17411:17;17404:47;17465:131;17591:4;17465:131;:::i;:::-;17457:139;;17361:245;;;:::o;17613:416::-;;17813:2;17802:9;17798:18;17790:26;;17863:9;17857:4;17853:20;17849:1;17838:9;17834:17;17827:47;17888:131;18014:4;17888:131;:::i;:::-;17880:139;;17784:245;;;:::o;18036:416::-;;18236:2;18225:9;18221:18;18213:26;;18286:9;18280:4;18276:20;18272:1;18261:9;18257:17;18250:47;18311:131;18437:4;18311:131;:::i;:::-;18303:139;;18207:245;;;:::o;18459:416::-;;18659:2;18648:9;18644:18;18636:26;;18709:9;18703:4;18699:20;18695:1;18684:9;18680:17;18673:47;18734:131;18860:4;18734:131;:::i;:::-;18726:139;;18630:245;;;:::o;18882:416::-;;19082:2;19071:9;19067:18;19059:26;;19132:9;19126:4;19122:20;19118:1;19107:9;19103:17;19096:47;19157:131;19283:4;19157:131;:::i;:::-;19149:139;;19053:245;;;:::o;19305:416::-;;19505:2;19494:9;19490:18;19482:26;;19555:9;19549:4;19545:20;19541:1;19530:9;19526:17;19519:47;19580:131;19706:4;19580:131;:::i;:::-;19572:139;;19476:245;;;:::o;19728:416::-;;19928:2;19917:9;19913:18;19905:26;;19978:9;19972:4;19968:20;19964:1;19953:9;19949:17;19942:47;20003:131;20129:4;20003:131;:::i;:::-;19995:139;;19899:245;;;:::o;20151:416::-;;20351:2;20340:9;20336:18;20328:26;;20401:9;20395:4;20391:20;20387:1;20376:9;20372:17;20365:47;20426:131;20552:4;20426:131;:::i;:::-;20418:139;;20322:245;;;:::o;20574:416::-;;20774:2;20763:9;20759:18;20751:26;;20824:9;20818:4;20814:20;20810:1;20799:9;20795:17;20788:47;20849:131;20975:4;20849:131;:::i;:::-;20841:139;;20745:245;;;:::o;20997:416::-;;21197:2;21186:9;21182:18;21174:26;;21247:9;21241:4;21237:20;21233:1;21222:9;21218:17;21211:47;21272:131;21398:4;21272:131;:::i;:::-;21264:139;;21168:245;;;:::o;21420:416::-;;21620:2;21609:9;21605:18;21597:26;;21670:9;21664:4;21660:20;21656:1;21645:9;21641:17;21634:47;21695:131;21821:4;21695:131;:::i;:::-;21687:139;;21591:245;;;:::o;21843:416::-;;22043:2;22032:9;22028:18;22020:26;;22093:9;22087:4;22083:20;22079:1;22068:9;22064:17;22057:47;22118:131;22244:4;22118:131;:::i;:::-;22110:139;;22014:245;;;:::o;22266:416::-;;22466:2;22455:9;22451:18;22443:26;;22516:9;22510:4;22506:20;22502:1;22491:9;22487:17;22480:47;22541:131;22667:4;22541:131;:::i;:::-;22533:139;;22437:245;;;:::o;22689:416::-;;22889:2;22878:9;22874:18;22866:26;;22939:9;22933:4;22929:20;22925:1;22914:9;22910:17;22903:47;22964:131;23090:4;22964:131;:::i;:::-;22956:139;;22860:245;;;:::o;23112:416::-;;23312:2;23301:9;23297:18;23289:26;;23362:9;23356:4;23352:20;23348:1;23337:9;23333:17;23326:47;23387:131;23513:4;23387:131;:::i;:::-;23379:139;;23283:245;;;:::o;23535:222::-;;23662:2;23651:9;23647:18;23639:26;;23676:71;23744:1;23733:9;23729:17;23720:6;23676:71;:::i;:::-;23633:124;;;;:::o;23764:333::-;;23919:2;23908:9;23904:18;23896:26;;23933:71;24001:1;23990:9;23986:17;23977:6;23933:71;:::i;:::-;24015:72;24083:2;24072:9;24068:18;24059:6;24015:72;:::i;:::-;23890:207;;;;;:::o;24104:444::-;;24287:2;24276:9;24272:18;24264:26;;24301:71;24369:1;24358:9;24354:17;24345:6;24301:71;:::i;:::-;24383:72;24451:2;24440:9;24436:18;24427:6;24383:72;:::i;:::-;24466;24534:2;24523:9;24519:18;24510:6;24466:72;:::i;:::-;24258:290;;;;;;:::o;24555:222::-;;24682:2;24671:9;24667:18;24659:26;;24696:71;24764:1;24753:9;24749:17;24740:6;24696:71;:::i;:::-;24653:124;;;;:::o;24784:214::-;;24907:2;24896:9;24892:18;24884:26;;24921:67;24985:1;24974:9;24970:17;24961:6;24921:67;:::i;:::-;24878:120;;;;:::o;25005:121::-;;25098:5;25092:12;25082:22;;25063:63;;;:::o;25133:122::-;;25227:5;25221:12;25211:22;;25192:63;;;:::o;25263:144::-;;25398:3;25383:18;;25376:31;;;;:::o;25416:163::-;;25531:6;25526:3;25519:19;25568:4;25563:3;25559:14;25544:29;;25512:67;;;;:::o;25587:91::-;;25649:24;25667:5;25649:24;:::i;:::-;25638:35;;25632:46;;;:::o;25685:85::-;;25758:5;25751:13;25744:21;25733:32;;25727:43;;;:::o;25777:112::-;;25860:24;25878:5;25860:24;:::i;:::-;25849:35;;25843:46;;;:::o;25896:113::-;;25969:34;25962:5;25958:46;25947:57;;25941:68;;;:::o;26016:121::-;;26089:42;26082:5;26078:54;26067:65;;26061:76;;;:::o;26144:72::-;;26206:5;26195:16;;26189:27;;;:::o;26223:81::-;;26294:4;26287:5;26283:16;26272:27;;26266:38;;;:::o;26311:147::-;;26403:50;26447:5;26403:50;:::i;:::-;26390:63;;26384:74;;;:::o;26465:121::-;;26557:24;26575:5;26557:24;:::i;:::-;26544:37;;26538:48;;;:::o;26593:163::-;;26693:58;26745:5;26693:58;:::i;:::-;26680:71;;26674:82;;;:::o;26763:129::-;;26863:24;26881:5;26863:24;:::i;:::-;26850:37;;26844:48;;;:::o;26899:108::-;;26978:24;26996:5;26978:24;:::i;:::-;26965:37;;26959:48;;;:::o;27015:268::-;27080:1;27087:101;27101:6;27098:1;27095:13;27087:101;;;27177:1;27172:3;27168:11;27162:18;27158:1;27153:3;27149:11;27142:39;27123:2;27120:1;27116:10;27111:15;;27087:101;;;27203:6;27200:1;27197:13;27194:2;;;27268:1;27259:6;27254:3;27250:16;27243:27;27194:2;27064:219;;;;:::o;27291:97::-;;27379:2;27375:7;27370:2;27363:5;27359:14;27355:28;27345:38;;27339:49;;;:::o;27396:117::-;27465:24;27483:5;27465:24;:::i;:::-;27458:5;27455:35;27445:2;;27504:1;27501;27494:12;27445:2;27439:74;:::o;27520:111::-;27586:21;27601:5;27586:21;:::i;:::-;27579:5;27576:32;27566:2;;27622:1;27619;27612:12;27566:2;27560:71;:::o;27638:159::-;27728:45;27767:5;27728:45;:::i;:::-;27721:5;27718:56;27708:2;;27788:1;27785;27778:12;27708:2;27702:95;:::o;27804:117::-;27873:24;27891:5;27873:24;:::i;:::-;27866:5;27863:35;27853:2;;27912:1;27909;27902:12;27853:2;27847:74;:::o;27928:117::-;27997:24;28015:5;27997:24;:::i;:::-;27990:5;27987:35;27977:2;;28036:1;28033;28026:12;27977:2;27971:74;:::o;28052:113::-;28119:22;28135:5;28119:22;:::i;:::-;28112:5;28109:33;28099:2;;28156:1;28153;28146:12;28099:2;28093:72;:::o

Swarm Source

ipfs://370cc8f74b0cbfd1fe13c34bafd209542f5581a9853e2f038f3623475c9e3655
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.