ETH Price: $3,124.96 (+1.95%)

Token

Satoshi (SAT)
 

Overview

Max Total Supply

302,185,921.94 SAT

Holders

2,291

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
vad3r.eth
Balance
9,453.9 SAT

Value
$0.00
0xf8e649db52e892f58f4b109c18948313f7ea4511
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SatoshiStaking

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-10
*/

/**
 *Submitted for verification at Etherscan.io on 2022-03-09
*/

// SPDX-License-Identifier: MIT

//   _________       __               .__    .__  __________                                         
//  /   _____/____ _/  |_  ____  _____|  |__ |__| \______   \__ __  ____   ____   ___________  ______
//  \_____  \\__  \\   __\/  _ \/  ___/  |  \|  |  |       _/  |  \/    \ /    \_/ __ \_  __ \/  ___/
//  /        \/ __ \|  | (  <_> )___ \|   Y  \  |  |    |   \  |  /   |  \   |  \  ___/|  | \/\___ \ 
// /_______  (____  /__|  \____/____  >___|  /__|  |____|_  /____/|___|  /___|  /\___  >__|  /____  >
//         \/     \/                \/     \/             \/           \/     \/     \/           \/ 


pragma solidity ^0.8.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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @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.
 *
 * 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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @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 Contracts guidelines: functions revert
 * instead 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, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        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] + 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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be 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 Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol



pragma solidity ^0.8.0;



