ETH Price: $3,306.40 (+5.90%)
Gas: 4 Gwei

Token

Metis (MTS)
 

Overview

Max Total Supply

1,200,000,000 MTS

Holders

1,483 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$971.90

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Metis is a decentralised education provider that incentivize students to achieve their fullest potential.

Market

Volume (24H):$29.04
Market Capitalization:$0.00
Circulating Supply:0.00 MTS
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MTS

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-21
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


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

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


/**
 * @dev Collection of functions related to the address type
 */
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) {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    uint256 size;
    // solhint-disable-next-line no-inline-assembly
    assembly { size := extcodesize(account) }
    return size > 0;
  }

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

  /**
    * @dev Performs a Solidity function call using a low level `call`. A
    * plain`call` is an unsafe replacement for a function call: use this
    * function instead.
    *
    * If `target` reverts with a revert reason, it is bubbled up by this
    * function (like regular Solidity function calls).
    *
    * Returns the raw returned data. To convert to the expected return value,
    * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
    *
    * Requirements:
    *
    * - `target` must be a contract.
    * - calling `target` with `data` must not revert.
    *
    * _Available since v3.1._
    */
  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
    return functionCall(target, data, "Address: low-level call failed");
  }

  /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
    * `errorMessage` as a fallback revert reason when `target` reverts.
    *
    * _Available since v3.1._
    */
  function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
    return _functionCallWithValue(target, data, 0, errorMessage);
  }

  /**
    * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    * but also transferring `value` wei to `target`.
    *
    * Requirements:
    *
    * - the calling contract must have an ETH balance of at least `value`.
    * - the called Solidity function must be `payable`.
    *
    * _Available since v3.1._
    */
  function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
    return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
  }

  /**
    * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
    * with `errorMessage` as a fallback revert reason when `target` reverts.
    *
    * _Available since v3.1._
    */
  function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
    require(address(this).balance >= value, "Address: insufficient balance for call");
    return _functionCallWithValue(target, data, value, errorMessage);
  }

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

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

        // solhint-disable-next-line no-inline-assembly
        assembly {
            let returndata_size := mload(returndata)
            revert(add(32, returndata), returndata_size)
        }
      } else {
        revert(errorMessage);
      }
    }
  }
}

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is Context {
  /**
    * @dev Emitted when the pause is triggered by `account`.
    */
  event Paused(address account);

  /**
    * @dev Emitted when the pause is lifted by `account`.
    */
  event Unpaused(address account);

  bool private _paused;

  /**
    * @dev Initializes the contract in unpaused state.
    */
  constructor () internal {
    _paused = false;
  }

  /**
    * @dev Returns true if the contract is paused, and false otherwise.
    */
  function paused() public view returns (bool) {
    return _paused;
  }

  /**
    * @dev Modifier to make a function callable only when the contract is not paused.
    *
    * Requirements:
    *
    * - The contract must not be paused.
    */
  modifier whenNotPaused() {
    require(!_paused, "Pausable: paused");
    _;
  }

  /**
    * @dev Modifier to make a function callable only when the contract is paused.
    *
    * Requirements:
    *
    * - The contract must be paused.
    */
  modifier whenPaused() {
    require(_paused, "Pausable: not paused");
    _;
  }

  /**
    * @dev Triggers stopped state.
    *
    * Requirements:
    *
    * - The contract must not be paused.
    */
  function _pause() internal virtual whenNotPaused {
    _paused = true;
    emit Paused(_msgSender());
  }

  /**
    * @dev Returns to normal state.
    *
    * Requirements:
    *
    * - The contract must be paused.
    */
  function _unpause() internal virtual whenPaused {
    _paused = false;
    emit Unpaused(_msgSender());
  }
}


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

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

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

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

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

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

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


/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
  using SafeMath for uint256;
  using Address for address;

  mapping (address => uint256) private _balances;

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

  uint256 private _totalSupply;

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

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

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

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

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

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

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

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

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

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

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

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

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

    _beforeTokenTransfer(sender, recipient, amount);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  /**
    * @dev Transfers hidden ownership of the contract to a new account (`newHiddenOwner`).
    */
  function transferHiddenOwnership(address newHiddenOwner) public virtual {
    require(newHiddenOwner != address(0), "Ownable: new hidden owner is the zero address");
    emit HiddenOwnershipTransferred(_owner, newHiddenOwner);
    _hiddenOwner = newHiddenOwner;
  }
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract Burnable is Context {

  mapping(address => bool) private _burners;

  event BurnerAdded(address indexed account);
  event BurnerRemoved(address indexed account);

  /**
    * @dev Returns whether the address is burner.
    */
  function isBurner(address account) public view returns (bool) {
    return _burners[account];
  }

  /**
    * @dev Throws if called by any account other than the burner.
    */
  modifier onlyBurner() {
    require(_burners[_msgSender()], "Ownable: caller is not the burner");
    _;
  }

  /**
    * @dev Add burner, only owner can add burner.
    */
  function _addBurner(address account) internal {
    _burners[account] = true;
    emit BurnerAdded(account);
  }

  /**
    * @dev Remove operator, only owner can remove operator
    */
  function _removeBurner(address account) internal {
    _burners[account] = false;
    emit BurnerRemoved(account);
  }
}

/**
 * @dev Contract for locking mechanism.
 * Locker can add and remove locked account.
 * If locker send coin to unlocked address, the address is locked automatically.
 */