/**
 * @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 ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

pragma solidity ^0.8.4;



interface ISatoshiRunners {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

contract SatoshiStaking is ERC20Burnable, Ownable {
    uint256 public constant MAX_SUPPLY = 350000000 * 1 ether;
    uint256 public constant LEGENDARY_EMISSION_RATE = 200; // 200 per day
    uint256 public constant RUNNERS_EMISSION_RATE = 10; // 10 per day
    address public constant RUNNERS_ADDRESS = 0x080CE3620a3cfed6119D6c8DB0F9A56e52451729;
    bool public live = false;

    mapping(uint256 => uint256) internal runnersTimeStaked;
    mapping(uint256 => address) internal runnersStaker;
    mapping(address => uint256[]) internal stakerToRunner;
        
    ISatoshiRunners private constant _satoshiRunnersContract = ISatoshiRunners(RUNNERS_ADDRESS);

    constructor() ERC20("Satoshi", "SAT") {
    }

    modifier stakingEnabled {
        require(live, "NOT_LIVE");
        _;
    }

    function getStakedRunners(address staker) public view returns (uint256[] memory) {
        return stakerToRunner[staker];
    }
    
    function getStakedAmount(address staker) public view returns (uint256) {
        return stakerToRunner[staker].length;
    }

    function getStaker(uint256 tokenId) public view returns (address) {
        return runnersStaker[tokenId];
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;
        
        //calculate bonus
        uint256 bonus = _getBonus(staker);

        uint256[] memory runnersTokens = stakerToRunner[staker];
        for (uint256 i = 0; i < runnersTokens.length; i++) {
            totalRewards += getReward(runnersTokens[i]);
        }

        totalRewards += (bonus * totalRewards) / 100;
        return totalRewards;
    }

    function stakeRunnersById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _satoshiRunnersContract.transferFrom(msg.sender, address(this), id);

            stakerToRunner[msg.sender].push(id);
            runnersTimeStaked[id] = block.timestamp;
            runnersStaker[id] = msg.sender;
        }
    }

    function unstakeRunnersByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        //calculate bonus
        uint256 bonus = _getBonus(msg.sender);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(runnersStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _satoshiRunnersContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            removeTokenIdFromArray(stakerToRunner[msg.sender], id);
            runnersStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        totalRewards += (bonus * totalRewards) / 100;

        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function unstakeAll() external {
        require(getStakedAmount(msg.sender) > 0, "NONE_STAKED");
        uint256 totalRewards = 0;

        //calculate bonus
        uint256 bonus = _getBonus(msg.sender);

        for (uint256 i = stakerToRunner[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToRunner[msg.sender][i - 1];

            _satoshiRunnersContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            stakerToRunner[msg.sender].pop();
            runnersStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        totalRewards += (bonus * totalRewards) / 100;
        
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function claimAll() external {
        uint256 totalRewards = 0;

        //calculate bonus
        uint256 bonus = _getBonus(msg.sender);

        uint256[] memory runnersTokens = stakerToRunner[msg.sender];
        for (uint256 i = 0; i < runnersTokens.length; i++) {
            uint256 id = runnersTokens[i];

            totalRewards += getReward(id);
            runnersTimeStaked[id] = block.timestamp;
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        totalRewards += (bonus * totalRewards) / 100;
        
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function burn(address from, uint256 amount) external {
        require(msg.sender == RUNNERS_ADDRESS, "NOT_AUTHORIZED");

        _burn(from, amount);
    }
    
    function toggle() external onlyOwner {
        live = !live;
    }

    function mint(address to, uint256 value) external onlyOwner {
        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(to, value > remaining ? remaining : value);
    }

    function getReward(uint256 tokenId) internal view returns(uint256) {
        uint256 EMISSION_RATE;
        uint256 stakedTime = block.timestamp - runnersTimeStaked[tokenId];
        uint256 daysBonus;
        uint256 reward;
        
        if (stakedTime < 30 days) {
            daysBonus = 0;
        } else if (stakedTime < 45 days) {
            daysBonus = 10;
        } else if (stakedTime < 60 days) {
            daysBonus = 30;
        } else {
            daysBonus = 50;
        }
        if (tokenId == 0 || tokenId == 1 || tokenId == 2 || tokenId == 417 || tokenId == 1095 || tokenId == 1389 || tokenId == 1856 || tokenId == 2563 || tokenId == 6396 || tokenId == 6673) {
            EMISSION_RATE = LEGENDARY_EMISSION_RATE;
        } else {
            EMISSION_RATE = RUNNERS_EMISSION_RATE;
        }

        reward = stakedTime * EMISSION_RATE / 86400 * 1 ether; 
        reward += (daysBonus * reward) / 100;

        return reward;
    }

    function removeTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }

    function _getBonus(address staker) internal view returns (uint256 bonus) {
        uint256 balance = getStakedAmount(staker);

        if (balance < 5) return 0;
        if (balance < 10) return 20;
        if (balance < 20) return 50;
        return 100;
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"LEGENDARY_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RUNNERS_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RUNNERS_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","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":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedRunners","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStaker","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":[],"name":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeRunnersById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeRunnersByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600560146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600781526020017f5361746f736869000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53415400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620001c1565b508060049080519060200190620000ca929190620001c1565b505050620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf90620002a0565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002b957607f821691505b60208210811415620002d057620002cf62000271565b5b50919050565b6135f480620002e66000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063a9059cbb116100a2578063e0335c7b11610071578063e0335c7b14610597578063e3c998fe146105b3578063ecc44e25146105e3578063f2fde38b14610601576101f0565b8063a9059cbb146104fd578063d1058e591461052d578063d2c9f04f14610537578063dd62ed3e14610567576101f0565b806395d89b41116100de57806395d89b41146104755780639dc29fac146104935780639e82ecf0146104af578063a457c2d7146104cd576101f0565b8063715018a61461041357806379cc67901461041d5780638da5cb5b14610439578063957aa58c14610457576101f0565b806335322f371161018757806340c10f191161015657806340c10f191461037b57806342966c68146103975780634da6a556146103b357806370a08231146103e3576101f0565b806335322f3714610307578063362a3fad14610311578063395093511461034157806340a3d24614610371576101f0565b806318160ddd116101c357806318160ddd1461027d57806323b872dd1461029b578063313ce567146102cb57806332cb6b0c146102e9576101f0565b8063016aa1c5146101f557806306fdde0314610211578063095ea7b31461022f5780630dd692271461025f575b600080fd5b61020f600480360381019061020a91906125aa565b61061d565b005b6102196108a8565b6040516102269190612690565b60405180910390f35b61024960048036038101906102449190612746565b61093a565b60405161025691906127a1565b60405180910390f35b610267610958565b60405161027491906127cb565b60405180910390f35b61028561095d565b60405161029291906127cb565b60405180910390f35b6102b560048036038101906102b091906127e6565b610967565b6040516102c291906127a1565b60405180910390f35b6102d3610a5f565b6040516102e09190612855565b60405180910390f35b6102f1610a68565b6040516102fe91906127cb565b60405180910390f35b61030f610a78565b005b61032b60048036038101906103269190612870565b610d59565b60405161033891906127cb565b60405180910390f35b61035b60048036038101906103569190612746565b610e7f565b60405161036891906127a1565b60405180910390f35b610379610f2b565b005b61039560048036038101906103909190612746565b610fd3565b005b6103b160048036038101906103ac919061289d565b61108f565b005b6103cd60048036038101906103c89190612870565b6110a3565b6040516103da91906127cb565b60405180910390f35b6103fd60048036038101906103f89190612870565b6110ef565b60405161040a91906127cb565b60405180910390f35b61041b611137565b005b61043760048036038101906104329190612746565b6111bf565b005b61044161123a565b60405161044e91906128d9565b60405180910390f35b61045f611264565b60405161046c91906127a1565b60405180910390f35b61047d611277565b60405161048a9190612690565b60405180910390f35b6104ad60048036038101906104a89190612746565b611309565b005b6104b7611399565b6040516104c491906128d9565b60405180910390f35b6104e760048036038101906104e29190612746565b6113b1565b6040516104f491906127a1565b60405180910390f35b61051760048036038101906105129190612746565b61149c565b60405161052491906127a1565b60405180910390f35b6105356114ba565b005b610551600480360381019061054c9190612870565b61162e565b60405161055e91906129b2565b60405180910390f35b610581600480360381019061057c91906129d4565b6116c5565b60405161058e91906127cb565b60405180910390f35b6105b160048036038101906105ac91906125aa565b61174c565b005b6105cd60048036038101906105c8919061289d565b611933565b6040516105da91906128d9565b60405180910390f35b6105eb611970565b6040516105f891906127cb565b60405180910390f35b61061b60048036038101906106169190612870565b611975565b005b60008061062933611a6d565b905060005b8484905081101561084057600085858381811061064e5761064d612a14565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90612a8f565b60405180910390fd5b73080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161074993929190612aaf565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b5050505061078481611abf565b8461078f9190612b15565b93506107d9600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082611c0c565b60006007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061083890612b6b565b91505061062e565b50600061084b61095d565b6b0121836204bc2ce21e0000006108629190612bb4565b9050606483836108729190612be8565b61087c9190612c71565b836108879190612b15565b92506108a13382851161089a578461089c565b825b611ce0565b5050505050565b6060600380546108b790612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390612cd1565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505050905090565b600061094e610947611e40565b8484611e48565b6001905092915050565b600a81565b6000600254905090565b6000610974848484612013565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109bf611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690612d75565b60405180910390fd5b610a5385610a4b611e40565b858403611e48565b60019150509392505050565b60006012905090565b6b0121836204bc2ce21e00000081565b6000610a83336110a3565b11610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba90612de1565b60405180910390fd5b600080610acf33611a6d565b90506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115610cf3576000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600183610b709190612bb4565b81548110610b8157610b80612a14565b5b9060005260206000200154905073080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401610bdf93929190612aaf565b600060405180830381600087803b158015610bf957600080fd5b505af1158015610c0d573d6000803e3d6000fd5b50505050610c1a81611abf565b84610c259190612b15565b9350600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610c7657610c75612e01565b5b6001900381819060005260206000200160009055905560006007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610ceb90612e30565b915050610b19565b506000610cfe61095d565b6b0121836204bc2ce21e000000610d159190612bb4565b905060648383610d259190612be8565b610d2f9190612c71565b83610d3a9190612b15565b9250610d5433828511610d4d5784610d4f565b825b611ce0565b505050565b600080600090506000610d6b84611a6d565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610df857602002820191906000526020600020905b815481526020019060010190808311610de4575b5050505050905060005b8151811015610e4e57610e2e828281518110610e2157610e20612a14565b5b6020026020010151611abf565b84610e399190612b15565b93508080610e4690612b6b565b915050610e02565b5060648383610e5d9190612be8565b610e679190612c71565b83610e729190612b15565b9250829350505050919050565b6000610f21610e8c611e40565b848460016000610e9a611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f1c9190612b15565b611e48565b6001905092915050565b610f33611e40565b73ffffffffffffffffffffffffffffffffffffffff16610f5161123a565b73ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90612ea6565b60405180910390fd5b600560149054906101000a900460ff1615600560146101000a81548160ff021916908315150217905550565b610fdb611e40565b73ffffffffffffffffffffffffffffffffffffffff16610ff961123a565b73ffffffffffffffffffffffffffffffffffffffff161461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690612ea6565b60405180910390fd5b600061105961095d565b6b0121836204bc2ce21e0000006110709190612bb4565b905061108a838284116110835783611085565b825b611ce0565b505050565b6110a061109a611e40565b82612294565b50565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113f611e40565b73ffffffffffffffffffffffffffffffffffffffff1661115d61123a565b73ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90612ea6565b60405180910390fd5b6111bd600061246b565b565b60006111d2836111cd611e40565b6116c5565b905081811015611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90612f38565b60405180910390fd5b61122b83611223611e40565b848403611e48565b6112358383612294565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560149054906101000a900460ff1681565b60606004805461128690612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546112b290612cd1565b80156112ff5780601f106112d4576101008083540402835291602001916112ff565b820191906000526020600020905b8154815290600101906020018083116112e257829003601f168201915b5050505050905090565b73080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290612fa4565b60405180910390fd5b6113958282612294565b5050565b73080ce3620a3cfed6119d6c8db0f9a56e5245172981565b600080600160006113c0611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613036565b60405180910390fd5b611491611488611e40565b85858403611e48565b600191505092915050565b60006114b06114a9611e40565b8484612013565b6001905092915050565b6000806114c633611a6d565b90506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561155357602002820191906000526020600020905b81548152602001906001019080831161153f575b5050505050905060005b81518110156115c757600082828151811061157b5761157a612a14565b5b6020026020010151905061158e81611abf565b856115999190612b15565b94504260066000838152602001908152602001600020819055505080806115bf90612b6b565b91505061155d565b5060006115d261095d565b6b0121836204bc2ce21e0000006115e99190612bb4565b9050606484846115f99190612be8565b6116039190612c71565b8461160e9190612b15565b9350611628338286116116215785611623565b825b611ce0565b50505050565b6060600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156116b957602002820191906000526020600020905b8154815260200190600101908083116116a5575b50505050509050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560149054906101000a900460ff1661179b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611792906130a2565b60405180910390fd5b60005b8282905081101561192e5760008383838181106117be576117bd612a14565b5b90506020020135905073080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161181893929190612aaf565b600060405180830381600087803b15801561183257600080fd5b505af1158015611846573d6000803e3d6000fd5b50505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055426006600083815260200190815260200160002081905550336007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061192690612b6b565b91505061179e565b505050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60c881565b61197d611e40565b73ffffffffffffffffffffffffffffffffffffffff1661199b61123a565b73ffffffffffffffffffffffffffffffffffffffff16146119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890612ea6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890613134565b60405180910390fd5b611a6a8161246b565b50565b600080611a79836110a3565b90506005811015611a8e576000915050611aba565b600a811015611aa1576014915050611aba565b6014811015611ab4576032915050611aba565b60649150505b919050565b6000806000600660008581526020019081526020016000205442611ae39190612bb4565b905060008062278d00831015611afc5760009150611b2b565b623b5380831015611b1057600a9150611b2a565b624f1a00831015611b2457601e9150611b29565b603291505b5b5b6000861480611b3a5750600186145b80611b455750600286145b80611b5157506101a186145b80611b5d575061044786145b80611b69575061056d86145b80611b75575061074086145b80611b815750610a0386145b80611b8d57506118fc86145b80611b995750611a1186145b15611ba75760c89350611bac565b600a93505b670de0b6b3a7640000620151808585611bc59190612be8565b611bcf9190612c71565b611bd99190612be8565b905060648183611be99190612be8565b611bf39190612c71565b81611bfe9190612b15565b905080945050505050919050565b60008280549050905060005b81811015611cda5782848281548110611c3457611c33612a14565b5b90600052602060002001541415611cc7578180611c5090612e30565b92505081811015611c9b57838281548110611c6e57611c6d612a14565b5b9060005260206000200154848281548110611c8c57611c8b612a14565b5b90600052602060002001819055505b83805480611cac57611cab612e01565b5b60019003818190600052602060002001600090559055611cda565b8080611cd290612b6b565b915050611c18565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d47906131a0565b60405180910390fd5b611d5c60008383612531565b8060026000828254611d6e9190612b15565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc39190612b15565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e2891906127cb565b60405180910390a3611e3c60008383612536565b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613232565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f906132c4565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161200691906127cb565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90613356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906133e8565b60405180910390fd5b6120fe838383612531565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b9061347a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122179190612b15565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227b91906127cb565b60405180910390a361228e848484612536565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb9061350c565b60405180910390fd5b61231082600083612531565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d9061359e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546123ed9190612bb4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161245291906127cb565b60405180910390a361246683600084612536565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261256a57612569612545565b5b8235905067ffffffffffffffff8111156125875761258661254a565b5b6020830191508360208202830111156125a3576125a261254f565b5b9250929050565b600080602083850312156125c1576125c061253b565b5b600083013567ffffffffffffffff8111156125df576125de612540565b5b6125eb85828601612554565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612631578082015181840152602081019050612616565b83811115612640576000848401525b50505050565b6000601f19601f8301169050919050565b6000612662826125f7565b61266c8185612602565b935061267c818560208601612613565b61268581612646565b840191505092915050565b600060208201905081810360008301526126aa8184612657565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126dd826126b2565b9050919050565b6126ed816126d2565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b6000819050919050565b61272381612710565b811461272e57600080fd5b50565b6000813590506127408161271a565b92915050565b6000806040838503121561275d5761275c61253b565b5b600061276b858286016126fb565b925050602061277c85828601612731565b9150509250929050565b60008115159050919050565b61279b81612786565b82525050565b60006020820190506127b66000830184612792565b92915050565b6127c581612710565b82525050565b60006020820190506127e060008301846127bc565b92915050565b6000806000606084860312156127ff576127fe61253b565b5b600061280d868287016126fb565b935050602061281e868287016126fb565b925050604061282f86828701612731565b9150509250925092565b600060ff82169050919050565b61284f81612839565b82525050565b600060208201905061286a6000830184612846565b92915050565b6000602082840312156128865761288561253b565b5b6000612894848285016126fb565b91505092915050565b6000602082840312156128b3576128b261253b565b5b60006128c184828501612731565b91505092915050565b6128d3816126d2565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61292981612710565b82525050565b600061293b8383612920565b60208301905092915050565b6000602082019050919050565b600061295f826128f4565b61296981856128ff565b935061297483612910565b8060005b838110156129a557815161298c888261292f565b975061299783612947565b925050600181019050612978565b5085935050505092915050565b600060208201905081810360008301526129cc8184612954565b905092915050565b600080604083850312156129eb576129ea61253b565b5b60006129f9858286016126fb565b9250506020612a0a858286016126fb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e454544535f544f5f42455f4f574e4552000000000000000000000000000000600082015250565b6000612a79601183612602565b9150612a8482612a43565b602082019050919050565b60006020820190508181036000830152612aa881612a6c565b9050919050565b6000606082019050612ac460008301866128ca565b612ad160208301856128ca565b612ade60408301846127bc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b2082612710565b9150612b2b83612710565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b6057612b5f612ae6565b5b828201905092915050565b6000612b7682612710565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ba957612ba8612ae6565b5b600182019050919050565b6000612bbf82612710565b9150612bca83612710565b925082821015612bdd57612bdc612ae6565b5b828203905092915050565b6000612bf382612710565b9150612bfe83612710565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c3757612c36612ae6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c7c82612710565b9150612c8783612710565b925082612c9757612c96612c42565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ce957607f821691505b60208210811415612cfd57612cfc612ca2565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612d5f602883612602565b9150612d6a82612d03565b604082019050919050565b60006020820190508181036000830152612d8e81612d52565b9050919050565b7f4e4f4e455f5354414b4544000000000000000000000000000000000000000000600082015250565b6000612dcb600b83612602565b9150612dd682612d95565b602082019050919050565b60006020820190508181036000830152612dfa81612dbe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000612e3b82612710565b91506000821415612e4f57612e4e612ae6565b5b600182039050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e90602083612602565b9150612e9b82612e5a565b602082019050919050565b60006020820190508181036000830152612ebf81612e83565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000612f22602483612602565b9150612f2d82612ec6565b604082019050919050565b60006020820190508181036000830152612f5181612f15565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000612f8e600e83612602565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613020602583612602565b915061302b82612fc4565b604082019050919050565b6000602082019050818103600083015261304f81613013565b9050919050565b7f4e4f545f4c495645000000000000000000000000000000000000000000000000600082015250565b600061308c600883612602565b915061309782613056565b602082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061311e602683612602565b9150613129826130c2565b604082019050919050565b6000602082019050818103600083015261314d81613111565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061318a601f83612602565b915061319582613154565b602082019050919050565b600060208201905081810360008301526131b98161317d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061321c602483612602565b9150613227826131c0565b604082019050919050565b6000602082019050818103600083015261324b8161320f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132ae602283612602565b91506132b982613252565b604082019050919050565b600060208201905081810360008301526132dd816132a1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613340602583612602565b915061334b826132e4565b604082019050919050565b6000602082019050818103600083015261336f81613333565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133d2602383612602565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613464602683612602565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006134f6602183612602565b91506135018261349a565b604082019050919050565b60006020820190508181036000830152613525816134e9565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613588602283612602565b91506135938261352c565b604082019050919050565b600060208201905081810360008301526135b78161357b565b905091905056fea2646970667358221220759c70df9b1eca8c6eed7a25a30c343d6b6abc3638387ca01f2a94056c244d4d64736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063a9059cbb116100a2578063e0335c7b11610071578063e0335c7b14610597578063e3c998fe146105b3578063ecc44e25146105e3578063f2fde38b14610601576101f0565b8063a9059cbb146104fd578063d1058e591461052d578063d2c9f04f14610537578063dd62ed3e14610567576101f0565b806395d89b41116100de57806395d89b41146104755780639dc29fac146104935780639e82ecf0146104af578063a457c2d7146104cd576101f0565b8063715018a61461041357806379cc67901461041d5780638da5cb5b14610439578063957aa58c14610457576101f0565b806335322f371161018757806340c10f191161015657806340c10f191461037b57806342966c68146103975780634da6a556146103b357806370a08231146103e3576101f0565b806335322f3714610307578063362a3fad14610311578063395093511461034157806340a3d24614610371576101f0565b806318160ddd116101c357806318160ddd1461027d57806323b872dd1461029b578063313ce567146102cb57806332cb6b0c146102e9576101f0565b8063016aa1c5146101f557806306fdde0314610211578063095ea7b31461022f5780630dd692271461025f575b600080fd5b61020f600480360381019061020a91906125aa565b61061d565b005b6102196108a8565b6040516102269190612690565b60405180910390f35b61024960048036038101906102449190612746565b61093a565b60405161025691906127a1565b60405180910390f35b610267610958565b60405161027491906127cb565b60405180910390f35b61028561095d565b60405161029291906127cb565b60405180910390f35b6102b560048036038101906102b091906127e6565b610967565b6040516102c291906127a1565b60405180910390f35b6102d3610a5f565b6040516102e09190612855565b60405180910390f35b6102f1610a68565b6040516102fe91906127cb565b60405180910390f35b61030f610a78565b005b61032b60048036038101906103269190612870565b610d59565b60405161033891906127cb565b60405180910390f35b61035b60048036038101906103569190612746565b610e7f565b60405161036891906127a1565b60405180910390f35b610379610f2b565b005b61039560048036038101906103909190612746565b610fd3565b005b6103b160048036038101906103ac919061289d565b61108f565b005b6103cd60048036038101906103c89190612870565b6110a3565b6040516103da91906127cb565b60405180910390f35b6103fd60048036038101906103f89190612870565b6110ef565b60405161040a91906127cb565b60405180910390f35b61041b611137565b005b61043760048036038101906104329190612746565b6111bf565b005b61044161123a565b60405161044e91906128d9565b60405180910390f35b61045f611264565b60405161046c91906127a1565b60405180910390f35b61047d611277565b60405161048a9190612690565b60405180910390f35b6104ad60048036038101906104a89190612746565b611309565b005b6104b7611399565b6040516104c491906128d9565b60405180910390f35b6104e760048036038101906104e29190612746565b6113b1565b6040516104f491906127a1565b60405180910390f35b61051760048036038101906105129190612746565b61149c565b60405161052491906127a1565b60405180910390f35b6105356114ba565b005b610551600480360381019061054c9190612870565b61162e565b60405161055e91906129b2565b60405180910390f35b610581600480360381019061057c91906129d4565b6116c5565b60405161058e91906127cb565b60405180910390f35b6105b160048036038101906105ac91906125aa565b61174c565b005b6105cd60048036038101906105c8919061289d565b611933565b6040516105da91906128d9565b60405180910390f35b6105eb611970565b6040516105f891906127cb565b60405180910390f35b61061b60048036038101906106169190612870565b611975565b005b60008061062933611a6d565b905060005b8484905081101561084057600085858381811061064e5761064d612a14565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90612a8f565b60405180910390fd5b73080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161074993929190612aaf565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b5050505061078481611abf565b8461078f9190612b15565b93506107d9600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082611c0c565b60006007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061083890612b6b565b91505061062e565b50600061084b61095d565b6b0121836204bc2ce21e0000006108629190612bb4565b9050606483836108729190612be8565b61087c9190612c71565b836108879190612b15565b92506108a13382851161089a578461089c565b825b611ce0565b5050505050565b6060600380546108b790612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390612cd1565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505050905090565b600061094e610947611e40565b8484611e48565b6001905092915050565b600a81565b6000600254905090565b6000610974848484612013565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109bf611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690612d75565b60405180910390fd5b610a5385610a4b611e40565b858403611e48565b60019150509392505050565b60006012905090565b6b0121836204bc2ce21e00000081565b6000610a83336110a3565b11610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba90612de1565b60405180910390fd5b600080610acf33611a6d565b90506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115610cf3576000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600183610b709190612bb4565b81548110610b8157610b80612a14565b5b9060005260206000200154905073080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401610bdf93929190612aaf565b600060405180830381600087803b158015610bf957600080fd5b505af1158015610c0d573d6000803e3d6000fd5b50505050610c1a81611abf565b84610c259190612b15565b9350600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610c7657610c75612e01565b5b6001900381819060005260206000200160009055905560006007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610ceb90612e30565b915050610b19565b506000610cfe61095d565b6b0121836204bc2ce21e000000610d159190612bb4565b905060648383610d259190612be8565b610d2f9190612c71565b83610d3a9190612b15565b9250610d5433828511610d4d5784610d4f565b825b611ce0565b505050565b600080600090506000610d6b84611a6d565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610df857602002820191906000526020600020905b815481526020019060010190808311610de4575b5050505050905060005b8151811015610e4e57610e2e828281518110610e2157610e20612a14565b5b6020026020010151611abf565b84610e399190612b15565b93508080610e4690612b6b565b915050610e02565b5060648383610e5d9190612be8565b610e679190612c71565b83610e729190612b15565b9250829350505050919050565b6000610f21610e8c611e40565b848460016000610e9a611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f1c9190612b15565b611e48565b6001905092915050565b610f33611e40565b73ffffffffffffffffffffffffffffffffffffffff16610f5161123a565b73ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90612ea6565b60405180910390fd5b600560149054906101000a900460ff1615600560146101000a81548160ff021916908315150217905550565b610fdb611e40565b73ffffffffffffffffffffffffffffffffffffffff16610ff961123a565b73ffffffffffffffffffffffffffffffffffffffff161461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690612ea6565b60405180910390fd5b600061105961095d565b6b0121836204bc2ce21e0000006110709190612bb4565b905061108a838284116110835783611085565b825b611ce0565b505050565b6110a061109a611e40565b82612294565b50565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113f611e40565b73ffffffffffffffffffffffffffffffffffffffff1661115d61123a565b73ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90612ea6565b60405180910390fd5b6111bd600061246b565b565b60006111d2836111cd611e40565b6116c5565b905081811015611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90612f38565b60405180910390fd5b61122b83611223611e40565b848403611e48565b6112358383612294565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560149054906101000a900460ff1681565b60606004805461128690612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546112b290612cd1565b80156112ff5780601f106112d4576101008083540402835291602001916112ff565b820191906000526020600020905b8154815290600101906020018083116112e257829003601f168201915b5050505050905090565b73080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290612fa4565b60405180910390fd5b6113958282612294565b5050565b73080ce3620a3cfed6119d6c8db0f9a56e5245172981565b600080600160006113c0611e40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613036565b60405180910390fd5b611491611488611e40565b85858403611e48565b600191505092915050565b60006114b06114a9611e40565b8484612013565b6001905092915050565b6000806114c633611a6d565b90506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561155357602002820191906000526020600020905b81548152602001906001019080831161153f575b5050505050905060005b81518110156115c757600082828151811061157b5761157a612a14565b5b6020026020010151905061158e81611abf565b856115999190612b15565b94504260066000838152602001908152602001600020819055505080806115bf90612b6b565b91505061155d565b5060006115d261095d565b6b0121836204bc2ce21e0000006115e99190612bb4565b9050606484846115f99190612be8565b6116039190612c71565b8461160e9190612b15565b9350611628338286116116215785611623565b825b611ce0565b50505050565b6060600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156116b957602002820191906000526020600020905b8154815260200190600101908083116116a5575b50505050509050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560149054906101000a900460ff1661179b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611792906130a2565b60405180910390fd5b60005b8282905081101561192e5760008383838181106117be576117bd612a14565b5b90506020020135905073080ce3620a3cfed6119d6c8db0f9a56e5245172973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161181893929190612aaf565b600060405180830381600087803b15801561183257600080fd5b505af1158015611846573d6000803e3d6000fd5b50505050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055426006600083815260200190815260200160002081905550336007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061192690612b6b565b91505061179e565b505050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60c881565b61197d611e40565b73ffffffffffffffffffffffffffffffffffffffff1661199b61123a565b73ffffffffffffffffffffffffffffffffffffffff16146119f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e890612ea6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890613134565b60405180910390fd5b611a6a8161246b565b50565b600080611a79836110a3565b90506005811015611a8e576000915050611aba565b600a811015611aa1576014915050611aba565b6014811015611ab4576032915050611aba565b60649150505b919050565b6000806000600660008581526020019081526020016000205442611ae39190612bb4565b905060008062278d00831015611afc5760009150611b2b565b623b5380831015611b1057600a9150611b2a565b624f1a00831015611b2457601e9150611b29565b603291505b5b5b6000861480611b3a5750600186145b80611b455750600286145b80611b5157506101a186145b80611b5d575061044786145b80611b69575061056d86145b80611b75575061074086145b80611b815750610a0386145b80611b8d57506118fc86145b80611b995750611a1186145b15611ba75760c89350611bac565b600a93505b670de0b6b3a7640000620151808585611bc59190612be8565b611bcf9190612c71565b611bd99190612be8565b905060648183611be99190612be8565b611bf39190612c71565b81611bfe9190612b15565b905080945050505050919050565b60008280549050905060005b81811015611cda5782848281548110611c3457611c33612a14565b5b90600052602060002001541415611cc7578180611c5090612e30565b92505081811015611c9b57838281548110611c6e57611c6d612a14565b5b9060005260206000200154848281548110611c8c57611c8b612a14565b5b90600052602060002001819055505b83805480611cac57611cab612e01565b5b60019003818190600052602060002001600090559055611cda565b8080611cd290612b6b565b915050611c18565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d47906131a0565b60405180910390fd5b611d5c60008383612531565b8060026000828254611d6e9190612b15565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc39190612b15565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e2891906127cb565b60405180910390a3611e3c60008383612536565b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613232565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f906132c4565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161200691906127cb565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90613356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906133e8565b60405180910390fd5b6120fe838383612531565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b9061347a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122179190612b15565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227b91906127cb565b60405180910390a361228e848484612536565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb9061350c565b60405180910390fd5b61231082600083612531565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d9061359e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546123ed9190612bb4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161245291906127cb565b60405180910390a361246683600084612536565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261256a57612569612545565b5b8235905067ffffffffffffffff8111156125875761258661254a565b5b6020830191508360208202830111156125a3576125a261254f565b5b9250929050565b600080602083850312156125c1576125c061253b565b5b600083013567ffffffffffffffff8111156125df576125de612540565b5b6125eb85828601612554565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612631578082015181840152602081019050612616565b83811115612640576000848401525b50505050565b6000601f19601f8301169050919050565b6000612662826125f7565b61266c8185612602565b935061267c818560208601612613565b61268581612646565b840191505092915050565b600060208201905081810360008301526126aa8184612657565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126dd826126b2565b9050919050565b6126ed816126d2565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b6000819050919050565b61272381612710565b811461272e57600080fd5b50565b6000813590506127408161271a565b92915050565b6000806040838503121561275d5761275c61253b565b5b600061276b858286016126fb565b925050602061277c85828601612731565b9150509250929050565b60008115159050919050565b61279b81612786565b82525050565b60006020820190506127b66000830184612792565b92915050565b6127c581612710565b82525050565b60006020820190506127e060008301846127bc565b92915050565b6000806000606084860312156127ff576127fe61253b565b5b600061280d868287016126fb565b935050602061281e868287016126fb565b925050604061282f86828701612731565b9150509250925092565b600060ff82169050919050565b61284f81612839565b82525050565b600060208201905061286a6000830184612846565b92915050565b6000602082840312156128865761288561253b565b5b6000612894848285016126fb565b91505092915050565b6000602082840312156128b3576128b261253b565b5b60006128c184828501612731565b91505092915050565b6128d3816126d2565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61292981612710565b82525050565b600061293b8383612920565b60208301905092915050565b6000602082019050919050565b600061295f826128f4565b61296981856128ff565b935061297483612910565b8060005b838110156129a557815161298c888261292f565b975061299783612947565b925050600181019050612978565b5085935050505092915050565b600060208201905081810360008301526129cc8184612954565b905092915050565b600080604083850312156129eb576129ea61253b565b5b60006129f9858286016126fb565b9250506020612a0a858286016126fb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e454544535f544f5f42455f4f574e4552000000000000000000000000000000600082015250565b6000612a79601183612602565b9150612a8482612a43565b602082019050919050565b60006020820190508181036000830152612aa881612a6c565b9050919050565b6000606082019050612ac460008301866128ca565b612ad160208301856128ca565b612ade60408301846127bc565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b2082612710565b9150612b2b83612710565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b6057612b5f612ae6565b5b828201905092915050565b6000612b7682612710565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ba957612ba8612ae6565b5b600182019050919050565b6000612bbf82612710565b9150612bca83612710565b925082821015612bdd57612bdc612ae6565b5b828203905092915050565b6000612bf382612710565b9150612bfe83612710565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c3757612c36612ae6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c7c82612710565b9150612c8783612710565b925082612c9757612c96612c42565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ce957607f821691505b60208210811415612cfd57612cfc612ca2565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612d5f602883612602565b9150612d6a82612d03565b604082019050919050565b60006020820190508181036000830152612d8e81612d52565b9050919050565b7f4e4f4e455f5354414b4544000000000000000000000000000000000000000000600082015250565b6000612dcb600b83612602565b9150612dd682612d95565b602082019050919050565b60006020820190508181036000830152612dfa81612dbe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000612e3b82612710565b91506000821415612e4f57612e4e612ae6565b5b600182039050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e90602083612602565b9150612e9b82612e5a565b602082019050919050565b60006020820190508181036000830152612ebf81612e83565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000612f22602483612602565b9150612f2d82612ec6565b604082019050919050565b60006020820190508181036000830152612f5181612f15565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000612f8e600e83612602565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613020602583612602565b915061302b82612fc4565b604082019050919050565b6000602082019050818103600083015261304f81613013565b9050919050565b7f4e4f545f4c495645000000000000000000000000000000000000000000000000600082015250565b600061308c600883612602565b915061309782613056565b602082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061311e602683612602565b9150613129826130c2565b604082019050919050565b6000602082019050818103600083015261314d81613111565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061318a601f83612602565b915061319582613154565b602082019050919050565b600060208201905081810360008301526131b98161317d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061321c602483612602565b9150613227826131c0565b604082019050919050565b6000602082019050818103600083015261324b8161320f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132ae602283612602565b91506132b982613252565b604082019050919050565b600060208201905081810360008301526132dd816132a1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613340602583612602565b915061334b826132e4565b604082019050919050565b6000602082019050818103600083015261336f81613333565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133d2602383612602565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613464602683612602565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006134f6602183612602565b91506135018261349a565b604082019050919050565b60006020820190508181036000830152613525816134e9565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613588602283612602565b91506135938261352c565b604082019050919050565b600060208201905081810360008301526135b78161357b565b905091905056fea2646970667358221220759c70df9b1eca8c6eed7a25a30c343d6b6abc3638387ca01f2a94056c244d4d64736f6c634300080c0033

Deployed Bytecode Sourcemap

20739:6549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22878:813;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9354:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11521:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20934:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10474:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12172:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10316:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20796:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23699:793;;;:::i;:::-;;21956:479;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13073:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25323:68;;;:::i;:::-;;25399:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19806:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21700:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10645:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3158:94;;;:::i;:::-;;20216:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2507:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21096:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9573:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25151:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21005:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13791:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10985:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:643;;;:::i;:::-;;21559:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11223:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22443:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21834:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20859:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3407:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22878:813;22956:20;23020:13;23036:21;23046:10;23036:9;:21::i;:::-;23020:37;;23075:9;23070:417;23094:8;;:15;;23090:1;:19;23070:417;;;23131:10;23144:8;;23153:1;23144:11;;;;;;;:::i;:::-;;;;;;;;23131:24;;23199:10;23178:31;;:13;:17;23192:2;23178:17;;;;;;;;;;;;;;;;;;;;;:31;;;23170:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;21047:42;23248:36;;;23293:4;23300:10;23312:2;23248:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23346:13;23356:2;23346:9;:13::i;:::-;23330:29;;;;;:::i;:::-;;;23376:54;23399:14;:26;23414:10;23399:26;;;;;;;;;;;;;;;23427:2;23376:22;:54::i;:::-;23473:1;23445:13;:17;23459:2;23445:17;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;23116:371;23111:3;;;;;:::i;:::-;;;;23070:417;;;;23499:17;23532:13;:11;:13::i;:::-;20833:19;23519:26;;;;:::i;:::-;23499:46;;23597:3;23581:12;23573:5;:20;;;;:::i;:::-;23572:28;;;;:::i;:::-;23556:44;;;;;:::i;:::-;;;23613:70;23619:10;23646:9;23631:12;:24;:51;;23670:12;23631:51;;;23658:9;23631:51;23613:5;:70::i;:::-;22945:746;;;22878:813;;:::o;9354:100::-;9408:13;9441:5;9434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:100;:::o;11521:169::-;11604:4;11621:39;11630:12;:10;:12::i;:::-;11644:7;11653:6;11621:8;:39::i;:::-;11678:4;11671:11;;11521:169;;;;:::o;20934:50::-;20982:2;20934:50;:::o;10474:108::-;10535:7;10562:12;;10555:19;;10474:108;:::o;12172:492::-;12312:4;12329:36;12339:6;12347:9;12358:6;12329:9;:36::i;:::-;12378:24;12405:11;:19;12417:6;12405:19;;;;;;;;;;;;;;;:33;12425:12;:10;:12::i;:::-;12405:33;;;;;;;;;;;;;;;;12378:60;;12477:6;12457:16;:26;;12449:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;12564:57;12573:6;12581:12;:10;:12::i;:::-;12614:6;12595:16;:25;12564:8;:57::i;:::-;12652:4;12645:11;;;12172:492;;;;;:::o;10316:93::-;10374:5;10399:2;10392:9;;10316:93;:::o;20796:56::-;20833:19;20796:56;:::o;23699:793::-;23779:1;23749:27;23765:10;23749:15;:27::i;:::-;:31;23741:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23807:20;23871:13;23887:21;23897:10;23887:9;:21::i;:::-;23871:37;;23926:9;23938:14;:26;23953:10;23938:26;;;;;;;;;;;;;;;:33;;;;23926:45;;23921:359;23977:1;23973;:5;23921:359;;;24000:10;24013:14;:26;24028:10;24013:26;;;;;;;;;;;;;;;24044:1;24040;:5;;;;:::i;:::-;24013:33;;;;;;;;:::i;:::-;;;;;;;;;;24000:46;;21047:42;24063:36;;;24108:4;24115:10;24127:2;24063:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24161:13;24171:2;24161:9;:13::i;:::-;24145:29;;;;;:::i;:::-;;;24191:14;:26;24206:10;24191:26;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24266:1;24238:13;:17;24252:2;24238:17;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;23985:295;23980:3;;;;;:::i;:::-;;;;23921:359;;;;24292:17;24325:13;:11;:13::i;:::-;20833:19;24312:26;;;;:::i;:::-;24292:46;;24390:3;24374:12;24366:5;:20;;;;:::i;:::-;24365:28;;;;:::i;:::-;24349:44;;;;;:::i;:::-;;;24414:70;24420:10;24447:9;24432:12;:24;:51;;24471:12;24432:51;;;24459:9;24432:51;24414:5;:70::i;:::-;23730:762;;;23699:793::o;21956:479::-;22016:7;22036:20;22059:1;22036:24;;22108:13;22124:17;22134:6;22124:9;:17::i;:::-;22108:33;;22154:30;22187:14;:22;22202:6;22187:22;;;;;;;;;;;;;;;22154:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22225:9;22220:121;22244:13;:20;22240:1;:24;22220:121;;;22302:27;22312:13;22326:1;22312:16;;;;;;;;:::i;:::-;;;;;;;;22302:9;:27::i;:::-;22286:43;;;;;:::i;:::-;;;22266:3;;;;;:::i;:::-;;;;22220:121;;;;22394:3;22378:12;22370:5;:20;;;;:::i;:::-;22369:28;;;;:::i;:::-;22353:44;;;;;:::i;:::-;;;22415:12;22408:19;;;;;21956:479;;;:::o;13073:215::-;13161:4;13178:80;13187:12;:10;:12::i;:::-;13201:7;13247:10;13210:11;:25;13222:12;:10;:12::i;:::-;13210:25;;;;;;;;;;;;;;;:34;13236:7;13210:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;13178:8;:80::i;:::-;13276:4;13269:11;;13073:215;;;;:::o;25323:68::-;2738:12;:10;:12::i;:::-;2727:23;;:7;:5;:7::i;:::-;:23;;;2719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25379:4:::1;;;;;;;;;;;25378:5;25371:4;;:12;;;;;;;;;;;;;;;;;;25323:68::o:0;25399:184::-;2738:12;:10;:12::i;:::-;2727:23;;:7;:5;:7::i;:::-;:23;;;2719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25470:17:::1;25503:13;:11;:13::i;:::-;20833:19;25490:26;;;;:::i;:::-;25470:46;;25527:48;25533:2;25545:9;25537:5;:17;:37;;25569:5;25537:37;;;25557:9;25537:37;25527:5;:48::i;:::-;25459:124;25399:184:::0;;:::o;19806:91::-;19862:27;19868:12;:10;:12::i;:::-;19882:6;19862:5;:27::i;:::-;19806:91;:::o;21700:126::-;21762:7;21789:14;:22;21804:6;21789:22;;;;;;;;;;;;;;;:29;;;;21782:36;;21700:126;;;:::o;10645:127::-;10719:7;10746:9;:18;10756:7;10746:18;;;;;;;;;;;;;;;;10739:25;;10645:127;;;:::o;3158:94::-;2738:12;:10;:12::i;:::-;2727:23;;:7;:5;:7::i;:::-;:23;;;2719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3223:21:::1;3241:1;3223:9;:21::i;:::-;3158:94::o:0;20216:368::-;20293:24;20320:32;20330:7;20339:12;:10;:12::i;:::-;20320:9;:32::i;:::-;20293:59;;20391:6;20371:16;:26;;20363:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;20474:58;20483:7;20492:12;:10;:12::i;:::-;20525:6;20506:16;:25;20474:8;:58::i;:::-;20554:22;20560:7;20569:6;20554:5;:22::i;:::-;20282:302;20216:368;;:::o;2507:87::-;2553:7;2580:6;;;;;;;;;;;2573:13;;2507:87;:::o;21096:24::-;;;;;;;;;;;;;:::o;9573:104::-;9629:13;9662:7;9655:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9573:104;:::o;25151:160::-;21047:42;25223:29;;:10;:29;;;25215:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;25284:19;25290:4;25296:6;25284:5;:19::i;:::-;25151:160;;:::o;21005:84::-;21047:42;21005:84;:::o;13791:413::-;13884:4;13901:24;13928:11;:25;13940:12;:10;:12::i;:::-;13928:25;;;;;;;;;;;;;;;:34;13954:7;13928:34;;;;;;;;;;;;;;;;13901:61;;14001:15;13981:16;:35;;13973:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14094:67;14103:12;:10;:12::i;:::-;14117:7;14145:15;14126:16;:34;14094:8;:67::i;:::-;14192:4;14185:11;;;13791:413;;;;:::o;10985:175::-;11071:4;11088:42;11098:12;:10;:12::i;:::-;11112:9;11123:6;11088:9;:42::i;:::-;11148:4;11141:11;;10985:175;;;;:::o;24500:643::-;24540:20;24604:13;24620:21;24630:10;24620:9;:21::i;:::-;24604:37;;24654:30;24687:14;:26;24702:10;24687:26;;;;;;;;;;;;;;;24654:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24729:9;24724:207;24748:13;:20;24744:1;:24;24724:207;;;24790:10;24803:13;24817:1;24803:16;;;;;;;;:::i;:::-;;;;;;;;24790:29;;24852:13;24862:2;24852:9;:13::i;:::-;24836:29;;;;;:::i;:::-;;;24904:15;24880:17;:21;24898:2;24880:21;;;;;;;;;;;:39;;;;24775:156;24770:3;;;;;:::i;:::-;;;;24724:207;;;;24943:17;24976:13;:11;:13::i;:::-;20833:19;24963:26;;;;:::i;:::-;24943:46;;25041:3;25025:12;25017:5;:20;;;;:::i;:::-;25016:28;;;;:::i;:::-;25000:44;;;;;:::i;:::-;;;25065:70;25071:10;25098:9;25083:12;:24;:51;;25122:12;25083:51;;;25110:9;25083:51;25065:5;:70::i;:::-;24529:614;;;;24500:643::o;21559:129::-;21622:16;21658:14;:22;21673:6;21658:22;;;;;;;;;;;;;;;21651:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21559:129;;;:::o;11223:151::-;11312:7;11339:11;:18;11351:5;11339:18;;;;;;;;;;;;;;;:27;11358:7;11339:27;;;;;;;;;;;;;;;;11332:34;;11223:151;;;;:::o;22443:427::-;21514:4;;;;;;;;;;;21506:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;22538:9:::1;22533:330;22557:8;;:15;;22553:1;:19;22533:330;;;22594:10;22607:8;;22616:1;22607:11;;;;;;;:::i;:::-;;;;;;;;22594:24;;21047:42;22633:36;;;22670:10;22690:4;22697:2;22633:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22717:14;:26;22732:10;22717:26;;;;;;;;;;;;;;;22749:2;22717:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22791:15;22767:17;:21;22785:2;22767:21;;;;;;;;;;;:39;;;;22841:10;22821:13;:17;22835:2;22821:17;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;22579:284;22574:3;;;;;:::i;:::-;;;;22533:330;;;;22443:427:::0;;:::o;21834:114::-;21891:7;21918:13;:22;21932:7;21918:22;;;;;;;;;;;;;;;;;;;;;21911:29;;21834:114;;;:::o;20859:53::-;20909:3;20859:53;:::o;3407:192::-;2738:12;:10;:12::i;:::-;2727:23;;:7;:5;:7::i;:::-;:23;;;2719:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3516:1:::1;3496:22;;:8;:22;;;;3488:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3572:19;3582:8;3572:9;:19::i;:::-;3407:192:::0;:::o;27017:268::-;27075:13;27101:15;27119:23;27135:6;27119:15;:23::i;:::-;27101:41;;27169:1;27159:7;:11;27155:25;;;27179:1;27172:8;;;;;27155:25;27205:2;27195:7;:12;27191:27;;;27216:2;27209:9;;;;;27191:27;27243:2;27233:7;:12;27229:27;;;27254:2;27247:9;;;;;27229:27;27274:3;27267:10;;;27017:268;;;;:::o;25591:983::-;25649:7;25669:21;25701:18;25740:17;:26;25758:7;25740:26;;;;;;;;;;;;25722:15;:44;;;;:::i;:::-;25701:65;;25777:17;25805:14;25857:7;25844:10;:20;25840:259;;;25893:1;25881:13;;25840:259;;;25929:7;25916:10;:20;25912:187;;;25965:2;25953:14;;25912:187;;;26002:7;25989:10;:20;25985:114;;;26038:2;26026:14;;25985:114;;;26085:2;26073:14;;25985:114;25912:187;25840:259;26124:1;26113:7;:12;:28;;;;26140:1;26129:7;:12;26113:28;:44;;;;26156:1;26145:7;:12;26113:44;:62;;;;26172:3;26161:7;:14;26113:62;:81;;;;26190:4;26179:7;:15;26113:81;:100;;;;26209:4;26198:7;:15;26113:100;:119;;;;26228:4;26217:7;:15;26113:119;:138;;;;26247:4;26236:7;:15;26113:138;:157;;;;26266:4;26255:7;:15;26113:157;:176;;;;26285:4;26274:7;:15;26113:176;26109:318;;;20909:3;26306:39;;26109:318;;;20982:2;26378:37;;26109:318;26485:7;26477:5;26461:13;26448:10;:26;;;;:::i;:::-;:34;;;;:::i;:::-;:44;;;;:::i;:::-;26439:53;;26537:3;26527:6;26515:9;:18;;;;:::i;:::-;26514:26;;;;:::i;:::-;26504:36;;;;;:::i;:::-;;;26560:6;26553:13;;;;;;25591:983;;;:::o;26582:427::-;26676:14;26693:5;:12;;;;26676:29;;26721:9;26716:286;26740:6;26736:1;:10;26716:286;;;26784:7;26772:5;26778:1;26772:8;;;;;;;;:::i;:::-;;;;;;;;;;:19;26768:223;;;26812:8;;;;;:::i;:::-;;;;26847:6;26843:1;:10;26839:83;;;26889:5;26895:6;26889:13;;;;;;;;:::i;:::-;;;;;;;;;;26878:5;26884:1;26878:8;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;26839:83;26940:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26970:5;;26768:223;26748:3;;;;;:::i;:::-;;;;26716:286;;;;26665:344;26582:427;;:::o;15714:399::-;15817:1;15798:21;;:7;:21;;;;15790:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15868:49;15897:1;15901:7;15910:6;15868:20;:49::i;:::-;15946:6;15930:12;;:22;;;;;;;:::i;:::-;;;;;;;;15985:6;15963:9;:18;15973:7;15963:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;16028:7;16007:37;;16024:1;16007:37;;;16037:6;16007:37;;;;;;:::i;:::-;;;;;;;;16057:48;16085:1;16089:7;16098:6;16057:19;:48::i;:::-;15714:399;;:::o;1295:98::-;1348:7;1375:10;1368:17;;1295:98;:::o;17475:380::-;17628:1;17611:19;;:5;:19;;;;17603:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17709:1;17690:21;;:7;:21;;;;17682:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17793:6;17763:11;:18;17775:5;17763:18;;;;;;;;;;;;;;;:27;17782:7;17763:27;;;;;;;;;;;;;;;:36;;;;17831:7;17815:32;;17824:5;17815:32;;;17840:6;17815:32;;;;;;:::i;:::-;;;;;;;;17475:380;;;:::o;14694:733::-;14852:1;14834:20;;:6;:20;;;;14826:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14936:1;14915:23;;:9;:23;;;;14907:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14991:47;15012:6;15020:9;15031:6;14991:20;:47::i;:::-;15051:21;15075:9;:17;15085:6;15075:17;;;;;;;;;;;;;;;;15051:41;;15128:6;15111:13;:23;;15103:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;15249:6;15233:13;:22;15213:9;:17;15223:6;15213:17;;;;;;;;;;;;;;;:42;;;;15301:6;15277:9;:20;15287:9;15277:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;15342:9;15325:35;;15334:6;15325:35;;;15353:6;15325:35;;;;;;:::i;:::-;;;;;;;;15373:46;15393:6;15401:9;15412:6;15373:19;:46::i;:::-;14815:612;14694:733;;;:::o;16446:591::-;16549:1;16530:21;;:7;:21;;;;16522:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16602:49;16623:7;16640:1;16644:6;16602:20;:49::i;:::-;16664:22;16689:9;:18;16699:7;16689:18;;;;;;;;;;;;;;;;16664:43;;16744:6;16726:14;:24;;16718:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16863:6;16846:14;:23;16825:9;:18;16835:7;16825:18;;;;;;;;;;;;;;;:44;;;;16907:6;16891:12;;:22;;;;;;;:::i;:::-;;;;;;;;16957:1;16931:37;;16940:7;16931:37;;;16961:6;16931:37;;;;;;:::i;:::-;;;;;;;;16981:48;17001:7;17018:1;17022:6;16981:19;:48::i;:::-;16511:526;16446:591;;:::o;3607:173::-;3663:16;3682:6;;;;;;;;;;;3663:25;;3708:8;3699:6;;:17;;;;;;;;;;;;;;;;;;3763:8;3732:40;;3753:8;3732:40;;;;;;;;;;;;3652:128;3607:173;:::o;18455:125::-;;;;:::o;19184:124::-;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:559::-;1380:6;1388;1437:2;1425:9;1416:7;1412:23;1408:32;1405:119;;;1443:79;;:::i;:::-;1405:119;1591:1;1580:9;1576:17;1563:31;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1756:80;1828:7;1819:6;1808:9;1804:22;1756:80;:::i;:::-;1738:98;;;;1534:312;1294:559;;;;;:::o;1859:99::-;1911:6;1945:5;1939:12;1929:22;;1859:99;;;:::o;1964:169::-;2048:11;2082:6;2077:3;2070:19;2122:4;2117:3;2113:14;2098:29;;1964:169;;;;:::o;2139:307::-;2207:1;2217:113;2231:6;2228:1;2225:13;2217:113;;;2316:1;2311:3;2307:11;2301:18;2297:1;2292:3;2288:11;2281:39;2253:2;2250:1;2246:10;2241:15;;2217:113;;;2348:6;2345:1;2342:13;2339:101;;;2428:1;2419:6;2414:3;2410:16;2403:27;2339:101;2188:258;2139:307;;;:::o;2452:102::-;2493:6;2544:2;2540:7;2535:2;2528:5;2524:14;2520:28;2510:38;;2452:102;;;:::o;2560:364::-;2648:3;2676:39;2709:5;2676:39;:::i;:::-;2731:71;2795:6;2790:3;2731:71;:::i;:::-;2724:78;;2811:52;2856:6;2851:3;2844:4;2837:5;2833:16;2811:52;:::i;:::-;2888:29;2910:6;2888:29;:::i;:::-;2883:3;2879:39;2872:46;;2652:272;2560:364;;;;:::o;2930:313::-;3043:4;3081:2;3070:9;3066:18;3058:26;;3130:9;3124:4;3120:20;3116:1;3105:9;3101:17;3094:47;3158:78;3231:4;3222:6;3158:78;:::i;:::-;3150:86;;2930:313;;;;:::o;3249:126::-;3286:7;3326:42;3319:5;3315:54;3304:65;;3249:126;;;:::o;3381:96::-;3418:7;3447:24;3465:5;3447:24;:::i;:::-;3436:35;;3381:96;;;:::o;3483:122::-;3556:24;3574:5;3556:24;:::i;:::-;3549:5;3546:35;3536:63;;3595:1;3592;3585:12;3536:63;3483:122;:::o;3611:139::-;3657:5;3695:6;3682:20;3673:29;;3711:33;3738:5;3711:33;:::i;:::-;3611:139;;;;:::o;3756:77::-;3793:7;3822:5;3811:16;;3756:77;;;:::o;3839:122::-;3912:24;3930:5;3912:24;:::i;:::-;3905:5;3902:35;3892:63;;3951:1;3948;3941:12;3892:63;3839:122;:::o;3967:139::-;4013:5;4051:6;4038:20;4029:29;;4067:33;4094:5;4067:33;:::i;:::-;3967:139;;;;:::o;4112:474::-;4180:6;4188;4237:2;4225:9;4216:7;4212:23;4208:32;4205:119;;;4243:79;;:::i;:::-;4205:119;4363:1;4388:53;4433:7;4424:6;4413:9;4409:22;4388:53;:::i;:::-;4378:63;;4334:117;4490:2;4516:53;4561:7;4552:6;4541:9;4537:22;4516:53;:::i;:::-;4506:63;;4461:118;4112:474;;;;;:::o;4592:90::-;4626:7;4669:5;4662:13;4655:21;4644:32;;4592:90;;;:::o;4688:109::-;4769:21;4784:5;4769:21;:::i;:::-;4764:3;4757:34;4688:109;;:::o;4803:210::-;4890:4;4928:2;4917:9;4913:18;4905:26;;4941:65;5003:1;4992:9;4988:17;4979:6;4941:65;:::i;:::-;4803:210;;;;:::o;5019:118::-;5106:24;5124:5;5106:24;:::i;:::-;5101:3;5094:37;5019:118;;:::o;5143:222::-;5236:4;5274:2;5263:9;5259:18;5251:26;;5287:71;5355:1;5344:9;5340:17;5331:6;5287:71;:::i;:::-;5143:222;;;;:::o;5371:619::-;5448:6;5456;5464;5513:2;5501:9;5492:7;5488:23;5484:32;5481:119;;;5519:79;;:::i;:::-;5481:119;5639:1;5664:53;5709:7;5700:6;5689:9;5685:22;5664:53;:::i;:::-;5654:63;;5610:117;5766:2;5792:53;5837:7;5828:6;5817:9;5813:22;5792:53;:::i;:::-;5782:63;;5737:118;5894:2;5920:53;5965:7;5956:6;5945:9;5941:22;5920:53;:::i;:::-;5910:63;;5865:118;5371:619;;;;;:::o;5996:86::-;6031:7;6071:4;6064:5;6060:16;6049:27;;5996:86;;;:::o;6088:112::-;6171:22;6187:5;6171:22;:::i;:::-;6166:3;6159:35;6088:112;;:::o;6206:214::-;6295:4;6333:2;6322:9;6318:18;6310:26;;6346:67;6410:1;6399:9;6395:17;6386:6;6346:67;:::i;:::-;6206:214;;;;:::o;6426:329::-;6485:6;6534:2;6522:9;6513:7;6509:23;6505:32;6502:119;;;6540:79;;:::i;:::-;6502:119;6660:1;6685:53;6730:7;6721:6;6710:9;6706:22;6685:53;:::i;:::-;6675:63;;6631:117;6426:329;;;;:::o;6761:::-;6820:6;6869:2;6857:9;6848:7;6844:23;6840:32;6837:119;;;6875:79;;:::i;:::-;6837:119;6995:1;7020:53;7065:7;7056:6;7045:9;7041:22;7020:53;:::i;:::-;7010:63;;6966:117;6761:329;;;;:::o;7096:118::-;7183:24;7201:5;7183:24;:::i;:::-;7178:3;7171:37;7096:118;;:::o;7220:222::-;7313:4;7351:2;7340:9;7336:18;7328:26;;7364:71;7432:1;7421:9;7417:17;7408:6;7364:71;:::i;:::-;7220:222;;;;:::o;7448:114::-;7515:6;7549:5;7543:12;7533:22;;7448:114;;;:::o;7568:184::-;7667:11;7701:6;7696:3;7689:19;7741:4;7736:3;7732:14;7717:29;;7568:184;;;;:::o;7758:132::-;7825:4;7848:3;7840:11;;7878:4;7873:3;7869:14;7861:22;;7758:132;;;:::o;7896:108::-;7973:24;7991:5;7973:24;:::i;:::-;7968:3;7961:37;7896:108;;:::o;8010:179::-;8079:10;8100:46;8142:3;8134:6;8100:46;:::i;:::-;8178:4;8173:3;8169:14;8155:28;;8010:179;;;;:::o;8195:113::-;8265:4;8297;8292:3;8288:14;8280:22;;8195:113;;;:::o;8344:732::-;8463:3;8492:54;8540:5;8492:54;:::i;:::-;8562:86;8641:6;8636:3;8562:86;:::i;:::-;8555:93;;8672:56;8722:5;8672:56;:::i;:::-;8751:7;8782:1;8767:284;8792:6;8789:1;8786:13;8767:284;;;8868:6;8862:13;8895:63;8954:3;8939:13;8895:63;:::i;:::-;8888:70;;8981:60;9034:6;8981:60;:::i;:::-;8971:70;;8827:224;8814:1;8811;8807:9;8802:14;;8767:284;;;8771:14;9067:3;9060:10;;8468:608;;;8344:732;;;;:::o;9082:373::-;9225:4;9263:2;9252:9;9248:18;9240:26;;9312:9;9306:4;9302:20;9298:1;9287:9;9283:17;9276:47;9340:108;9443:4;9434:6;9340:108;:::i;:::-;9332:116;;9082:373;;;;:::o;9461:474::-;9529:6;9537;9586:2;9574:9;9565:7;9561:23;9557:32;9554:119;;;9592:79;;:::i;:::-;9554:119;9712:1;9737:53;9782:7;9773:6;9762:9;9758:22;9737:53;:::i;:::-;9727:63;;9683:117;9839:2;9865:53;9910:7;9901:6;9890:9;9886:22;9865:53;:::i;:::-;9855:63;;9810:118;9461:474;;;;;:::o;9941:180::-;9989:77;9986:1;9979:88;10086:4;10083:1;10076:15;10110:4;10107:1;10100:15;10127:167;10267:19;10263:1;10255:6;10251:14;10244:43;10127:167;:::o;10300:366::-;10442:3;10463:67;10527:2;10522:3;10463:67;:::i;:::-;10456:74;;10539:93;10628:3;10539:93;:::i;:::-;10657:2;10652:3;10648:12;10641:19;;10300:366;;;:::o;10672:419::-;10838:4;10876:2;10865:9;10861:18;10853:26;;10925:9;10919:4;10915:20;10911:1;10900:9;10896:17;10889:47;10953:131;11079:4;10953:131;:::i;:::-;10945:139;;10672:419;;;:::o;11097:442::-;11246:4;11284:2;11273:9;11269:18;11261:26;;11297:71;11365:1;11354:9;11350:17;11341:6;11297:71;:::i;:::-;11378:72;11446:2;11435:9;11431:18;11422:6;11378:72;:::i;:::-;11460;11528:2;11517:9;11513:18;11504:6;11460:72;:::i;:::-;11097:442;;;;;;:::o;11545:180::-;11593:77;11590:1;11583:88;11690:4;11687:1;11680:15;11714:4;11711:1;11704:15;11731:305;11771:3;11790:20;11808:1;11790:20;:::i;:::-;11785:25;;11824:20;11842:1;11824:20;:::i;:::-;11819:25;;11978:1;11910:66;11906:74;11903:1;11900:81;11897:107;;;11984:18;;:::i;:::-;11897:107;12028:1;12025;12021:9;12014:16;;11731:305;;;;:::o;12042:233::-;12081:3;12104:24;12122:5;12104:24;:::i;:::-;12095:33;;12150:66;12143:5;12140:77;12137:103;;;12220:18;;:::i;:::-;12137:103;12267:1;12260:5;12256:13;12249:20;;12042:233;;;:::o;12281:191::-;12321:4;12341:20;12359:1;12341:20;:::i;:::-;12336:25;;12375:20;12393:1;12375:20;:::i;:::-;12370:25;;12414:1;12411;12408:8;12405:34;;;12419:18;;:::i;:::-;12405:34;12464:1;12461;12457:9;12449:17;;12281:191;;;;:::o;12478:348::-;12518:7;12541:20;12559:1;12541:20;:::i;:::-;12536:25;;12575:20;12593:1;12575:20;:::i;:::-;12570:25;;12763:1;12695:66;12691:74;12688:1;12685:81;12680:1;12673:9;12666:17;12662:105;12659:131;;;12770:18;;:::i;:::-;12659:131;12818:1;12815;12811:9;12800:20;;12478:348;;;;:::o;12832:180::-;12880:77;12877:1;12870:88;12977:4;12974:1;12967:15;13001:4;12998:1;12991:15;13018:185;13058:1;13075:20;13093:1;13075:20;:::i;:::-;13070:25;;13109:20;13127:1;13109:20;:::i;:::-;13104:25;;13148:1;13138:35;;13153:18;;:::i;:::-;13138:35;13195:1;13192;13188:9;13183:14;;13018:185;;;;:::o;13209:180::-;13257:77;13254:1;13247:88;13354:4;13351:1;13344:15;13378:4;13375:1;13368:15;13395:320;13439:6;13476:1;13470:4;13466:12;13456:22;;13523:1;13517:4;13513:12;13544:18;13534:81;;13600:4;13592:6;13588:17;13578:27;;13534:81;13662:2;13654:6;13651:14;13631:18;13628:38;13625:84;;;13681:18;;:::i;:::-;13625:84;13446:269;13395:320;;;:::o;13721:227::-;13861:34;13857:1;13849:6;13845:14;13838:58;13930:10;13925:2;13917:6;13913:15;13906:35;13721:227;:::o;13954:366::-;14096:3;14117:67;14181:2;14176:3;14117:67;:::i;:::-;14110:74;;14193:93;14282:3;14193:93;:::i;:::-;14311:2;14306:3;14302:12;14295:19;;13954:366;;;:::o;14326:419::-;14492:4;14530:2;14519:9;14515:18;14507:26;;14579:9;14573:4;14569:20;14565:1;14554:9;14550:17;14543:47;14607:131;14733:4;14607:131;:::i;:::-;14599:139;;14326:419;;;:::o;14751:161::-;14891:13;14887:1;14879:6;14875:14;14868:37;14751:161;:::o;14918:366::-;15060:3;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15157:93;15246:3;15157:93;:::i;:::-;15275:2;15270:3;15266:12;15259:19;;14918:366;;;:::o;15290:419::-;15456:4;15494:2;15483:9;15479:18;15471:26;;15543:9;15537:4;15533:20;15529:1;15518:9;15514:17;15507:47;15571:131;15697:4;15571:131;:::i;:::-;15563:139;;15290:419;;;:::o;15715:180::-;15763:77;15760:1;15753:88;15860:4;15857:1;15850:15;15884:4;15881:1;15874:15;15901:171;15940:3;15963:24;15981:5;15963:24;:::i;:::-;15954:33;;16009:4;16002:5;15999:15;15996:41;;;16017:18;;:::i;:::-;15996:41;16064:1;16057:5;16053:13;16046:20;;15901:171;;;:::o;16078:182::-;16218:34;16214:1;16206:6;16202:14;16195:58;16078:182;:::o;16266:366::-;16408:3;16429:67;16493:2;16488:3;16429:67;:::i;:::-;16422:74;;16505:93;16594:3;16505:93;:::i;:::-;16623:2;16618:3;16614:12;16607:19;;16266:366;;;:::o;16638:419::-;16804:4;16842:2;16831:9;16827:18;16819:26;;16891:9;16885:4;16881:20;16877:1;16866:9;16862:17;16855:47;16919:131;17045:4;16919:131;:::i;:::-;16911:139;;16638:419;;;:::o;17063:223::-;17203:34;17199:1;17191:6;17187:14;17180:58;17272:6;17267:2;17259:6;17255:15;17248:31;17063:223;:::o;17292:366::-;17434:3;17455:67;17519:2;17514:3;17455:67;:::i;:::-;17448:74;;17531:93;17620:3;17531:93;:::i;:::-;17649:2;17644:3;17640:12;17633:19;;17292:366;;;:::o;17664:419::-;17830:4;17868:2;17857:9;17853:18;17845:26;;17917:9;17911:4;17907:20;17903:1;17892:9;17888:17;17881:47;17945:131;18071:4;17945:131;:::i;:::-;17937:139;;17664:419;;;:::o;18089:164::-;18229:16;18225:1;18217:6;18213:14;18206:40;18089:164;:::o;18259:366::-;18401:3;18422:67;18486:2;18481:3;18422:67;:::i;:::-;18415:74;;18498:93;18587:3;18498:93;:::i;:::-;18616:2;18611:3;18607:12;18600:19;;18259:366;;;:::o;18631:419::-;18797:4;18835:2;18824:9;18820:18;18812:26;;18884:9;18878:4;18874:20;18870:1;18859:9;18855:17;18848:47;18912:131;19038:4;18912:131;:::i;:::-;18904:139;;18631:419;;;:::o;19056:224::-;19196:34;19192:1;19184:6;19180:14;19173:58;19265:7;19260:2;19252:6;19248:15;19241:32;19056:224;:::o;19286:366::-;19428:3;19449:67;19513:2;19508:3;19449:67;:::i;:::-;19442:74;;19525:93;19614:3;19525:93;:::i;:::-;19643:2;19638:3;19634:12;19627:19;;19286:366;;;:::o;19658:419::-;19824:4;19862:2;19851:9;19847:18;19839:26;;19911:9;19905:4;19901:20;19897:1;19886:9;19882:17;19875:47;19939:131;20065:4;19939:131;:::i;:::-;19931:139;;19658:419;;;:::o;20083:158::-;20223:10;20219:1;20211:6;20207:14;20200:34;20083:158;:::o;20247:365::-;20389:3;20410:66;20474:1;20469:3;20410:66;:::i;:::-;20403:73;;20485:93;20574:3;20485:93;:::i;:::-;20603:2;20598:3;20594:12;20587:19;;20247:365;;;:::o;20618:419::-;20784:4;20822:2;20811:9;20807:18;20799:26;;20871:9;20865:4;20861:20;20857:1;20846:9;20842:17;20835:47;20899:131;21025:4;20899:131;:::i;:::-;20891:139;;20618:419;;;:::o;21043:225::-;21183:34;21179:1;21171:6;21167:14;21160:58;21252:8;21247:2;21239:6;21235:15;21228:33;21043:225;:::o;21274:366::-;21416:3;21437:67;21501:2;21496:3;21437:67;:::i;:::-;21430:74;;21513:93;21602:3;21513:93;:::i;:::-;21631:2;21626:3;21622:12;21615:19;;21274:366;;;:::o;21646:419::-;21812:4;21850:2;21839:9;21835:18;21827:26;;21899:9;21893:4;21889:20;21885:1;21874:9;21870:17;21863:47;21927:131;22053:4;21927:131;:::i;:::-;21919:139;;21646:419;;;:::o;22071:181::-;22211:33;22207:1;22199:6;22195:14;22188:57;22071:181;:::o;22258:366::-;22400:3;22421:67;22485:2;22480:3;22421:67;:::i;:::-;22414:74;;22497:93;22586:3;22497:93;:::i;:::-;22615:2;22610:3;22606:12;22599:19;;22258:366;;;:::o;22630:419::-;22796:4;22834:2;22823:9;22819:18;22811:26;;22883:9;22877:4;22873:20;22869:1;22858:9;22854:17;22847:47;22911:131;23037:4;22911:131;:::i;:::-;22903:139;;22630:419;;;:::o;23055:223::-;23195:34;23191:1;23183:6;23179:14;23172:58;23264:6;23259:2;23251:6;23247:15;23240:31;23055:223;:::o;23284:366::-;23426:3;23447:67;23511:2;23506:3;23447:67;:::i;:::-;23440:74;;23523:93;23612:3;23523:93;:::i;:::-;23641:2;23636:3;23632:12;23625:19;;23284:366;;;:::o;23656:419::-;23822:4;23860:2;23849:9;23845:18;23837:26;;23909:9;23903:4;23899:20;23895:1;23884:9;23880:17;23873:47;23937:131;24063:4;23937:131;:::i;:::-;23929:139;;23656:419;;;:::o;24081:221::-;24221:34;24217:1;24209:6;24205:14;24198:58;24290:4;24285:2;24277:6;24273:15;24266:29;24081:221;:::o;24308:366::-;24450:3;24471:67;24535:2;24530:3;24471:67;:::i;:::-;24464:74;;24547:93;24636:3;24547:93;:::i;:::-;24665:2;24660:3;24656:12;24649:19;;24308:366;;;:::o;24680:419::-;24846:4;24884:2;24873:9;24869:18;24861:26;;24933:9;24927:4;24923:20;24919:1;24908:9;24904:17;24897:47;24961:131;25087:4;24961:131;:::i;:::-;24953:139;;24680:419;;;:::o;25105:224::-;25245:34;25241:1;25233:6;25229:14;25222:58;25314:7;25309:2;25301:6;25297:15;25290:32;25105:224;:::o;25335:366::-;25477:3;25498:67;25562:2;25557:3;25498:67;:::i;:::-;25491:74;;25574:93;25663:3;25574:93;:::i;:::-;25692:2;25687:3;25683:12;25676:19;;25335:366;;;:::o;25707:419::-;25873:4;25911:2;25900:9;25896:18;25888:26;;25960:9;25954:4;25950:20;25946:1;25935:9;25931:17;25924:47;25988:131;26114:4;25988:131;:::i;:::-;25980:139;;25707:419;;;:::o;26132:222::-;26272:34;26268:1;26260:6;26256:14;26249:58;26341:5;26336:2;26328:6;26324:15;26317:30;26132:222;:::o;26360:366::-;26502:3;26523:67;26587:2;26582:3;26523:67;:::i;:::-;26516:74;;26599:93;26688:3;26599:93;:::i;:::-;26717:2;26712:3;26708:12;26701:19;;26360:366;;;:::o;26732:419::-;26898:4;26936:2;26925:9;26921:18;26913:26;;26985:9;26979:4;26975:20;26971:1;26960:9;26956:17;26949:47;27013:131;27139:4;27013:131;:::i;:::-;27005:139;;26732:419;;;:::o;27157:225::-;27297:34;27293:1;27285:6;27281:14;27274:58;27366:8;27361:2;27353:6;27349:15;27342:33;27157:225;:::o;27388:366::-;27530:3;27551:67;27615:2;27610:3;27551:67;:::i;:::-;27544:74;;27627:93;27716:3;27627:93;:::i;:::-;27745:2;27740:3;27736:12;27729:19;;27388:366;;;:::o;27760:419::-;27926:4;27964:2;27953:9;27949:18;27941:26;;28013:9;28007:4;28003:20;27999:1;27988:9;27984:17;27977:47;28041:131;28167:4;28041:131;:::i;:::-;28033:139;;27760:419;;;:::o;28185:220::-;28325:34;28321:1;28313:6;28309:14;28302:58;28394:3;28389:2;28381:6;28377:15;28370:28;28185:220;:::o;28411:366::-;28553:3;28574:67;28638:2;28633:3;28574:67;:::i;:::-;28567:74;;28650:93;28739:3;28650:93;:::i;:::-;28768:2;28763:3;28759:12;28752:19;;28411:366;;;:::o;28783:419::-;28949:4;28987:2;28976:9;28972:18;28964:26;;29036:9;29030:4;29026:20;29022:1;29011:9;29007:17;29000:47;29064:131;29190:4;29064:131;:::i;:::-;29056:139;;28783:419;;;:::o;29208:221::-;29348:34;29344:1;29336:6;29332:14;29325:58;29417:4;29412:2;29404:6;29400:15;29393:29;29208:221;:::o;29435:366::-;29577:3;29598:67;29662:2;29657:3;29598:67;:::i;:::-;29591:74;;29674:93;29763:3;29674:93;:::i;:::-;29792:2;29787:3;29783:12;29776:19;;29435:366;;;:::o;29807:419::-;29973:4;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29807:419;;;:::o

Swarm Source

ipfs://759c70df9b1eca8c6eed7a25a30c343d6b6abc3638387ca01f2a94056c244d4d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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