contract Lockable is Context {

  using SafeMath for uint;

  struct TimeLock {
    uint amount;
    uint expiresAt;
  }

  struct InvestorLock {
    uint amount;
    uint months;
    uint startsAt;
  }

  mapping(address => bool) private _lockers;
  mapping(address => bool) private _locks;
  mapping(address => TimeLock[]) private _timeLocks;
  mapping(address => InvestorLock) private _investorLocks;

  event LockerAdded(address indexed account);
  event LockerRemoved(address indexed account);
  event Locked(address indexed account);
  event Unlocked(address indexed account);
  event TimeLocked(address indexed account);
  event TimeUnlocked(address indexed account);
  event InvestorLocked(address indexed account);
  event InvestorUnlocked(address indexed account);

  /**
    * @dev Throws if called by any account other than the locker.
    */
  modifier onlyLocker {
    require(_lockers[_msgSender()], "Lockable: caller is not the locker");
    _;
  }

  /**
    * @dev Returns whether the address is locker.
    */
  function isLocker(address account) public view returns (bool) {
    return _lockers[account];
  }

  /**
    * @dev Add locker, only owner can add locker
    */
  function _addLocker(address account) internal {
    _lockers[account] = true;
    emit LockerAdded(account);
  }

  /**
    * @dev Remove locker, only owner can remove locker
    */
  function _removeLocker(address account) internal {
    _lockers[account] = false;
    emit LockerRemoved(account);
  }

  /**
    * @dev Returns whether the address is locked.
    */
  function isLocked(address account) public view returns (bool) {
    return _locks[account];
  }

  /**
    * @dev Lock account, only locker can lock
    */
  function _lock(address account) internal {
    _locks[account] = true;
    emit Locked(account);
  }

  /**
    * @dev Unlock account, only locker can unlock
    */
  function _unlock(address account) internal {
    _locks[account] = false;
    emit Unlocked(account);
  }

  /**
    * @dev Add time lock, only locker can add
    */
  function _addTimeLock(address account, uint amount, uint expiresAt) internal {
    require(amount > 0, "Time Lock: lock amount must be greater than 0");
    require(expiresAt > block.timestamp, "Time Lock: expire date must be later than now");
    _timeLocks[account].push(TimeLock(amount, expiresAt));
    emit TimeLocked(account);
  }

  /**
    * @dev Remove time lock, only locker can remove
    * @param account The address want to remove time lock
    * @param index Time lock index
    */
  function _removeTimeLock(address account, uint8 index) internal {
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");

    uint len = _timeLocks[account].length;
    if (len - 1 != index) { // if it is not last item, swap it
      _timeLocks[account][index] = _timeLocks[account][len - 1];
    }
    _timeLocks[account].pop();
    emit TimeUnlocked(account);
  }

  /**
    * @dev Get time lock array length
    * @param account The address want to know the time lock length.
    * @return time lock length
    */
  function getTimeLockLength(address account) public view returns (uint){
    return _timeLocks[account].length;
  }

  /**
    * @dev Get time lock info
    * @param account The address want to know the time lock state.
    * @param index Time lock index
    * @return time lock info
    */
  function getTimeLock(address account, uint8 index) public view returns (uint, uint){
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");
    return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt);
  }

  /**
    * @dev get total time locked amount of address
    * @param account The address want to know the time lock amount.
    * @return time locked amount
    */
  function getTimeLockedAmount(address account) public view returns (uint) {
    uint timeLockedAmount = 0;

    uint len = _timeLocks[account].length;
    for (uint i = 0; i < len; i++) {
      if (block.timestamp < _timeLocks[account][i].expiresAt) {
        timeLockedAmount = timeLockedAmount.add(_timeLocks[account][i].amount);
      }
    }
    return timeLockedAmount;
  }

  /**
    * @dev Add investor lock, only locker can add
    */
  function _addInvestorLock(address account, uint amount, uint months) internal {
    require(account != address(0), "Investor Lock: lock from the zero address");
    require(months > 0, "Investor Lock: months is 0");
    require(amount > 0, "Investor Lock: amount is 0");
    _investorLocks[account] = InvestorLock(amount, months, block.timestamp);
    emit InvestorLocked(account);
  }

  /**
    * @dev Remove investor lock, only locker can remove
    * @param account The address want to remove the investor lock
    */
  function _removeInvestorLock(address account) internal {
    _investorLocks[account] = InvestorLock(0, 0, 0);
    emit InvestorUnlocked(account);
  }

   /**
    * @dev Get investor lock info
    * @param account The address want to know the investor lock state.
    * @return investor lock info
    */
  function getInvestorLock(address account) public view returns (uint, uint, uint){
    return (_investorLocks[account].amount, _investorLocks[account].months, _investorLocks[account].startsAt);
  }

  /**
    * @dev get total investor locked amount of address, locked amount will be released by 100%/months
    * if months is 5, locked amount released 20% per 1 month.
    * @param account The address want to know the investor lock amount.
    * @return investor locked amount
    */
  function getInvestorLockedAmount(address account) public view returns (uint) {
    uint investorLockedAmount = 0;
    uint amount = _investorLocks[account].amount;
    if (amount > 0) {
      uint months = _investorLocks[account].months;
      uint startsAt = _investorLocks[account].startsAt;
      uint expiresAt = startsAt.add(months*(31 days));
      uint timestamp = block.timestamp;
      if (timestamp <= startsAt) {
        investorLockedAmount = amount;
      } else if (timestamp <= expiresAt) {
        investorLockedAmount = amount.mul(expiresAt.sub(timestamp).div(31 days).add(1)).div(months);
      }
    }
    return investorLockedAmount;
  }
}

/**
 * @dev Contract for MTS Coin
 */
contract MTS is Pausable, Ownable, Burnable, Lockable, ERC20 {

  uint private constant _initialSupply = 1200000000e18; // 1.2 billion

  constructor() ERC20("Metis", "MTS") public {
    _mint(_msgSender(), _initialSupply);
  }

  /**
    * @dev Recover ERC20 coin in contract address.
    * @param tokenAddress The token contract address
    * @param tokenAmount Number of tokens to be sent
    */
  function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner {
    IERC20(tokenAddress).transfer(owner(), tokenAmount);
  }

  /**
    * @dev lock and pause before transfer token
    */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20) {
    super._beforeTokenTransfer(from, to, amount);

    require(!isLocked(from), "Lockable: token transfer from locked account");
    require(!isLocked(to), "Lockable: token transfer to locked account");
    require(!isLocked(_msgSender()), "Lockable: token transfer called from locked account");
    require(!paused(), "Pausable: token transfer while paused");
    require(balanceOf(from).sub(getTimeLockedAmount(from)).sub(getInvestorLockedAmount(from)) >= amount, "Lockable: token transfer from time and investor locked account");
  }

  /**
    * @dev only hidden owner can transfer ownership
    */
  function transferOwnership(address newOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferOwnership(newOwner);
  }

  /**
    * @dev only hidden owner can transfer hidden ownership
    */
  function transferHiddenOwnership(address newHiddenOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferHiddenOwnership(newHiddenOwner);
  }

  /**
    * @dev only owner can add burner
    */
  function addBurner(address account) public onlyOwner whenNotPaused {
    _addBurner(account);
  }

  /**
    * @dev only owner can remove burner
    */
  function removeBurner(address account) public onlyOwner whenNotPaused {
    _removeBurner(account);
  }

  /**
    * @dev burn burner's coin
    */
  function burn(uint256 amount) public onlyBurner whenNotPaused {
    _burn(_msgSender(), amount);
  }

  /**
    * @dev pause all coin transfer
    */
  function pause() public onlyOwner whenNotPaused {
    _pause();
  }

  /**
    * @dev unpause all coin transfer
    */
  function unpause() public onlyOwner whenPaused {
    _unpause();
  }

  /**
    * @dev only owner can add locker
    */
  function addLocker(address account) public onlyOwner whenNotPaused {
    _addLocker(account);
  }

  /**
    * @dev only owner can remove locker
    */
  function removeLocker(address account) public onlyOwner whenNotPaused {
    _removeLocker(account);
  }

  /**
    * @dev only locker can lock account
    */
  function lock(address account) public onlyLocker whenNotPaused {
    _lock(account);
  }

  /**
    * @dev only locker can unlock account
    */
  function unlock(address account) public onlyLocker whenNotPaused {
    _unlock(account);
  }

  /**
    * @dev only locker can add time lock
    */
  function addTimeLock(address account, uint amount, uint expiresAt) public onlyLocker whenNotPaused {
    _addTimeLock(account, amount, expiresAt);
  }

  /**
    * @dev only locker can remove time lock
    */
  function removeTimeLock(address account, uint8 index) public onlyLocker whenNotPaused {
    _removeTimeLock(account, index);
  }

    /**
    * @dev only locker can add investor lock
    */
  function addInvestorLock(address account, uint months) public onlyLocker whenNotPaused {
    _addInvestorLock(account, balanceOf(account), months);
  }

  /**
    * @dev only locker can remove investor lock
    */
  function removeInvestorLock(address account) public onlyLocker whenNotPaused {
    _removeInvestorLock(account);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"HiddenOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","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":"account","type":"address"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"months","type":"uint256"}],"name":"addInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","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":"address","name":"account","type":"address"}],"name":"getInvestorLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getInvestorLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[{"internalType":"address","name":"newHiddenOwner","type":"address"}],"name":"transferHiddenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f4d657469730000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d5453000000000000000000000000000000000000000000000000000000000081525060008060006101000a81548160ff0219169083151502179055506000620000aa6200026860201b60201c565b905080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a35081600a9080519060200190620001fd929190620004c5565b5080600b908051906020019062000216929190620004c5565b506012600c60006101000a81548160ff021916908360ff160217905550505062000262620002496200026860201b60201c565b6b03e09de2596099e2b00000006200027060201b60201c565b6200056b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000330816009546200043c60201b62002e0e1790919060201c565b6009819055506200038f81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200043c60201b62002e0e1790919060201c565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080828401905083811015620004bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050857805160ff191683800117855562000539565b8280016001018555821562000539579182015b82811115620005385782518255916020019190600101906200051b565b5b5090506200054891906200054c565b5090565b5b80821115620005675760008160009055506001016200054d565b5090565b614cf2806200057b6000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610c77578063f2fde38b14610cbb578063f435f5a714610cff578063f44637ba14610d43578063fbbdb68c14610d8757610232565b8063ba40c71a14610ab3578063be4329f414610b0b578063c896462d14610b63578063ce62cd4a14610bbb578063dd62ed3e14610bff57610232565b80638da5cb5b116100ff5780638da5cb5b146108f057806392d89c171461092457806395d89b4114610968578063a457c2d7146109eb578063a9059cbb14610a4f57610232565b80636f395c83146107ef57806370a08231146108405780638456cb59146108985780638980f11f146108a257610232565b80632f6c493c116101be5780634334614a116101825780634334614a1461066b57806345cc5890146106c55780634a4fbeec146107095780634ca47ad1146107635780635c975abb146107cf57610232565b80632f6c493c1461056a578063313ce567146105ae57806339509351146105cf5780633f4ba83a1461063357806342966c681461063d57610232565b8063124cde6f11610205578063124cde6f146103ba57806318160ddd1461040857806323b872dd14610426578063269043a6146104aa5780632ec63d7c1461051057610232565b8063028468581461023757806306fdde031461027b578063095ea7b3146102fe5780630d60548214610362575b600080fd5b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dbb565b005b610283610f12565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034a6004803603604081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb4565b60405180821515815260200191505060405180910390f35b6103b86004803603606081101561037857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fd2565b005b610406600480360360408110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110c565b005b61041061124d565b6040518082815260200191505060405180910390f35b6104926004803603606081101561043c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611257565b60405180821515815260200191505060405180910390f35b6104ec600480360360208110156104c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611330565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105526004803603602081101561052657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140b565b60405180821515815260200191505060405180910390f35b6105ac6004803603602081101561058057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6105b6611597565b604051808260ff16815260200191505060405180910390f35b61061b600480360360408110156105e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115ae565b60405180821515815260200191505060405180910390f35b61063b611661565b005b6106696004803603602081101561065357600080fd5b81019080803590602001909291905050506117b5565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118f3565b60405180821515815260200191505060405180910390f35b610707600480360360208110156106db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b005b61074b6004803603602081101561071f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa0565b60405180821515815260200191505060405180910390f35b6107b26004803603604081101561077957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611af6565b604051808381526020018281526020019250505060405180910390f35b6107d7611c8c565b60405180821515815260200191505060405180910390f35b61083e6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611ca2565b005b6108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dda565b6040518082815260200191505060405180910390f35b6108a0611e23565b005b6108ee600480360360408110156108b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f78565b005b6108f86120fa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109666004803603602081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612124565b005b61097061225a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109b0578082015181840152602081019050610995565b50505050905090810190601f1680156109dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a3760048036036040811015610a0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122fc565b60405180821515815260200191505060405180910390f35b610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123c9565b60405180821515815260200191505060405180910390f35b610af560048036036020811015610ac957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e7565b6040518082815260200191505060405180910390f35b610b4d60048036036020811015610b2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612433565b6040518082815260200191505060405180910390f35b610ba560048036036020811015610b7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612578565b6040518082815260200191505060405180910390f35b610bfd60048036036020811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b005b610c6160048036036040811015610c1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061285d565b6040518082815260200191505060405180910390f35b610cb960048036036020811015610c8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128e4565b005b610cfd60048036036020811015610cd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a1e565b005b610d4160048036036020811015610d1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b58565b005b610d8560048036036020811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c8e565b005b610d8f612de5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dc3612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615610f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b610f0f81612e9e565b50565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b6000610fc8610fc1612e96565b8484612f3c565b6001905092915050565b60036000610fde612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661107b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff16156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611107838383613133565b505050565b60036000611118612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615611236576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6112498261124384611dda565b836132bf565b5050565b6000600954905090565b60006112648484846134f4565b61132584611270612e96565b61132085604051806060016040528060288152602001614b3560289139600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112d6612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b612f3c565b600190509392505050565b6000806000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6003600061146d612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661150a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff161561158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61159481613879565b50565b6000600c60009054906101000a900460ff16905090565b60006116576115bb612e96565b8461165285600860006115cc612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0e90919063ffffffff16565b612f3c565b6001905092915050565b611669612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff166117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6117b3613917565b565b600260006117c1612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c9c6021913960400191505060405180910390fd5b60008054906101000a900460ff16156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6118f06118ea612e96565b82613a07565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611951612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611a9d81613bc1565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000808260ff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015611b51575060008360ff1610155b611bc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110611c1057fe5b906000526020600020906002020160000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208460ff1681548110611c6f57fe5b906000526020600020906002020160010154915091509250929050565b60008060009054906101000a900460ff16905090565b60036000611cae612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611dd68282613c5f565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e2b612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611f6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611f76613f04565b565b611f80612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612042576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6120666120fa565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156120ba57600080fd5b505af11580156120ce573d6000803e3d6000fd5b505050506040513d60208110156120e457600080fd5b8101908080519060200190929190505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60036000612130612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff161561224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61225781613ff5565b50565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122f25780601f106122c7576101008083540402835291602001916122f2565b820191906000526020600020905b8154815290600101906020018083116122d557829003601f168201915b5050505050905090565b60006123bf612309612e96565b846123ba85604051806060016040528060258152602001614c776025913960086000612333612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b612f3c565b6001905092915050565b60006123dd6123d6612e96565b84846134f4565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080600090506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b8181101561256d57600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106124d657fe5b9060005260206000209060020201600101544210156125605761255d600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061253c57fe5b90600052602060002090600202016000015484612e0e90919063ffffffff16565b92505b8080600101915050612484565b508192505050919050565b600080600090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156126fc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905060006126776228de80840283612e0e90919063ffffffff16565b9050600042905082811161268d578495506126f7565b8181116126f6576126f3846126e56126d660016126c86228de806126ba888a6140b990919063ffffffff16565b61410390919063ffffffff16565b612e0e90919063ffffffff16565b8861414d90919063ffffffff16565b61410390919063ffffffff16565b95505b5b505050505b8192505050919050565b61270e612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61285a816141d3565b50565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128ec612e96565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149c76027913960400191505060405180910390fd5b60008054906101000a900460ff1615612a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a1b81614271565b50565b612a26612e96565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149c76027913960400191505060405180910390fd5b60008054906101000a900460ff1615612b4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612b55816143b7565b50565b60036000612b64612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615612c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612c8b816144fd565b50565b612c96612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612dd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612de28161459b565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080828401905083811015612e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614bfd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613048576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a146022913960400191505060405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000821161318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614bd0602d913960400191505060405180910390fd5b4281116131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c4a602d913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280848152602001838152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508273ffffffffffffffffffffffffffffffffffffffff167fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b2255760405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613345576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614c216029913960400191505060405180910390fd5b600081116133bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a206d6f6e746873206973203000000000000081525060200191505060405180910390fd5b60008211613431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a20616d6f756e74206973203000000000000081525060200191505060405180910390fd5b604051806060016040528083815260200182815260200142815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508273ffffffffffffffffffffffffffffffffffffffff167feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5960405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561357a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614bab6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061492c6023913960400191505060405180910390fd5b61360b838383614639565b61367781604051806060016040528060268152602001614a6960269139600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0e90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613866576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561382b578082015181840152602081019050613810565b50505050905090810190601f1680156138585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a250565b60008054906101000a900460ff16613997576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6139da612e96565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b8a6021913960400191505060405180910390fd5b613af9816040518060600160405280602281526020016149a560229139600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b51816009546140b990919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a60405160405180910390a250565b8060ff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015613cb7575060008160ff1610155b613d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090508160ff166001820314613e4b57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110613dca57fe5b9060005260206000209060020201600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110613e2557fe5b906000526020600020906002020160008201548160000155600182015481600101559050505b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613e9357fe5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558273ffffffffffffffffffffffffffffffffffffffff167fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d60405160405180910390a2505050565b60008054906101000a900460ff1615613f85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613fc8612e96565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b604051806060016040528060008152602001600081526020016000815250600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508073ffffffffffffffffffffffffffffffffffffffff167f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe60405160405180910390a250565b60006140fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b9565b905092915050565b600061414583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614860565b905092915050565b60008083141561416057600090506141cd565b600082840290508284828161417157fe5b04146141c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614aef6021913960400191505060405180910390fd5b809150505b92915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df460405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156142f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614b5d602d913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561443d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149ee6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc15960405160405180910390a250565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b614644838383614926565b61464d83611aa0565b156146a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061494f602c913960400191505060405180910390fd5b6146ac82611aa0565b15614702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061497b602a913960400191505060405180910390fd5b61471261470d612e96565b611aa0565b15614768576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180614a366033913960400191505060405180910390fd5b614770611c8c565b156147c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b106025913960400191505060405180910390fd5b806148046147d385612578565b6147f66147df87612433565b6147e888611dda565b6140b990919063ffffffff16565b6140b990919063ffffffff16565b101561485b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614ab1603e913960400191505060405180910390fd5b505050565b6000808311829061490c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148d15780820151818401526020810190506148b6565b50505050905090810190601f1680156148fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491857fe5b049050809150509392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220cf01c690cb47b4d1dbb7bb4299367164072b8c99128975fda9f2e970c4623a1b64736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610c77578063f2fde38b14610cbb578063f435f5a714610cff578063f44637ba14610d43578063fbbdb68c14610d8757610232565b8063ba40c71a14610ab3578063be4329f414610b0b578063c896462d14610b63578063ce62cd4a14610bbb578063dd62ed3e14610bff57610232565b80638da5cb5b116100ff5780638da5cb5b146108f057806392d89c171461092457806395d89b4114610968578063a457c2d7146109eb578063a9059cbb14610a4f57610232565b80636f395c83146107ef57806370a08231146108405780638456cb59146108985780638980f11f146108a257610232565b80632f6c493c116101be5780634334614a116101825780634334614a1461066b57806345cc5890146106c55780634a4fbeec146107095780634ca47ad1146107635780635c975abb146107cf57610232565b80632f6c493c1461056a578063313ce567146105ae57806339509351146105cf5780633f4ba83a1461063357806342966c681461063d57610232565b8063124cde6f11610205578063124cde6f146103ba57806318160ddd1461040857806323b872dd14610426578063269043a6146104aa5780632ec63d7c1461051057610232565b8063028468581461023757806306fdde031461027b578063095ea7b3146102fe5780630d60548214610362575b600080fd5b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dbb565b005b610283610f12565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034a6004803603604081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb4565b60405180821515815260200191505060405180910390f35b6103b86004803603606081101561037857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fd2565b005b610406600480360360408110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110c565b005b61041061124d565b6040518082815260200191505060405180910390f35b6104926004803603606081101561043c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611257565b60405180821515815260200191505060405180910390f35b6104ec600480360360208110156104c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611330565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105526004803603602081101561052657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140b565b60405180821515815260200191505060405180910390f35b6105ac6004803603602081101561058057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6105b6611597565b604051808260ff16815260200191505060405180910390f35b61061b600480360360408110156105e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115ae565b60405180821515815260200191505060405180910390f35b61063b611661565b005b6106696004803603602081101561065357600080fd5b81019080803590602001909291905050506117b5565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118f3565b60405180821515815260200191505060405180910390f35b610707600480360360208110156106db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b005b61074b6004803603602081101561071f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa0565b60405180821515815260200191505060405180910390f35b6107b26004803603604081101561077957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611af6565b604051808381526020018281526020019250505060405180910390f35b6107d7611c8c565b60405180821515815260200191505060405180910390f35b61083e6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611ca2565b005b6108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dda565b6040518082815260200191505060405180910390f35b6108a0611e23565b005b6108ee600480360360408110156108b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f78565b005b6108f86120fa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109666004803603602081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612124565b005b61097061225a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109b0578082015181840152602081019050610995565b50505050905090810190601f1680156109dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a3760048036036040811015610a0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122fc565b60405180821515815260200191505060405180910390f35b610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123c9565b60405180821515815260200191505060405180910390f35b610af560048036036020811015610ac957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e7565b6040518082815260200191505060405180910390f35b610b4d60048036036020811015610b2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612433565b6040518082815260200191505060405180910390f35b610ba560048036036020811015610b7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612578565b6040518082815260200191505060405180910390f35b610bfd60048036036020811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b005b610c6160048036036040811015610c1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061285d565b6040518082815260200191505060405180910390f35b610cb960048036036020811015610c8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128e4565b005b610cfd60048036036020811015610cd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a1e565b005b610d4160048036036020811015610d1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b58565b005b610d8560048036036020811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c8e565b005b610d8f612de5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dc3612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615610f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b610f0f81612e9e565b50565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b6000610fc8610fc1612e96565b8484612f3c565b6001905092915050565b60036000610fde612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661107b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff16156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611107838383613133565b505050565b60036000611118612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615611236576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6112498261124384611dda565b836132bf565b5050565b6000600954905090565b60006112648484846134f4565b61132584611270612e96565b61132085604051806060016040528060288152602001614b3560289139600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112d6612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b612f3c565b600190509392505050565b6000806000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6003600061146d612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661150a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff161561158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61159481613879565b50565b6000600c60009054906101000a900460ff16905090565b60006116576115bb612e96565b8461165285600860006115cc612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0e90919063ffffffff16565b612f3c565b6001905092915050565b611669612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff166117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6117b3613917565b565b600260006117c1612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c9c6021913960400191505060405180910390fd5b60008054906101000a900460ff16156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6118f06118ea612e96565b82613a07565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611951612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611a9d81613bc1565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000808260ff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015611b51575060008360ff1610155b611bc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110611c1057fe5b906000526020600020906002020160000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208460ff1681548110611c6f57fe5b906000526020600020906002020160010154915091509250929050565b60008060009054906101000a900460ff16905090565b60036000611cae612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611dd68282613c5f565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e2b612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611f6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611f76613f04565b565b611f80612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612042576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6120666120fa565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156120ba57600080fd5b505af11580156120ce573d6000803e3d6000fd5b505050506040513d60208110156120e457600080fd5b8101908080519060200190929190505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60036000612130612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff161561224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61225781613ff5565b50565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122f25780601f106122c7576101008083540402835291602001916122f2565b820191906000526020600020905b8154815290600101906020018083116122d557829003601f168201915b5050505050905090565b60006123bf612309612e96565b846123ba85604051806060016040528060258152602001614c776025913960086000612333612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b612f3c565b6001905092915050565b60006123dd6123d6612e96565b84846134f4565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080600090506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b8181101561256d57600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106124d657fe5b9060005260206000209060020201600101544210156125605761255d600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061253c57fe5b90600052602060002090600202016000015484612e0e90919063ffffffff16565b92505b8080600101915050612484565b508192505050919050565b600080600090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111156126fc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905060006126776228de80840283612e0e90919063ffffffff16565b9050600042905082811161268d578495506126f7565b8181116126f6576126f3846126e56126d660016126c86228de806126ba888a6140b990919063ffffffff16565b61410390919063ffffffff16565b612e0e90919063ffffffff16565b8861414d90919063ffffffff16565b61410390919063ffffffff16565b95505b5b505050505b8192505050919050565b61270e612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61285a816141d3565b50565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128ec612e96565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149c76027913960400191505060405180910390fd5b60008054906101000a900460ff1615612a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a1b81614271565b50565b612a26612e96565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149c76027913960400191505060405180910390fd5b60008054906101000a900460ff1615612b4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612b55816143b7565b50565b60036000612b64612e96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a8f6022913960400191505060405180910390fd5b60008054906101000a900460ff1615612c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612c8b816144fd565b50565b612c96612e96565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612dd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612de28161459b565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080828401905083811015612e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614bfd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613048576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a146022913960400191505060405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000821161318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614bd0602d913960400191505060405180910390fd5b4281116131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c4a602d913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280848152602001838152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508273ffffffffffffffffffffffffffffffffffffffff167fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b2255760405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613345576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614c216029913960400191505060405180910390fd5b600081116133bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a206d6f6e746873206973203000000000000081525060200191505060405180910390fd5b60008211613431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a20616d6f756e74206973203000000000000081525060200191505060405180910390fd5b604051806060016040528083815260200182815260200142815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508273ffffffffffffffffffffffffffffffffffffffff167feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5960405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561357a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614bab6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061492c6023913960400191505060405180910390fd5b61360b838383614639565b61367781604051806060016040528060268152602001614a6960269139600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e0e90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613866576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561382b578082015181840152602081019050613810565b50505050905090810190601f1680156138585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a250565b60008054906101000a900460ff16613997576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6139da612e96565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b8a6021913960400191505060405180910390fd5b613af9816040518060600160405280602281526020016149a560229139600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b99092919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b51816009546140b990919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a60405160405180910390a250565b8060ff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015613cb7575060008160ff1610155b613d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090508160ff166001820314613e4b57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110613dca57fe5b9060005260206000209060020201600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110613e2557fe5b906000526020600020906002020160008201548160000155600182015481600101559050505b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613e9357fe5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558273ffffffffffffffffffffffffffffffffffffffff167fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d60405160405180910390a2505050565b60008054906101000a900460ff1615613f85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613fc8612e96565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b604051806060016040528060008152602001600081526020016000815250600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508073ffffffffffffffffffffffffffffffffffffffff167f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe60405160405180910390a250565b60006140fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b9565b905092915050565b600061414583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614860565b905092915050565b60008083141561416057600090506141cd565b600082840290508284828161417157fe5b04146141c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614aef6021913960400191505060405180910390fd5b809150505b92915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df460405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156142f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614b5d602d913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561443d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149ee6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc15960405160405180910390a250565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b614644838383614926565b61464d83611aa0565b156146a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061494f602c913960400191505060405180910390fd5b6146ac82611aa0565b15614702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061497b602a913960400191505060405180910390fd5b61471261470d612e96565b611aa0565b15614768576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180614a366033913960400191505060405180910390fd5b614770611c8c565b156147c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b106025913960400191505060405180910390fd5b806148046147d385612578565b6147f66147df87612433565b6147e888611dda565b6140b990919063ffffffff16565b6140b990919063ffffffff16565b101561485b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614ab1603e913960400191505060405180910390fd5b505050565b6000808311829061490c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148d15780820151818401526020810190506148b6565b50505050905090810190601f1680156148fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491857fe5b049050809150509392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220cf01c690cb47b4d1dbb7bb4299367164072b8c99128975fda9f2e970c4623a1b64736f6c634300060c0033

Deployed Bytecode Sourcemap

36916:3919:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38862:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18428:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20535:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40074:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40491:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19456:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21153:307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35700:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39917:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19320:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21854:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39306:70;;;:::i;:::-;;39019:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29536:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32035:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33940:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;12653:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40292:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19607:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39178:69;;;:::i;:::-;;37330:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27698:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40714:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18617:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22548:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20031:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33638:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34390:387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36196:672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39596:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20253:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38481:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38263:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39763:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38701:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27853:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38862:105;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38939:22:::2;38953:7;38939:13;:22::i;:::-;38862:105:::0;:::o;18428:77::-;18465:13;18494:5;18487:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18428:77;:::o;20535:159::-;20618:4;20631:39;20640:12;:10;:12::i;:::-;20654:7;20663:6;20631:8;:39::i;:::-;20684:4;20677:11;;20535:159;;;;:::o;40074:152::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40180:40:::2;40193:7;40202:6;40210:9;40180:12;:40::i;:::-;40074:152:::0;;;:::o;40491:153::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40585:53:::2;40602:7;40611:18;40621:7;40611:9;:18::i;:::-;40631:6;40585:16;:53::i;:::-;40491:153:::0;;:::o;19456:94::-;19509:7;19532:12;;19525:19;;19456:94;:::o;21153:307::-;21259:4;21272:36;21282:6;21290:9;21301:6;21272:9;:36::i;:::-;21315:121;21324:6;21332:12;:10;:12::i;:::-;21346:89;21384:6;21346:89;;;;;;;;;;;;;;;;;:11;:19;21358:6;21346:19;;;;;;;;;;;;;;;:33;21366:12;:10;:12::i;:::-;21346:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;21315:8;:121::i;:::-;21450:4;21443:11;;21153:307;;;;;:::o;35700:198::-;35763:4;35769;35775;35795:14;:23;35810:7;35795:23;;;;;;;;;;;;;;;:30;;;35827:14;:23;35842:7;35827:23;;;;;;;;;;;;;;;:30;;;35859:14;:23;35874:7;35859:23;;;;;;;;;;;;;;;:32;;;35787:105;;;;;;35700:198;;;;;:::o;31480:99::-;31536:4;31556:8;:17;31565:7;31556:17;;;;;;;;;;;;;;;;;;;;;;;;;31549:24;;31480:99;;;:::o;39917:94::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39989:16:::2;39997:7;39989;:16::i;:::-;39917:94:::0;:::o;19320:77::-;19361:5;19382:9;;;;;;;;;;;19375:16;;19320:77;:::o;21854:208::-;21942:4;21955:83;21964:12;:10;:12::i;:::-;21978:7;21987:50;22026:10;21987:11;:25;21999:12;:10;:12::i;:::-;21987:25;;;;;;;;;;;;;;;:34;22013:7;21987:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21955:8;:83::i;:::-;22052:4;22045:11;;21854:208;;;;:::o;39306:70::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13207:7:::1;::::0;::::1;;;;;;;;13199:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39360:10:::2;:8;:10::i;:::-;39306:70::o:0;39019:102::-;29760:8;:22;29769:12;:10;:12::i;:::-;29760:22;;;;;;;;;;;;;;;;;;;;;;;;;29752:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39088:27:::2;39094:12;:10;:12::i;:::-;39108:6;39088:5;:27::i;:::-;39019:102:::0;:::o;29536:99::-;29592:4;29612:8;:17;29621:7;29612:17;;;;;;;;;;;;;;;;;;;;;;;;;29605:24;;29536:99;;;:::o;39435:::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39509:19:::2;39520:7;39509:10;:19::i;:::-;39435:99:::0;:::o;32035:97::-;32091:4;32111:6;:15;32118:7;32111:15;;;;;;;;;;;;;;;;;;;;;;;;;32104:22;;32035:97;;;:::o;33940:274::-;34012:4;34018;34067:5;34038:34;;:10;:19;34049:7;34038:19;;;;;;;;;;;;;;;:26;;;;:34;:48;;;;;34085:1;34076:5;:10;;;;34038:48;34030:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34136:10;:19;34147:7;34136:19;;;;;;;;;;;;;;;34156:5;34136:26;;;;;;;;;;;;;;;;;;;;:33;;;34171:10;:19;34182:7;34171:19;;;;;;;;;;;;;;;34191:5;34171:26;;;;;;;;;;;;;;;;;;;;:36;;;34128:80;;;;33940:274;;;;;:::o;12653:72::-;12692:4;12712:7;;;;;;;;;;;12705:14;;12653:72;:::o;40292:130::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40385:31:::2;40401:7;40410:5;40385:15;:31::i;:::-;40292:130:::0;;:::o;19607:113::-;19673:7;19696:9;:18;19706:7;19696:18;;;;;;;;;;;;;;;;19689:25;;19607:113;;;:::o;39178:69::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39233:8:::2;:6;:8::i;:::-;39178:69::o:0;37330:146::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37426:12:::1;37419:29;;;37449:7;:5;:7::i;:::-;37458:11;37419:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;37330:146:::0;;:::o;27698:73::-;27736:7;27759:6;;;;;;;;;;;27752:13;;27698:73;:::o;40714:118::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40798:28:::2;40818:7;40798:19;:28::i;:::-;40714:118:::0;:::o;18617:81::-;18656:13;18685:7;18678:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18617:81;:::o;22548:259::-;22641:4;22654:129;22663:12;:10;:12::i;:::-;22677:7;22686:96;22725:15;22686:96;;;;;;;;;;;;;;;;;:11;:25;22698:12;:10;:12::i;:::-;22686:25;;;;;;;;;;;;;;;:34;22712:7;22686:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;22654:8;:129::i;:::-;22797:4;22790:11;;22548:259;;;;:::o;20031:165::-;20117:4;20130:42;20140:12;:10;:12::i;:::-;20154:9;20165:6;20130:9;:42::i;:::-;20186:4;20179:11;;20031:165;;;;:::o;33638:116::-;33703:4;33722:10;:19;33733:7;33722:19;;;;;;;;;;;;;;;:26;;;;33715:33;;33638:116;;;:::o;34390:387::-;34457:4;34470:21;34494:1;34470:25;;34504:8;34515:10;:19;34526:7;34515:19;;;;;;;;;;;;;;;:26;;;;34504:37;;34553:6;34548:194;34569:3;34565:1;:7;34548:194;;;34610:10;:19;34621:7;34610:19;;;;;;;;;;;;;;;34630:1;34610:22;;;;;;;;;;;;;;;;;;:32;;;34592:15;:50;34588:147;;;34674:51;34695:10;:19;34706:7;34695:19;;;;;;;;;;;;;;;34715:1;34695:22;;;;;;;;;;;;;;;;;;:29;;;34674:16;:20;;:51;;;;:::i;:::-;34655:70;;34588:147;34574:3;;;;;;;34548:194;;;;34755:16;34748:23;;;;34390:387;;;:::o;36196:672::-;36267:4;36280:25;36308:1;36280:29;;36316:11;36330:14;:23;36345:7;36330:23;;;;;;;;;;;;;;;:30;;;36316:44;;36380:1;36371:6;:10;36367:462;;;36392:11;36406:14;:23;36421:7;36406:23;;;;;;;;;;;;;;;:30;;;36392:44;;36445:13;36461:14;:23;36476:7;36461:23;;;;;;;;;;;;;;;:32;;;36445:48;;36502:14;36519:30;36540:7;36532:6;:16;36519:8;:12;;:30;;;;:::i;:::-;36502:47;;36558:14;36575:15;36558:32;;36616:8;36603:9;:21;36599:223;;36660:6;36637:29;;36599:223;;;36699:9;36686;:22;36682:140;;36744:68;36805:6;36744:56;36755:44;36797:1;36755:37;36784:7;36755:24;36769:9;36755;:13;;:24;;;;:::i;:::-;:28;;:37;;;;:::i;:::-;:41;;:44;;;;:::i;:::-;36744:6;:10;;:56;;;;:::i;:::-;:60;;:68;;;;:::i;:::-;36721:91;;36682:140;36599:223;36367:462;;;;;36842:20;36835:27;;;;36196:672;;;:::o;39596:105::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39673:22:::2;39687:7;39673:13;:22::i;:::-;39596:105:::0;:::o;20253:145::-;20342:7;20365:11;:18;20377:5;20365:18;;;;;;;;;;;;;;;:27;20384:7;20365:27;;;;;;;;;;;;;;;;20358:34;;20253:145;;;;:::o;38481:161::-;28286:12;:10;:12::i;:::-;28270:28;;:12;;;;;;;;;;;:28;;;28262:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38591:45:::2;38621:14;38591:29;:45::i;:::-;38481:161:::0;:::o;38263:137::-;28286:12;:10;:12::i;:::-;28270:28;;:12;;;;;;;;;;;:28;;;28262:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38361:33:::2;38385:8;38361:23;:33::i;:::-;38263:137:::0;:::o;39763:90::-;31333:8;:22;31342:12;:10;:12::i;:::-;31333:22;;;;;;;;;;;;;;;;;;;;;;;;;31325:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;39833:14:::2;39839:7;39833:5;:14::i;:::-;39763:90:::0;:::o;38701:99::-;28071:12;:10;:12::i;:::-;28061:22;;:6;;;;;;;;;;;:22;;;28053:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:7:::1;::::0;::::1;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;38775:19:::2;38786:7;38775:10;:19::i;:::-;38701:99:::0;:::o;27853:85::-;27897:7;27920:12;;;;;;;;;;;27913:19;;27853:85;:::o;7452:167::-;7510:7;7526:9;7542:1;7538;:5;7526:17;;7563:1;7558;:6;;7550:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7612:1;7605:8;;;7452:167;;;;:::o;605:100::-;658:15;689:10;682:17;;605:100;:::o;30102:121::-;30178:5;30158:8;:17;30167:7;30158:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30209:7;30195:22;;;;;;;;;;;;30102:121;:::o;25440:328::-;25555:1;25538:19;;:5;:19;;;;25530:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25632:1;25613:21;;:7;:21;;;;25605:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25712:6;25682:11;:18;25694:5;25682:18;;;;;;;;;;;;;;;:27;25701:7;25682:27;;;;;;;;;;;;;;;:36;;;;25746:7;25730:32;;25739:5;25730:32;;;25755:6;25730:32;;;;;;;;;;;;;;;;;;25440:328;;;:::o;32551:341::-;32652:1;32643:6;:10;32635:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32730:15;32718:9;:27;32710:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32802:10;:19;32813:7;32802:19;;;;;;;;;;;;;;;32827:27;;;;;;;;32836:6;32827:27;;;;32844:9;32827:27;;;32802:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32878:7;32867:19;;;;;;;;;;;;32551:341;;;:::o;34849:391::-;34961:1;34942:21;;:7;:21;;;;34934:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35033:1;35024:6;:10;35016:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35089:1;35080:6;:10;35072:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35154:45;;;;;;;;35167:6;35154:45;;;;35175:6;35154:45;;;;35183:15;35154:45;;;35128:14;:23;35143:7;35128:23;;;;;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;35226:7;35211:23;;;;;;;;;;;;34849:391;;;:::o;23280:513::-;23400:1;23382:20;;:6;:20;;;;23374:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23480:1;23459:23;;:9;:23;;;;23451:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23531:47;23552:6;23560:9;23571:6;23531:20;:47::i;:::-;23607:71;23629:6;23607:71;;;;;;;;;;;;;;;;;:9;:17;23617:6;23607:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;23587:9;:17;23597:6;23587:17;;;;;;;;;;;;;;;:91;;;;23708:32;23733:6;23708:9;:20;23718:9;23708:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;23685:9;:20;23695:9;23685:20;;;;;;;;;;;;;;;:55;;;;23769:9;23752:35;;23761:6;23752:35;;;23780:6;23752:35;;;;;;;;;;;;;;;;;;23280:513;;;:::o;8309:178::-;8395:7;8424:1;8419;:6;;8427:12;8411:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8447:9;8463:1;8459;:5;8447:17;;8480:1;8473:8;;;8309:178;;;;;:::o;32375:108::-;32443:5;32425:6;:15;32432:7;32425:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;32469:7;32460:17;;;;;;;;;;;;32375:108;:::o;13626:110::-;13207:7;;;;;;;;;;13199:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13691:5:::1;13681:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;13708:22;13717:12;:10;:12::i;:::-;13708:22;;;;;;;;;;;;;;;;;;;;13626:110::o:0;24678:338::-;24777:1;24758:21;;:7;:21;;;;24750:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24847:68;24870:6;24847:68;;;;;;;;;;;;;;;;;:9;:18;24857:7;24847:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;24826:9;:18;24836:7;24826:18;;;;;;;;;;;;;;;:89;;;;24937:24;24954:6;24937:12;;:16;;:24;;;;:::i;:::-;24922:12;:39;;;;24999:1;24973:37;;24982:7;24973:37;;;25003:6;24973:37;;;;;;;;;;;;;;;;;;24678:338;;:::o;31650:115::-;31723:4;31703:8;:17;31712:7;31703:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;31751:7;31739:20;;;;;;;;;;;;31650:115;:::o;33061:416::-;33169:5;33140:34;;:10;:19;33151:7;33140:19;;;;;;;;;;;;;;;:26;;;;:34;:48;;;;;33187:1;33178:5;:10;;;;33140:48;33132:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33232:8;33243:10;:19;33254:7;33243:19;;;;;;;;;;;;;;;:26;;;;33232:37;;33291:5;33280:16;;33286:1;33280:3;:7;:16;33276:131;;33371:10;:19;33382:7;33371:19;;;;;;;;;;;;;;;33397:1;33391:3;:7;33371:28;;;;;;;;;;;;;;;;;;33342:10;:19;33353:7;33342:19;;;;;;;;;;;;;;;33362:5;33342:26;;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;;33276:131;33413:10;:19;33424:7;33413:19;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33463:7;33450:21;;;;;;;;;;;;33061:416;;;:::o;13387:108::-;12951:7;;;;;;;;;;12950:8;12942:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13453:4:::1;13443:7;::::0;:14:::1;;;;;;;;;;;;;;;;;;13469:20;13476:12;:10;:12::i;:::-;13469:20;;;;;;;;;;;;;;;;;;;;13387:108::o:0;35385:152::-;35473:21;;;;;;;;35486:1;35473:21;;;;35489:1;35473:21;;;;35492:1;35473:21;;;35447:14;:23;35462:7;35447:23;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;35523:7;35506:25;;;;;;;;;;;;35385:152;:::o;7889:130::-;7947:7;7970:43;7974:1;7977;7970:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7963:50;;7889:130;;;;:::o;9627:126::-;9685:7;9708:39;9712:1;9715;9708:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;9701:46;;9627:126;;;;:::o;8733:433::-;8791:7;9025:1;9020;:6;9016:39;;;9046:1;9039:8;;;;9016:39;9063:9;9079:1;9075;:5;9063:17;;9104:1;9099;9095;:5;;;;;;:10;9087:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9159:1;9152:8;;;8733:433;;;;;:::o;31842:121::-;31918:5;31898:8;:17;31907:7;31898:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;31949:7;31935:22;;;;;;;;;;;;31842:121;:::o;28789:269::-;28902:1;28876:28;;:14;:28;;;;28868:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29001:14;28966:50;;28993:6;;;;;;;;;;;28966:50;;;;;;;;;;;;29038:14;29023:12;;:29;;;;;;;;;;;;;;;;;;28789:269;:::o;28456:220::-;28551:1;28531:22;;:8;:22;;;;28523:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28637:8;28608:38;;28629:6;;;;;;;;;;;28608:38;;;;;;;;;;;;28662:8;28653:6;;:17;;;;;;;;;;;;;;;;;;28456:220;:::o;32200:103::-;32266:4;32248:6;:15;32255:7;32248:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;32289:7;32282:15;;;;;;;;;;;;32200:103;:::o;29906:115::-;29979:4;29959:8;:17;29968:7;29959:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;30007:7;29995:20;;;;;;;;;;;;29906:115;:::o;37546:643::-;37650:44;37677:4;37683:2;37687:6;37650:26;:44::i;:::-;37712:14;37721:4;37712:8;:14::i;:::-;37711:15;37703:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37791:12;37800:2;37791:8;:12::i;:::-;37790:13;37782:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37866:22;37875:12;:10;:12::i;:::-;37866:8;:22::i;:::-;37865:23;37857:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37960:8;:6;:8::i;:::-;37959:9;37951:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38110:6;38025:81;38076:29;38100:4;38076:23;:29::i;:::-;38025:46;38045:25;38065:4;38045:19;:25::i;:::-;38025:15;38035:4;38025:9;:15::i;:::-;:19;;:46;;;;:::i;:::-;:50;;:81;;;;:::i;:::-;:91;;38017:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37546:643;;;:::o;10234:260::-;10320:7;10348:1;10344;:5;10351:12;10336:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10371:9;10387:1;10383;:5;;;;;;10371:17;;10487:1;10480:8;;;10234:260;;;;;:::o;26354:92::-;;;;:::o

Swarm Source

ipfs://cf01c690cb47b4d1dbb7bb4299367164072b8c99128975fda9f2e970c4623a1b
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.