ETH Price: $1,481.42 (-17.45%)

Token

SaasNode (SAAS)
 

Overview

Max Total Supply

1,000,000,000 SAAS

Holders

34

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
14,788,045.378840115650467889 SAAS

Value
$0.00
0x19995b9b668ae904923f1a399b065c830b3094c6
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:
SAAS

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

//Twitter: https://twitter.com/SAASNode

//Whitepaper: https://drive.google.com/file/d/1ZcCYG4Jic8cTpV9oUJaeSo23cVwkLXJH/view

//Website: https://thesaasnode.com/

//Telegranm: http://t.me/SAASNode

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#.,(.*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*..,(...(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(....,(....,&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,.....,(......(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(.......,(........%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.........,(.........(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@&/..........,(...........%@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@#,...........,(............*&@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@&,.............,(..............%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@#,..............,(...............*&@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@&*................,(.................(@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@(..................,(..................,&@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@&*...................,(....................(&@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@&(.....................,(......................%@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@%.......................,(......................./&@@@@@@@@@@@@@@
// @@@@@@@@@@@@@&/........................,(........................,%@@@@@@@@@@@@@
// @@@@@@@@@@@&%,.........................,(........................../&@@@@@@@@@@@
// @@@@@@@@@@&*.......................*/((*#*((*........................#@@@@@@@@@@
// @@@@@@@@@%....................*%(*******#,,,,,,*%(....................*&@@@@@@@@
// @@@@@@@&*...............*#(/************#,,,,,,,,,,,*/((................#@@@@@@@
// @@@@@@(...........,/#(******************#,,,,,,,,,,,,,,,,,*#(,...........,&@@@@@
// @@@@%,.......*%(/***********************#,,,,,,,,,,,,,,,,,,,,,,,*#(........#@@@@
// @@&(...*(#(*****************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,*((*...,%@@
// @%/#(***********************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*#(#@
// @@&#/***********************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(%@@
// @@@@@@&%(*******************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*#&@@@@@@
// @@@@@@@@@@@&#***************************#,,,,,,,,,,,,,,,,,,,,,,,,,,/%&@@@@@@@@@@
// @&&%@@@@@@@@@@@&#/**********************#,,,,,,,,,,,,,,,,,,,,,*(&@@@@@@@@@@@&%&@
// @@@&/.*%&@@@@@@@@@@&&(******************#,,,,,,,,,,,,,,,,,*%&@@@@@@@@@@&&(,,%@@@
// @@@@@%*...,(&&@@@@@@@@@@&#/*************#,,,,,,,,,,,,,/%&@@@@@@@@@@&%/,,,,#@@@@@
// @@@@@@@%,......(%&@@@@@@@@@@&%/*********#,,,,,,,,*(&&@@@@@@@@@@&#*,,,,,,(&@@@@@@
// @@@@@@@@@%........,*%&@@@@@@@@@@@&(*****#,,,,/%&@@@@@@@@@@@&(*,,,,,,,,(&@@@@@@@@
// @@@@@@@@@@&(...........*#&@@@@@@@@@@@&#/#(%@@@@@@@@@@@&%(,,,,,,,,,,,/&@@@@@@@@@@
// @@@@@@@@@@@@&/..............(&@@@@@@@@@@@@@@@@@@@@&%*,,,,,,,,,,,,,,%@@@@@@@@@@@@
// @@@@@@@@@@@@@@&*...............,/%&@@@@@@@@@@@&#*,,,,,,,,,,,,,,,,#@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@&,..................*%&@@@%(,,,,,,,,,,,,,,,,,,,(&@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@%....................,#,,,,,,,,,,,,,,,,,,,,/&@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@&(..................,#,,,,,,,,,,,,,,,,,,*&@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@&/................,#,,,,,,,,,,,,,,,,,%@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@&*..............,#,,,,,,,,,,,,,,,#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@%,............,#,,,,,,,,,,,,,(&@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@#...........,#,,,,,,,,,,,/&@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@&(.........,#,,,,,,,,,*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&/.......,#,,,,,,,,%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*.....,#,,,,,,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,...,#,,,,(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..,#,,/&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(,#*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

pragma solidity ^0.8.14;

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

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (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);
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

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

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

////// src/IUniswapV2Factory.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract SAAS is ERC20, Ownable {
    using SafeMath for uint256;

    modifier lockSwap() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    modifier liquidityAdd() {
        _inLiquidityAdd = true;
        _;
        _inLiquidityAdd = false;
    }

    // == CONSTANTS ==
    uint256 public constant MAX_SUPPLY = 1_000_000_000 ether;
    uint256 public constant BPS_DENOMINATOR = 10_000;
    uint256 public constant SNIPE_BLOCKS = 2;

    // == TAXES ==
    /// @notice Buy devTax in BPS
    uint256 public buyDevTax = 200;
    /// @notice Buy rewardsTax in BPS
    uint256 public buyRewardsTax = 700;
    /// @notice Sell devTax in BPS
    uint256 public sellDevTax = 200;
    /// @notice Sell rewardsTax in BPS
    uint256 public sellRewardsTax = 700;
    /// @notice address that devTax is sent to
    address payable public devTaxRecipient;
    /// @notice address that rewardsTax is sent to
    address payable public rewardsTaxRecipient;
    /// @notice tokens currently allocated for devTax
    uint256 public totalDevTax;
    /// @notice tokens currently allocated for rewardsTax
    uint256 public totalRewardsTax;

    // == FLAGS ==
    /// @notice flag indicating whether initialDistribute() was successfully called
    bool public initialDistributeDone = false;
    /// @notice flag indicating Uniswap trading status
    bool public tradingActive = false;
    /// @notice flag indicating token to token transfers
    bool public transfersActive = false;
    /// @notice flag indicating swapAll enabled
    bool public swapFees = true;

    // == UNISWAP ==
    IUniswapV2Router02 public router;
    address public pair;

    // == WALLET STATUSES ==
    /// @notice Maps each recipient to their tax exlcusion status
    mapping(address => bool) public taxExcluded;
    /// @notice Maps each recipient to the last timestamp they bought
    mapping(address => uint256) public lastBuy;
    /// @notice Maps each recipient to their blacklist status
    mapping(address => bool) public blacklist;
    /// @notice Maps each recipient to their whitelist status on buy limit
    mapping(address => bool) public recipientLimitWhitelist;

    // == MISC ==
    /// @notice Block when trading is first enabled
    uint256 public tradingBlock;
    /// @notice Contract token balance threshold before `_swap` is invoked
    uint256 public minTokenBalance = 1000 ether;

    // == INTERNAL ==
    uint256 internal _totalSupply = 0;
    bool internal _inSwap = false;
    bool internal _inLiquidityAdd = false;
    mapping(address => uint256) private _balances;

    event DevTaxRecipientChanged(
        address previousRecipient,
        address nextRecipient
    );
    event RewardsTaxRecipientChanged(
        address previousRecipient,
        address nextRecipient
    );
    event BuyDevTaxChanged(uint256 previousTax, uint256 nextTax);
    event SellDevTaxChanged(uint256 previousTax, uint256 nextTax);
    event BuyRewardsTaxChanged(uint256 previousTax, uint256 nextTax);
    event SellRewardsTaxChanged(uint256 previousTax, uint256 nextTax);
    event DevTaxRescued(uint256 amount);
    event RewardsTaxRescued(uint256 amount);
    event TradingActiveChanged(bool enabled);
    event TaxExclusionChanged(address user, bool taxExcluded);
    event BlacklistUpdated(address user, bool previousStatus, bool nextStatus);
    event SwapFeesChanged(bool previousStatus, bool nextStatus);

    constructor(
        address payable _devTaxRecipient,
        address payable _rewardsTaxRecipient
    ) ERC20("SaasNode", "SAAS") Ownable() {
        taxExcluded[owner()] = true;
        taxExcluded[address(0)] = true;
        taxExcluded[_devTaxRecipient] = true;
        taxExcluded[_rewardsTaxRecipient] = true;
        taxExcluded[address(this)] = true;

        devTaxRecipient = _devTaxRecipient;
        rewardsTaxRecipient = _rewardsTaxRecipient;

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());

        _mint(msg.sender, MAX_SUPPLY);
    }

    function addLiquidity(uint256 tokens)
        external
        payable
        onlyOwner
        liquidityAdd
    {
        _rawTransfer(msg.sender, address(this), tokens);
        _approve(address(this), address(router), tokens);

        router.addLiquidityETH{value: msg.value}(
            address(this),
            tokens,
            0,
            0,
            owner(),
            // solhint-disable-next-line not-rely-on-time
            block.timestamp
        );
    }

    /// @notice Change the address of the devTax recipient
    /// @param _devTaxRecipient The new address of the devTax recipient
    function setDevTaxRecipient(address payable _devTaxRecipient)
        external
        onlyOwner
    {
        emit DevTaxRecipientChanged(devTaxRecipient, _devTaxRecipient);
        devTaxRecipient = _devTaxRecipient;
    }

    /// @notice Change the address of the rewardTax recipient
    /// @param _rewardsTaxRecipient The new address of the rewardTax recipient
    function setRewardsTaxRecipient(address payable _rewardsTaxRecipient)
        external
        onlyOwner
    {
        emit RewardsTaxRecipientChanged(
            rewardsTaxRecipient,
            _rewardsTaxRecipient
        );
        rewardsTaxRecipient = _rewardsTaxRecipient;
    }

    /// @notice Change the buy devTax rate
    /// @param _buyDevTax The new devTax rate
    function setBuyDevTax(uint256 _buyDevTax) external onlyOwner {
        require(
            _buyDevTax <= BPS_DENOMINATOR,
            "_buyDevTax cannot exceed BPS_DENOMINATOR"
        );
        emit BuyDevTaxChanged(buyDevTax, _buyDevTax);
        buyDevTax = _buyDevTax;
    }

    /// @notice Change the buy devTax rate
    /// @param _sellDevTax The new devTax rate
    function setSellDevTax(uint256 _sellDevTax) external onlyOwner {
        require(
            _sellDevTax <= BPS_DENOMINATOR,
            "_sellDevTax cannot exceed BPS_DENOMINATOR"
        );
        emit SellDevTaxChanged(sellDevTax, _sellDevTax);
        sellDevTax = _sellDevTax;
    }

    /// @notice Change the buy rewardsTax rate
    /// @param _buyRewardsTax The new buy rewardsTax rate
    function setBuyRewardsTax(uint256 _buyRewardsTax) external onlyOwner {
        require(
            _buyRewardsTax <= BPS_DENOMINATOR,
            "_buyRewardsTax cannot exceed BPS_DENOMINATOR"
        );
        emit BuyRewardsTaxChanged(buyRewardsTax, _buyRewardsTax);
        buyRewardsTax = _buyRewardsTax;
    }

    /// @notice Change the sell rewardsTax rate
    /// @param _sellRewardsTax The new sell rewardsTax rate
    function setSellRewardsTax(uint256 _sellRewardsTax) external onlyOwner {
        require(
            _sellRewardsTax <= BPS_DENOMINATOR,
            "_sellRewardsTax cannot exceed BPS_DENOMINATOR"
        );
        emit SellRewardsTaxChanged(sellRewardsTax, _sellRewardsTax);
        sellRewardsTax = _sellRewardsTax;
    }

    /// @notice Rescue ATI from the devTax amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of ATI to rescue
    /// @param _recipient The recipient of the rescued ATI
    function rescueDevTaxTokens(uint256 _amount, address _recipient)
        external
        onlyOwner
    {
        require(
            _amount <= totalDevTax,
            "Amount cannot be greater than totalDevTax"
        );
        _rawTransfer(address(this), _recipient, _amount);
        emit DevTaxRescued(_amount);
        totalDevTax -= _amount;
    }

    /// @notice Rescue ATI from the rewardsTax amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of ATI to rescue
    /// @param _recipient The recipient of the rescued ATI
    function rescueRewardsTaxTokens(uint256 _amount, address _recipient)
        external
        onlyOwner
    {
        require(
            _amount <= totalRewardsTax,
            "Amount cannot be greater than totalRewardsTax"
        );
        _rawTransfer(address(this), _recipient, _amount);
        emit RewardsTaxRescued(_amount);
        totalRewardsTax -= _amount;
    }

    /// @notice Admin function to update a recipient's blacklist status
    /// @param user the recipient
    /// @param status the new status
    function updateBlacklist(address user, bool status)
        external
        virtual
        onlyOwner
    {
        _updateBlacklist(user, status);
    }

    function _updateBlacklist(address user, bool status) internal virtual {
        emit BlacklistUpdated(user, blacklist[user], status);
        blacklist[user] = status;
    }

    /// @notice Enables trading on Uniswap
    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    /// @notice Disables trading on Uniswap
    function disableTrading() external onlyOwner {
        tradingActive = false;
    }

    /// @notice Enables token to token transfers
    function enableTransfers() external onlyOwner {
        transfersActive = true;
    }

    /// @notice Disables token to token transfers
    function disableTransfers() external onlyOwner {
        transfersActive = false;
    }

    /// @notice Updates tax exclusion status
    /// @param _account Account to update the tax exclusion status of
    /// @param _taxExcluded If true, exclude taxes for this user
    function setTaxExcluded(address _account, bool _taxExcluded)
        public
        onlyOwner
    {
        taxExcluded[_account] = _taxExcluded;
        emit TaxExclusionChanged(_account, _taxExcluded);
    }

    /// @notice Enable or disable whether swap occurs during `_transfer`
    /// @param _swapFees If true, enables swap during `_transfer`
    function setSwapFees(bool _swapFees) external onlyOwner {
        emit SwapFeesChanged(swapFees, _swapFees);
        swapFees = _swapFees;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function _addBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] + amount;
    }

    function _subtractBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] - amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(!blacklist[recipient], "Recipient is blacklisted");

        if (taxExcluded[sender] || taxExcluded[recipient]) {
            _rawTransfer(sender, recipient, amount);
            return;
        }

        bool overMinTokenBalance = balanceOf(address(this)) >= minTokenBalance;
        if (overMinTokenBalance && !_inSwap && sender != pair && swapFees) {
            swapAll();
        }

        uint256 send = amount;
        uint256 devTax;
        uint256 rewardsTax;
        if (sender == pair) {
            require(tradingActive, "Trading is not yet active");
            if (block.number <= tradingBlock + SNIPE_BLOCKS) {
                _updateBlacklist(recipient, true);
            }
            (send, devTax, rewardsTax) = _getTaxAmounts(amount, true);
        } else if (recipient == pair) {
            require(tradingActive, "Trading is not yet active");
            (send, devTax, rewardsTax) = _getTaxAmounts(amount, false);
        } else {
            require(transfersActive, "Transfers are not yet active");
        }
        _rawTransfer(sender, recipient, send);
        _takeTaxes(sender, devTax, rewardsTax);
    }

    /// @notice Peforms auto liquidity and tax distribution
    function swapAll() public {
        if (!_inSwap) {
            _swap(balanceOf(address(this)));
        }
    }

    /// @notice Perform a Uniswap v2 swap from token to ETH and handle tax distribution
    /// @param amount The amount of token to swap in wei
    /// @dev `amount` is always <= this contract's ETH balance.
    function _swap(uint256 amount) internal lockSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), amount);

        uint256 contractEthBalance = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 tradeValue = address(this).balance - contractEthBalance;

        uint256 totalTaxes = totalDevTax.add(totalRewardsTax);
        uint256 devAmount = amount.mul(totalDevTax).div(totalTaxes);
        uint256 rewardsAmount = amount.mul(totalRewardsTax).div(totalTaxes);

        uint256 devEth = tradeValue.mul(totalDevTax).div(totalTaxes);
        uint256 rewardsEth = tradeValue.mul(totalRewardsTax).div(totalTaxes);

        // Update state
        totalDevTax = totalDevTax.sub(devAmount);
        totalRewardsTax = totalRewardsTax.sub(rewardsAmount);

        // Do transfer
        if (devEth > 0) {
            devTaxRecipient.transfer(devEth);
        }
        if (rewardsEth > 0) {
            rewardsTaxRecipient.transfer(rewardsEth);
        }
    }

    /// @notice Change the minimum contract ACAP balance before `_swap` gets invoked
    /// @param _minTokenBalance The new minimum balance
    function setMinTokenBalance(uint256 _minTokenBalance) external onlyOwner {
        minTokenBalance = _minTokenBalance;
    }

    /// @notice Admin function to rescue ETH from the contract
    function rescueETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /// @notice Transfers ATI from an account to this contract for taxes
    /// @param _account The account to transfer ATI from
    /// @param _devTaxAmount The amount of devTax tax to transfer
    function _takeTaxes(
        address _account,
        uint256 _devTaxAmount,
        uint256 _rewardsTaxAmount
    ) internal {
        require(_account != address(0), "taxation from the zero address");

        uint256 totalAmount = _devTaxAmount.add(_rewardsTaxAmount);
        _rawTransfer(_account, address(this), totalAmount);
        totalDevTax += _devTaxAmount;
        totalRewardsTax += _rewardsTaxAmount;
    }

    /// @notice Get a breakdown of send and tax amounts
    /// @param amount The amount to tax in wei
    /// @return send The raw amount to send
    /// @return devTax The raw devTax tax amount
    function _getTaxAmounts(uint256 amount, bool buying)
        internal
        view
        returns (
            uint256 send,
            uint256 devTax,
            uint256 rewardsTax
        )
    {
        if (buying) {
            devTax = amount.mul(buyDevTax).div(BPS_DENOMINATOR);
            rewardsTax = amount.mul(buyRewardsTax).div(BPS_DENOMINATOR);
        } else {
            devTax = amount.mul(sellDevTax).div(BPS_DENOMINATOR);
            rewardsTax = amount.mul(sellRewardsTax).div(BPS_DENOMINATOR);
        }
        send = amount.sub(devTax).sub(rewardsTax);
    }

    // modified from OpenZeppelin ERC20
    function _rawTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(sender != address(0), "transfer from the zero address");
        require(recipient != address(0), "transfer to the zero address");

        uint256 senderBalance = balanceOf(sender);
        require(senderBalance >= amount, "transfer amount exceeds balance");
        unchecked {
            _subtractBalance(sender, amount);
        }
        _addBalance(recipient, amount);

        emit Transfer(sender, recipient, amount);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function _mint(address account, uint256 amount) internal override {
        require(_totalSupply.add(amount) <= MAX_SUPPLY, "Max supply exceeded");
        _totalSupply += amount;
        _addBalance(account, amount);
        emit Transfer(address(0), account, amount);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"_devTaxRecipient","type":"address"},{"internalType":"address payable","name":"_rewardsTaxRecipient","type":"address"}],"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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"BuyDevTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"BuyRewardsTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"nextRecipient","type":"address"}],"name":"DevTaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DevTaxRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"nextRecipient","type":"address"}],"name":"RewardsTaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTaxRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"SellDevTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"SellRewardsTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"SwapFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"taxExcluded","type":"bool"}],"name":"TaxExclusionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradingActiveChanged","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":"BPS_DENOMINATOR","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":"SNIPE_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","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":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"devTaxRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTransfers","outputs":[],"stateMutability":"nonpayable","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":"initialDistributeDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recipientLimitWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueDevTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueRewardsTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsTaxRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyDevTax","type":"uint256"}],"name":"setBuyDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyRewardsTax","type":"uint256"}],"name":"setBuyRewardsTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devTaxRecipient","type":"address"}],"name":"setDevTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenBalance","type":"uint256"}],"name":"setMinTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_rewardsTaxRecipient","type":"address"}],"name":"setRewardsTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellDevTax","type":"uint256"}],"name":"setSellDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellRewardsTax","type":"uint256"}],"name":"setSellRewardsTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapFees","type":"bool"}],"name":"setSwapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_taxExcluded","type":"bool"}],"name":"setTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingBlock","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":"transfersActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260c86006556102bc60075560c86008556102bc6009556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506001600e60036101000a81548160ff021916908315150217905550683635c9adc5dea0000060155560006016556000601760006101000a81548160ff0219169083151502179055506000601760016101000a81548160ff021916908315150217905550348015620000db57600080fd5b50604051620057ef380380620057ef833981810160405281019062000101919062000a32565b6040518060400160405280600881526020017f536161734e6f64650000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534141530000000000000000000000000000000000000000000000000000000081525081600390805190602001906200018592919062000918565b5080600490805190602001906200019e92919062000918565b505050620001c1620001b56200066e60201b60201c565b6200067660201b60201c565b600160106000620001d76200073c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600e60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f3919062000abe565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200057d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a3919062000abe565b6040518363ffffffff1660e01b8152600401620005c292919062000b01565b6020604051808303816000875af1158015620005e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000608919062000abe565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000666336b033b2e3c9fd0803ce80000006200076660201b60201c565b505062000cd9565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6b033b2e3c9fd0803ce80000006200078f826016546200086c60201b6200259e1790919060201c565b1115620007d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007ca9062000b8f565b60405180910390fd5b8060166000828254620007e7919062000bea565b925050819055506200080082826200088460201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000860919062000c58565b60405180910390a35050565b600081836200087c919062000bea565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008d1919062000bea565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b828054620009269062000ca4565b90600052602060002090601f0160209004810192826200094a576000855562000996565b82601f106200096557805160ff191683800117855562000996565b8280016001018555821562000996579182015b828111156200099557825182559160200191906001019062000978565b5b509050620009a59190620009a9565b5090565b5b80821115620009c4576000816000905550600101620009aa565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009fa82620009cd565b9050919050565b62000a0c81620009ed565b811462000a1857600080fd5b50565b60008151905062000a2c8162000a01565b92915050565b6000806040838503121562000a4c5762000a4b620009c8565b5b600062000a5c8582860162000a1b565b925050602062000a6f8582860162000a1b565b9150509250929050565b600062000a8682620009cd565b9050919050565b62000a988162000a79565b811462000aa457600080fd5b50565b60008151905062000ab88162000a8d565b92915050565b60006020828403121562000ad75762000ad6620009c8565b5b600062000ae78482850162000aa7565b91505092915050565b62000afb8162000a79565b82525050565b600060408201905062000b18600083018562000af0565b62000b27602083018462000af0565b9392505050565b600082825260208201905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600062000b7760138362000b2e565b915062000b848262000b3f565b602082019050919050565b6000602082019050818103600083015262000baa8162000b68565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bf78262000bb1565b915062000c048362000bb1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c3c5762000c3b62000bbb565b5b828201905092915050565b62000c528162000bb1565b82525050565b600060208201905062000c6f600083018462000c47565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cbd57607f821691505b60208210810362000cd35762000cd262000c75565b5b50919050565b614b068062000ce96000396000f3fe60806040526004361061036f5760003560e01c80639155e083116101c6578063be691883116100f7578063ed00c02511610095578063f2fde38b1161006f578063f2fde38b14610c3a578063f887ea4014610c63578063f9f92be414610c8e578063fe033fda14610ccb57610376565b8063ed00c02514610bbb578063f016d83b14610be4578063f29e448614610c0f57610376565b8063db12c8b6116100d1578063db12c8b614610b01578063dd62ed3e14610b2a578063e1a4521814610b67578063e3f9fc6314610b9257610376565b8063be69188314610a6e578063c1adf7bc14610a99578063cd51e6d414610ad657610376565b8063a9059cbb11610164578063b082c19a1161013e578063b082c19a146109c6578063b0ac1571146109ef578063b9ccf21d14610a18578063bbc0c74214610a4357610376565b8063a9059cbb14610947578063af35c6c714610984578063af8f26e71461099b57610376565b8063967a3a10116101a0578063967a3a1014610879578063a3e8730e146108b6578063a457c2d7146108df578063a8aa1b311461091c57610376565b80639155e083146107fa5780639207cc5d1461082357806395d89b411461084e57610376565b80633a67a0f6116102a05780635d20d9181161023e578063715018a611610218578063715018a6146107785780637db557e31461078f5780638a8c523c146107b85780638da5cb5b146107cf57610376565b80635d20d918146106e75780636053b8811461071057806370a082311461073b57610376565b80634c6d1cd81161027a5780634c6d1cd81461064c57806351c6590a146106755780635a686d54146106915780635b78f35f146106bc57610376565b80633a67a0f6146105f35780633e9ffbea1461060a5780633f651a5f1461062157610376565b80632433c0781161030d578063313ce567116102e7578063313ce5671461052357806332cb6b0c1461054e578063395093511461057957806339b622d3146105b657610376565b80632433c078146104a257806325edf518146104cd5780632f1e3e82146104f857610376565b806318160ddd1161034957806318160ddd146103fa57806319c2c40d1461042557806320800a001461044e57806323b872dd1461046557610376565b806306fdde031461037b578063095ea7b3146103a657806317700f01146103e357610376565b3661037657005b600080fd5b34801561038757600080fd5b50610390610cf4565b60405161039d919061370e565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c891906137c9565b610d86565b6040516103da9190613824565b60405180910390f35b3480156103ef57600080fd5b506103f8610da4565b005b34801561040657600080fd5b5061040f610e3d565b60405161041c919061384e565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613895565b610e47565b005b34801561045a57600080fd5b50610463610f57565b005b34801561047157600080fd5b5061048c600480360381019061048791906138d5565b611023565b6040516104999190613824565b60405180910390f35b3480156104ae57600080fd5b506104b761111b565b6040516104c49190613949565b60405180910390f35b3480156104d957600080fd5b506104e2611141565b6040516104ef919061384e565b60405180910390f35b34801561050457600080fd5b5061050d611147565b60405161051a919061384e565b60405180910390f35b34801561052f57600080fd5b5061053861114d565b6040516105459190613980565b60405180910390f35b34801561055a57600080fd5b50610563611156565b604051610570919061384e565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b91906137c9565b611166565b6040516105ad9190613824565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061399b565b611212565b6040516105ea9190613824565b60405180910390f35b3480156105ff57600080fd5b50610608611232565b005b34801561061657600080fd5b5061061f6112cb565b005b34801561062d57600080fd5b506106366112f3565b6040516106439190613949565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e91906139c8565b611319565b005b61068f600480360381019061068a91906139c8565b61141f565b005b34801561069d57600080fd5b506106a66115c0565b6040516106b3919061384e565b60405180910390f35b3480156106c857600080fd5b506106d16115c6565b6040516106de919061384e565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906139c8565b6115cc565b005b34801561071c57600080fd5b506107256116d2565b604051610732919061384e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d919061399b565b6116d8565b60405161076f919061384e565b60405180910390f35b34801561078457600080fd5b5061078d611721565b005b34801561079b57600080fd5b506107b660048036038101906107b191906139c8565b6117a9565b005b3480156107c457600080fd5b506107cd6118af565b005b3480156107db57600080fd5b506107e4611948565b6040516107f19190613a04565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613895565b611972565b005b34801561082f57600080fd5b506108386119fc565b6040516108459190613824565b60405180910390f35b34801561085a57600080fd5b50610863611a0f565b604051610870919061370e565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b919061399b565b611aa1565b6040516108ad9190613824565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906139c8565b611ac1565b005b3480156108eb57600080fd5b50610906600480360381019061090191906137c9565b611bc7565b6040516109139190613824565b60405180910390f35b34801561092857600080fd5b50610931611cb2565b60405161093e9190613a04565b60405180910390f35b34801561095357600080fd5b5061096e600480360381019061096991906137c9565b611cd8565b60405161097b9190613824565b60405180910390f35b34801561099057600080fd5b50610999611cf6565b005b3480156109a757600080fd5b506109b0611d8f565b6040516109bd919061384e565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613a1f565b611d95565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906139c8565b611eb5565b005b348015610a2457600080fd5b50610a2d611f3b565b604051610a3a9190613824565b60405180910390f35b348015610a4f57600080fd5b50610a58611f4e565b604051610a659190613824565b60405180910390f35b348015610a7a57600080fd5b50610a83611f61565b604051610a90919061384e565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061399b565b611f67565b604051610acd919061384e565b60405180910390f35b348015610ae257600080fd5b50610aeb611f7f565b604051610af8919061384e565b60405180910390f35b348015610b0d57600080fd5b50610b286004803603810190610b239190613a8b565b611f85565b005b348015610b3657600080fd5b50610b516004803603810190610b4c9190613ab8565b6120a0565b604051610b5e919061384e565b60405180910390f35b348015610b7357600080fd5b50610b7c612127565b604051610b89919061384e565b60405180910390f35b348015610b9e57600080fd5b50610bb96004803603810190610bb49190613af8565b61212d565b005b348015610bc757600080fd5b50610be26004803603810190610bdd9190613a1f565b61220e565b005b348015610bf057600080fd5b50610bf961232e565b604051610c06919061384e565b60405180910390f35b348015610c1b57600080fd5b50610c24612333565b604051610c319190613824565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c919061399b565b612346565b005b348015610c6f57600080fd5b50610c7861243d565b604051610c859190613b84565b60405180910390f35b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061399b565b612463565b604051610cc29190613824565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190613a8b565b612483565b005b606060038054610d0390613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90613bce565b8015610d7c5780601f10610d5157610100808354040283529160200191610d7c565b820191906000526020600020905b815481529060010190602001808311610d5f57829003601f168201915b5050505050905090565b6000610d9a610d936125b4565b84846125bc565b6001905092915050565b610dac6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610dca611948565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613c4b565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b6000601654905090565b610e4f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610e6d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613c4b565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610f4b929190613c6b565b60405180910390a15050565b610f5f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610f7d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613c4b565b60405180910390fd5b610fdb611948565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611020573d6000803e3d6000fd5b50565b6000611030848484612785565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061107b6125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d06565b60405180910390fd5b61110f856111076125b4565b8584036125bc565b60019150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600d5481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b60006112086111736125b4565b8484600160006111816125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112039190613d55565b6125bc565b6001905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b61123a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611258611948565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c4b565b60405180910390fd5b6000600e60026101000a81548160ff021916908315150217905550565b601760009054906101000a900460ff166112f1576112f06112eb306116d8565b612b8e565b5b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113216125b4565b73ffffffffffffffffffffffffffffffffffffffff1661133f611948565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613c4b565b60405180910390fd5b6127108111156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613e1d565b60405180910390fd5b7f329f5e7109b9e04ed6c5230453b1f7e26c4b2d5cca1b3905f5d9568673a9e9fe6007548260405161140d929190613e3d565b60405180910390a18060078190555050565b6114276125b4565b73ffffffffffffffffffffffffffffffffffffffff16611445611948565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c4b565b60405180910390fd5b6001601760016101000a81548160ff0219169083151502179055506114c1333083613006565b6114ee30600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125bc565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061153a611948565b426040518863ffffffff1660e01b815260040161155c96959493929190613ea1565b60606040518083038185885af115801561157a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061159f9190613f17565b5050506000601760016101000a81548160ff02191690831515021790555050565b60075481565b60155481565b6115d46125b4565b73ffffffffffffffffffffffffffffffffffffffff166115f2611948565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613c4b565b60405180910390fd5b61271081111561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613fdc565b60405180910390fd5b7fcc0c894e0aa284b088a2e0f6e7f0d0ac09f79e4876ba88612e6e0ca487f3633b600954826040516116c0929190613e3d565b60405180910390a18060098190555050565b60095481565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117296125b4565b73ffffffffffffffffffffffffffffffffffffffff16611747611948565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613c4b565b60405180910390fd5b6117a760006131b3565b565b6117b16125b4565b73ffffffffffffffffffffffffffffffffffffffff166117cf611948565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613c4b565b60405180910390fd5b61271081111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061406e565b60405180910390fd5b7fb586ed184cc52a9de023ce91b18e7c0af2d6e67c455593efb571c65748da800d6008548260405161189d929190613e3d565b60405180910390a18060088190555050565b6118b76125b4565b73ffffffffffffffffffffffffffffffffffffffff166118d5611948565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613c4b565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61197a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611998611948565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590613c4b565b60405180910390fd5b6119f88282613279565b5050565b600e60009054906101000a900460ff1681565b606060048054611a1e90613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90613bce565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b60136020528060005260406000206000915054906101000a900460ff1681565b611ac96125b4565b73ffffffffffffffffffffffffffffffffffffffff16611ae7611948565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613c4b565b60405180910390fd5b612710811115611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614100565b60405180910390fd5b7fc42f244a2cb2dfd33ff7e802759f2bc521c79832d2e43453eb4bb09e8196216b60065482604051611bb5929190613e3d565b60405180910390a18060068190555050565b60008060016000611bd66125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614192565b60405180910390fd5b611ca7611c9e6125b4565b858584036125bc565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611cec611ce56125b4565b8484612785565b6001905092915050565b611cfe6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611d1c611948565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613c4b565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b60065481565b611d9d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611dbb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890613c4b565b60405180910390fd5b600c54821115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614224565b60405180910390fd5b611e61308284613006565b7f5a2ddfaa8cd29d1c9d0334d8197f34ae397aea07fdd59189acfe5010290ccd6982604051611e90919061384e565b60405180910390a181600c6000828254611eaa9190614244565b925050819055505050565b611ebd6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611edb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613c4b565b60405180910390fd5b8060158190555050565b600e60039054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b60085481565b60116020528060005260406000206000915090505481565b60145481565b611f8d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611fab611948565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613c4b565b60405180910390fd5b7f54920079c625fd9d65e9c2cc9e905b6045a1fc4b350cb1931738abb9fc74f59a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612054929190614299565b60405180910390a180600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b6121356125b4565b73ffffffffffffffffffffffffffffffffffffffff16612153611948565b73ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090613c4b565b60405180910390fd5b7fae3a1b402f74f11fa4278ade0285e40f015bc944c463953eb7eba4dc7952a073600e60039054906101000a900460ff16826040516121e99291906142c2565b60405180910390a180600e60036101000a81548160ff02191690831515021790555050565b6122166125b4565b73ffffffffffffffffffffffffffffffffffffffff16612234611948565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613c4b565b60405180910390fd5b600d548211156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c69061435d565b60405180910390fd5b6122da308284613006565b7fbb94e30962759790974c82682351ddb23a0dd0156e5abbca7a62f9f48dcc61cb82604051612309919061384e565b60405180910390a181600d60008282546123239190614244565b925050819055505050565b600281565b600e60029054906101000a900460ff1681565b61234e6125b4565b73ffffffffffffffffffffffffffffffffffffffff1661236c611948565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990613c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612428906143ef565b60405180910390fd5b61243a816131b3565b50565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b61248b6125b4565b73ffffffffffffffffffffffffffffffffffffffff166124a9611948565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613c4b565b60405180910390fd5b7fa2e7e5be2ef4e337f327725cfb42a1922cffb5f8276b8683f0e24539eb259c4e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612552929190614299565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836125ac9190613d55565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290614481565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361269a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269190614513565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612778919061384e565b60405180910390a3505050565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061457f565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128b35750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128c8576128c3838383613006565b612b89565b60006015546128d6306116d8565b101590508080156128f45750601760009054906101000a900460ff16155b801561294e5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156129665750600e60039054906101000a900460ff165b15612974576129736112cb565b5b6000829050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a5d57600e60019054906101000a900460ff16612a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a17906145eb565b60405180910390fd5b6002601454612a2f9190613d55565b4311612a4157612a40866001613279565b5b612a4c85600161335b565b809350819450829550505050612b6e565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612b1d57600e60019054906101000a900460ff16612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af8906145eb565b60405180910390fd5b612b0c85600061335b565b809350819450829550505050612b6d565b600e60029054906101000a900460ff16612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614657565b60405180910390fd5b5b5b612b79878785613006565b612b84878383613446565b505050505b505050565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612bc657612bc5614677565b5b604051908082528060200260200182016040528015612bf45781602001602082028036833780820191505090505b5090503081600081518110612c0c57612c0b6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd791906146ea565b81600181518110612ceb57612cea6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d5230600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125bc565b6000479050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612dbb9594939291906147d5565b600060405180830381600087803b158015612dd557600080fd5b505af1158015612de9573d6000803e3d6000fd5b5050505060008147612dfb9190614244565b90506000612e16600d54600c5461259e90919063ffffffff16565b90506000612e4182612e33600c548961350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e6c83612e5e600d548a61350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e9784612e89600c548861350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612ec285612eb4600d548961350f90919063ffffffff16565b61352590919063ffffffff16565b9050612ed984600c5461353b90919063ffffffff16565b600c81905550612ef483600d5461353b90919063ffffffff16565b600d819055506000821115612f6d57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f6b573d6000803e3d6000fd5b505b6000811115612fe057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612fde573d6000803e3d6000fd5b505b50505050505050506000601760006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c9061487b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db906148e7565b60405180910390fd5b60006130ef846116d8565b905081811015613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b90614953565b60405180910390fd5b61313e8483613551565b61314883836135e3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131a5919061384e565b60405180910390a350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16836040516132f893929190614973565b60405180910390a180601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600083156133c15761338f6127106133816006548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506133ba6127106133ac6007548861350f90919063ffffffff16565b61352590919063ffffffff16565b9050613418565b6133ea6127106133dc6008548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506134156127106134076009548861350f90919063ffffffff16565b61352590919063ffffffff16565b90505b61343d8161342f848861353b90919063ffffffff16565b61353b90919063ffffffff16565b92509250925092565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906149f6565b60405180910390fd5b60006134ca828461259e90919063ffffffff16565b90506134d7843083613006565b82600c60008282546134e99190613d55565b9250508190555081600d60008282546135029190613d55565b9250508190555050505050565b6000818361351d9190614a16565b905092915050565b600081836135339190614a9f565b905092915050565b600081836135499190614244565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359c9190614244565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461362e9190613d55565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136af578082015181840152602081019050613694565b838111156136be576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e082613675565b6136ea8185613680565b93506136fa818560208601613691565b613703816136c4565b840191505092915050565b6000602082019050818103600083015261372881846136d5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061376082613735565b9050919050565b61377081613755565b811461377b57600080fd5b50565b60008135905061378d81613767565b92915050565b6000819050919050565b6137a681613793565b81146137b157600080fd5b50565b6000813590506137c38161379d565b92915050565b600080604083850312156137e0576137df613730565b5b60006137ee8582860161377e565b92505060206137ff858286016137b4565b9150509250929050565b60008115159050919050565b61381e81613809565b82525050565b60006020820190506138396000830184613815565b92915050565b61384881613793565b82525050565b6000602082019050613863600083018461383f565b92915050565b61387281613809565b811461387d57600080fd5b50565b60008135905061388f81613869565b92915050565b600080604083850312156138ac576138ab613730565b5b60006138ba8582860161377e565b92505060206138cb85828601613880565b9150509250929050565b6000806000606084860312156138ee576138ed613730565b5b60006138fc8682870161377e565b935050602061390d8682870161377e565b925050604061391e868287016137b4565b9150509250925092565b600061393382613735565b9050919050565b61394381613928565b82525050565b600060208201905061395e600083018461393a565b92915050565b600060ff82169050919050565b61397a81613964565b82525050565b60006020820190506139956000830184613971565b92915050565b6000602082840312156139b1576139b0613730565b5b60006139bf8482850161377e565b91505092915050565b6000602082840312156139de576139dd613730565b5b60006139ec848285016137b4565b91505092915050565b6139fe81613755565b82525050565b6000602082019050613a1960008301846139f5565b92915050565b60008060408385031215613a3657613a35613730565b5b6000613a44858286016137b4565b9250506020613a558582860161377e565b9150509250929050565b613a6881613928565b8114613a7357600080fd5b50565b600081359050613a8581613a5f565b92915050565b600060208284031215613aa157613aa0613730565b5b6000613aaf84828501613a76565b91505092915050565b60008060408385031215613acf57613ace613730565b5b6000613add8582860161377e565b9250506020613aee8582860161377e565b9150509250929050565b600060208284031215613b0e57613b0d613730565b5b6000613b1c84828501613880565b91505092915050565b6000819050919050565b6000613b4a613b45613b4084613735565b613b25565b613735565b9050919050565b6000613b5c82613b2f565b9050919050565b6000613b6e82613b51565b9050919050565b613b7e81613b63565b82525050565b6000602082019050613b996000830184613b75565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be657607f821691505b602082108103613bf957613bf8613b9f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c35602083613680565b9150613c4082613bff565b602082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b6000604082019050613c8060008301856139f5565b613c8d6020830184613815565b9392505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613cf0602883613680565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d6082613793565b9150613d6b83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613da057613d9f613d26565b5b828201905092915050565b7f5f627579526577617264735461782063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613e07602c83613680565b9150613e1282613dab565b604082019050919050565b60006020820190508181036000830152613e3681613dfa565b9050919050565b6000604082019050613e52600083018561383f565b613e5f602083018461383f565b9392505050565b6000819050919050565b6000613e8b613e86613e8184613e66565b613b25565b613793565b9050919050565b613e9b81613e70565b82525050565b600060c082019050613eb660008301896139f5565b613ec3602083018861383f565b613ed06040830187613e92565b613edd6060830186613e92565b613eea60808301856139f5565b613ef760a083018461383f565b979650505050505050565b600081519050613f118161379d565b92915050565b600080600060608486031215613f3057613f2f613730565b5b6000613f3e86828701613f02565b9350506020613f4f86828701613f02565b9250506040613f6086828701613f02565b9150509250925092565b7f5f73656c6c526577617264735461782063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613fc6602d83613680565b9150613fd182613f6a565b604082019050919050565b60006020820190508181036000830152613ff581613fb9565b9050919050565b7f5f73656c6c4465765461782063616e6e6f7420657863656564204250535f444560008201527f4e4f4d494e41544f520000000000000000000000000000000000000000000000602082015250565b6000614058602983613680565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f5f6275794465765461782063616e6e6f7420657863656564204250535f44454e60008201527f4f4d494e41544f52000000000000000000000000000000000000000000000000602082015250565b60006140ea602883613680565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061417c602583613680565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4465765461780000000000000000000000000000000000000000000000602082015250565b600061420e602983613680565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b600061424f82613793565b915061425a83613793565b92508282101561426d5761426c613d26565b5b828203905092915050565b600061428382613b51565b9050919050565b61429381614278565b82525050565b60006040820190506142ae600083018561428a565b6142bb602083018461428a565b9392505050565b60006040820190506142d76000830185613815565b6142e46020830184613815565b9392505050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265776172647354617800000000000000000000000000000000000000602082015250565b6000614347602d83613680565b9150614352826142eb565b604082019050919050565b600060208201905081810360008301526143768161433a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143d9602683613680565b91506143e48261437d565b604082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446b602483613680565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144fd602283613680565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000614569601883613680565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b60006145d5601983613680565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f5472616e736665727320617265206e6f74207965742061637469766500000000600082015250565b6000614641601c83613680565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146e481613767565b92915050565b600060208284031215614700576146ff613730565b5b600061470e848285016146d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474c81613755565b82525050565b600061475e8383614743565b60208301905092915050565b6000602082019050919050565b600061478282614717565b61478c8185614722565b935061479783614733565b8060005b838110156147c85781516147af8882614752565b97506147ba8361476a565b92505060018101905061479b565b5085935050505092915050565b600060a0820190506147ea600083018861383f565b6147f76020830187613e92565b81810360408301526148098186614777565b905061481860608301856139f5565b614825608083018461383f565b9695505050505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000614865601e83613680565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b60006148d1601c83613680565b91506148dc8261489b565b602082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b600061493d601f83613680565b915061494882614907565b602082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b600060608201905061498860008301866139f5565b6149956020830185613815565b6149a26040830184613815565b949350505050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b60006149e0601e83613680565b91506149eb826149aa565b602082019050919050565b60006020820190508181036000830152614a0f816149d3565b9050919050565b6000614a2182613793565b9150614a2c83613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6557614a64613d26565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aaa82613793565b9150614ab583613793565b925082614ac557614ac4614a70565b5b82820490509291505056fea2646970667358221220fba78c99578d17ad447e91b1936a89a55a3c8ae1e3a74026c6b3280f977a6fae64736f6c634300080e003300000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca00000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca

Deployed Bytecode

0x60806040526004361061036f5760003560e01c80639155e083116101c6578063be691883116100f7578063ed00c02511610095578063f2fde38b1161006f578063f2fde38b14610c3a578063f887ea4014610c63578063f9f92be414610c8e578063fe033fda14610ccb57610376565b8063ed00c02514610bbb578063f016d83b14610be4578063f29e448614610c0f57610376565b8063db12c8b6116100d1578063db12c8b614610b01578063dd62ed3e14610b2a578063e1a4521814610b67578063e3f9fc6314610b9257610376565b8063be69188314610a6e578063c1adf7bc14610a99578063cd51e6d414610ad657610376565b8063a9059cbb11610164578063b082c19a1161013e578063b082c19a146109c6578063b0ac1571146109ef578063b9ccf21d14610a18578063bbc0c74214610a4357610376565b8063a9059cbb14610947578063af35c6c714610984578063af8f26e71461099b57610376565b8063967a3a10116101a0578063967a3a1014610879578063a3e8730e146108b6578063a457c2d7146108df578063a8aa1b311461091c57610376565b80639155e083146107fa5780639207cc5d1461082357806395d89b411461084e57610376565b80633a67a0f6116102a05780635d20d9181161023e578063715018a611610218578063715018a6146107785780637db557e31461078f5780638a8c523c146107b85780638da5cb5b146107cf57610376565b80635d20d918146106e75780636053b8811461071057806370a082311461073b57610376565b80634c6d1cd81161027a5780634c6d1cd81461064c57806351c6590a146106755780635a686d54146106915780635b78f35f146106bc57610376565b80633a67a0f6146105f35780633e9ffbea1461060a5780633f651a5f1461062157610376565b80632433c0781161030d578063313ce567116102e7578063313ce5671461052357806332cb6b0c1461054e578063395093511461057957806339b622d3146105b657610376565b80632433c078146104a257806325edf518146104cd5780632f1e3e82146104f857610376565b806318160ddd1161034957806318160ddd146103fa57806319c2c40d1461042557806320800a001461044e57806323b872dd1461046557610376565b806306fdde031461037b578063095ea7b3146103a657806317700f01146103e357610376565b3661037657005b600080fd5b34801561038757600080fd5b50610390610cf4565b60405161039d919061370e565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c891906137c9565b610d86565b6040516103da9190613824565b60405180910390f35b3480156103ef57600080fd5b506103f8610da4565b005b34801561040657600080fd5b5061040f610e3d565b60405161041c919061384e565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613895565b610e47565b005b34801561045a57600080fd5b50610463610f57565b005b34801561047157600080fd5b5061048c600480360381019061048791906138d5565b611023565b6040516104999190613824565b60405180910390f35b3480156104ae57600080fd5b506104b761111b565b6040516104c49190613949565b60405180910390f35b3480156104d957600080fd5b506104e2611141565b6040516104ef919061384e565b60405180910390f35b34801561050457600080fd5b5061050d611147565b60405161051a919061384e565b60405180910390f35b34801561052f57600080fd5b5061053861114d565b6040516105459190613980565b60405180910390f35b34801561055a57600080fd5b50610563611156565b604051610570919061384e565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b91906137c9565b611166565b6040516105ad9190613824565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061399b565b611212565b6040516105ea9190613824565b60405180910390f35b3480156105ff57600080fd5b50610608611232565b005b34801561061657600080fd5b5061061f6112cb565b005b34801561062d57600080fd5b506106366112f3565b6040516106439190613949565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e91906139c8565b611319565b005b61068f600480360381019061068a91906139c8565b61141f565b005b34801561069d57600080fd5b506106a66115c0565b6040516106b3919061384e565b60405180910390f35b3480156106c857600080fd5b506106d16115c6565b6040516106de919061384e565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906139c8565b6115cc565b005b34801561071c57600080fd5b506107256116d2565b604051610732919061384e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d919061399b565b6116d8565b60405161076f919061384e565b60405180910390f35b34801561078457600080fd5b5061078d611721565b005b34801561079b57600080fd5b506107b660048036038101906107b191906139c8565b6117a9565b005b3480156107c457600080fd5b506107cd6118af565b005b3480156107db57600080fd5b506107e4611948565b6040516107f19190613a04565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613895565b611972565b005b34801561082f57600080fd5b506108386119fc565b6040516108459190613824565b60405180910390f35b34801561085a57600080fd5b50610863611a0f565b604051610870919061370e565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b919061399b565b611aa1565b6040516108ad9190613824565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906139c8565b611ac1565b005b3480156108eb57600080fd5b50610906600480360381019061090191906137c9565b611bc7565b6040516109139190613824565b60405180910390f35b34801561092857600080fd5b50610931611cb2565b60405161093e9190613a04565b60405180910390f35b34801561095357600080fd5b5061096e600480360381019061096991906137c9565b611cd8565b60405161097b9190613824565b60405180910390f35b34801561099057600080fd5b50610999611cf6565b005b3480156109a757600080fd5b506109b0611d8f565b6040516109bd919061384e565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613a1f565b611d95565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906139c8565b611eb5565b005b348015610a2457600080fd5b50610a2d611f3b565b604051610a3a9190613824565b60405180910390f35b348015610a4f57600080fd5b50610a58611f4e565b604051610a659190613824565b60405180910390f35b348015610a7a57600080fd5b50610a83611f61565b604051610a90919061384e565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061399b565b611f67565b604051610acd919061384e565b60405180910390f35b348015610ae257600080fd5b50610aeb611f7f565b604051610af8919061384e565b60405180910390f35b348015610b0d57600080fd5b50610b286004803603810190610b239190613a8b565b611f85565b005b348015610b3657600080fd5b50610b516004803603810190610b4c9190613ab8565b6120a0565b604051610b5e919061384e565b60405180910390f35b348015610b7357600080fd5b50610b7c612127565b604051610b89919061384e565b60405180910390f35b348015610b9e57600080fd5b50610bb96004803603810190610bb49190613af8565b61212d565b005b348015610bc757600080fd5b50610be26004803603810190610bdd9190613a1f565b61220e565b005b348015610bf057600080fd5b50610bf961232e565b604051610c06919061384e565b60405180910390f35b348015610c1b57600080fd5b50610c24612333565b604051610c319190613824565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c919061399b565b612346565b005b348015610c6f57600080fd5b50610c7861243d565b604051610c859190613b84565b60405180910390f35b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061399b565b612463565b604051610cc29190613824565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190613a8b565b612483565b005b606060038054610d0390613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90613bce565b8015610d7c5780601f10610d5157610100808354040283529160200191610d7c565b820191906000526020600020905b815481529060010190602001808311610d5f57829003601f168201915b5050505050905090565b6000610d9a610d936125b4565b84846125bc565b6001905092915050565b610dac6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610dca611948565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613c4b565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b6000601654905090565b610e4f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610e6d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613c4b565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610f4b929190613c6b565b60405180910390a15050565b610f5f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610f7d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613c4b565b60405180910390fd5b610fdb611948565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611020573d6000803e3d6000fd5b50565b6000611030848484612785565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061107b6125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d06565b60405180910390fd5b61110f856111076125b4565b8584036125bc565b60019150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600d5481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b60006112086111736125b4565b8484600160006111816125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112039190613d55565b6125bc565b6001905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b61123a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611258611948565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c4b565b60405180910390fd5b6000600e60026101000a81548160ff021916908315150217905550565b601760009054906101000a900460ff166112f1576112f06112eb306116d8565b612b8e565b5b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113216125b4565b73ffffffffffffffffffffffffffffffffffffffff1661133f611948565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613c4b565b60405180910390fd5b6127108111156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613e1d565b60405180910390fd5b7f329f5e7109b9e04ed6c5230453b1f7e26c4b2d5cca1b3905f5d9568673a9e9fe6007548260405161140d929190613e3d565b60405180910390a18060078190555050565b6114276125b4565b73ffffffffffffffffffffffffffffffffffffffff16611445611948565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c4b565b60405180910390fd5b6001601760016101000a81548160ff0219169083151502179055506114c1333083613006565b6114ee30600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125bc565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061153a611948565b426040518863ffffffff1660e01b815260040161155c96959493929190613ea1565b60606040518083038185885af115801561157a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061159f9190613f17565b5050506000601760016101000a81548160ff02191690831515021790555050565b60075481565b60155481565b6115d46125b4565b73ffffffffffffffffffffffffffffffffffffffff166115f2611948565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613c4b565b60405180910390fd5b61271081111561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613fdc565b60405180910390fd5b7fcc0c894e0aa284b088a2e0f6e7f0d0ac09f79e4876ba88612e6e0ca487f3633b600954826040516116c0929190613e3d565b60405180910390a18060098190555050565b60095481565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117296125b4565b73ffffffffffffffffffffffffffffffffffffffff16611747611948565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613c4b565b60405180910390fd5b6117a760006131b3565b565b6117b16125b4565b73ffffffffffffffffffffffffffffffffffffffff166117cf611948565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613c4b565b60405180910390fd5b61271081111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061406e565b60405180910390fd5b7fb586ed184cc52a9de023ce91b18e7c0af2d6e67c455593efb571c65748da800d6008548260405161189d929190613e3d565b60405180910390a18060088190555050565b6118b76125b4565b73ffffffffffffffffffffffffffffffffffffffff166118d5611948565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613c4b565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61197a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611998611948565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590613c4b565b60405180910390fd5b6119f88282613279565b5050565b600e60009054906101000a900460ff1681565b606060048054611a1e90613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90613bce565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b60136020528060005260406000206000915054906101000a900460ff1681565b611ac96125b4565b73ffffffffffffffffffffffffffffffffffffffff16611ae7611948565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613c4b565b60405180910390fd5b612710811115611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614100565b60405180910390fd5b7fc42f244a2cb2dfd33ff7e802759f2bc521c79832d2e43453eb4bb09e8196216b60065482604051611bb5929190613e3d565b60405180910390a18060068190555050565b60008060016000611bd66125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614192565b60405180910390fd5b611ca7611c9e6125b4565b858584036125bc565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611cec611ce56125b4565b8484612785565b6001905092915050565b611cfe6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611d1c611948565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613c4b565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b60065481565b611d9d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611dbb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890613c4b565b60405180910390fd5b600c54821115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614224565b60405180910390fd5b611e61308284613006565b7f5a2ddfaa8cd29d1c9d0334d8197f34ae397aea07fdd59189acfe5010290ccd6982604051611e90919061384e565b60405180910390a181600c6000828254611eaa9190614244565b925050819055505050565b611ebd6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611edb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613c4b565b60405180910390fd5b8060158190555050565b600e60039054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b60085481565b60116020528060005260406000206000915090505481565b60145481565b611f8d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611fab611948565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613c4b565b60405180910390fd5b7f54920079c625fd9d65e9c2cc9e905b6045a1fc4b350cb1931738abb9fc74f59a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612054929190614299565b60405180910390a180600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b6121356125b4565b73ffffffffffffffffffffffffffffffffffffffff16612153611948565b73ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090613c4b565b60405180910390fd5b7fae3a1b402f74f11fa4278ade0285e40f015bc944c463953eb7eba4dc7952a073600e60039054906101000a900460ff16826040516121e99291906142c2565b60405180910390a180600e60036101000a81548160ff02191690831515021790555050565b6122166125b4565b73ffffffffffffffffffffffffffffffffffffffff16612234611948565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613c4b565b60405180910390fd5b600d548211156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c69061435d565b60405180910390fd5b6122da308284613006565b7fbb94e30962759790974c82682351ddb23a0dd0156e5abbca7a62f9f48dcc61cb82604051612309919061384e565b60405180910390a181600d60008282546123239190614244565b925050819055505050565b600281565b600e60029054906101000a900460ff1681565b61234e6125b4565b73ffffffffffffffffffffffffffffffffffffffff1661236c611948565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990613c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612428906143ef565b60405180910390fd5b61243a816131b3565b50565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b61248b6125b4565b73ffffffffffffffffffffffffffffffffffffffff166124a9611948565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613c4b565b60405180910390fd5b7fa2e7e5be2ef4e337f327725cfb42a1922cffb5f8276b8683f0e24539eb259c4e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612552929190614299565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836125ac9190613d55565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290614481565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361269a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269190614513565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612778919061384e565b60405180910390a3505050565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061457f565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128b35750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128c8576128c3838383613006565b612b89565b60006015546128d6306116d8565b101590508080156128f45750601760009054906101000a900460ff16155b801561294e5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156129665750600e60039054906101000a900460ff165b15612974576129736112cb565b5b6000829050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a5d57600e60019054906101000a900460ff16612a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a17906145eb565b60405180910390fd5b6002601454612a2f9190613d55565b4311612a4157612a40866001613279565b5b612a4c85600161335b565b809350819450829550505050612b6e565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612b1d57600e60019054906101000a900460ff16612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af8906145eb565b60405180910390fd5b612b0c85600061335b565b809350819450829550505050612b6d565b600e60029054906101000a900460ff16612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614657565b60405180910390fd5b5b5b612b79878785613006565b612b84878383613446565b505050505b505050565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612bc657612bc5614677565b5b604051908082528060200260200182016040528015612bf45781602001602082028036833780820191505090505b5090503081600081518110612c0c57612c0b6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd791906146ea565b81600181518110612ceb57612cea6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d5230600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125bc565b6000479050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612dbb9594939291906147d5565b600060405180830381600087803b158015612dd557600080fd5b505af1158015612de9573d6000803e3d6000fd5b5050505060008147612dfb9190614244565b90506000612e16600d54600c5461259e90919063ffffffff16565b90506000612e4182612e33600c548961350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e6c83612e5e600d548a61350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e9784612e89600c548861350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612ec285612eb4600d548961350f90919063ffffffff16565b61352590919063ffffffff16565b9050612ed984600c5461353b90919063ffffffff16565b600c81905550612ef483600d5461353b90919063ffffffff16565b600d819055506000821115612f6d57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f6b573d6000803e3d6000fd5b505b6000811115612fe057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612fde573d6000803e3d6000fd5b505b50505050505050506000601760006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c9061487b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db906148e7565b60405180910390fd5b60006130ef846116d8565b905081811015613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b90614953565b60405180910390fd5b61313e8483613551565b61314883836135e3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131a5919061384e565b60405180910390a350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16836040516132f893929190614973565b60405180910390a180601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600083156133c15761338f6127106133816006548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506133ba6127106133ac6007548861350f90919063ffffffff16565b61352590919063ffffffff16565b9050613418565b6133ea6127106133dc6008548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506134156127106134076009548861350f90919063ffffffff16565b61352590919063ffffffff16565b90505b61343d8161342f848861353b90919063ffffffff16565b61353b90919063ffffffff16565b92509250925092565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906149f6565b60405180910390fd5b60006134ca828461259e90919063ffffffff16565b90506134d7843083613006565b82600c60008282546134e99190613d55565b9250508190555081600d60008282546135029190613d55565b9250508190555050505050565b6000818361351d9190614a16565b905092915050565b600081836135339190614a9f565b905092915050565b600081836135499190614244565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359c9190614244565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461362e9190613d55565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136af578082015181840152602081019050613694565b838111156136be576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e082613675565b6136ea8185613680565b93506136fa818560208601613691565b613703816136c4565b840191505092915050565b6000602082019050818103600083015261372881846136d5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061376082613735565b9050919050565b61377081613755565b811461377b57600080fd5b50565b60008135905061378d81613767565b92915050565b6000819050919050565b6137a681613793565b81146137b157600080fd5b50565b6000813590506137c38161379d565b92915050565b600080604083850312156137e0576137df613730565b5b60006137ee8582860161377e565b92505060206137ff858286016137b4565b9150509250929050565b60008115159050919050565b61381e81613809565b82525050565b60006020820190506138396000830184613815565b92915050565b61384881613793565b82525050565b6000602082019050613863600083018461383f565b92915050565b61387281613809565b811461387d57600080fd5b50565b60008135905061388f81613869565b92915050565b600080604083850312156138ac576138ab613730565b5b60006138ba8582860161377e565b92505060206138cb85828601613880565b9150509250929050565b6000806000606084860312156138ee576138ed613730565b5b60006138fc8682870161377e565b935050602061390d8682870161377e565b925050604061391e868287016137b4565b9150509250925092565b600061393382613735565b9050919050565b61394381613928565b82525050565b600060208201905061395e600083018461393a565b92915050565b600060ff82169050919050565b61397a81613964565b82525050565b60006020820190506139956000830184613971565b92915050565b6000602082840312156139b1576139b0613730565b5b60006139bf8482850161377e565b91505092915050565b6000602082840312156139de576139dd613730565b5b60006139ec848285016137b4565b91505092915050565b6139fe81613755565b82525050565b6000602082019050613a1960008301846139f5565b92915050565b60008060408385031215613a3657613a35613730565b5b6000613a44858286016137b4565b9250506020613a558582860161377e565b9150509250929050565b613a6881613928565b8114613a7357600080fd5b50565b600081359050613a8581613a5f565b92915050565b600060208284031215613aa157613aa0613730565b5b6000613aaf84828501613a76565b91505092915050565b60008060408385031215613acf57613ace613730565b5b6000613add8582860161377e565b9250506020613aee8582860161377e565b9150509250929050565b600060208284031215613b0e57613b0d613730565b5b6000613b1c84828501613880565b91505092915050565b6000819050919050565b6000613b4a613b45613b4084613735565b613b25565b613735565b9050919050565b6000613b5c82613b2f565b9050919050565b6000613b6e82613b51565b9050919050565b613b7e81613b63565b82525050565b6000602082019050613b996000830184613b75565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be657607f821691505b602082108103613bf957613bf8613b9f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c35602083613680565b9150613c4082613bff565b602082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b6000604082019050613c8060008301856139f5565b613c8d6020830184613815565b9392505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613cf0602883613680565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d6082613793565b9150613d6b83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613da057613d9f613d26565b5b828201905092915050565b7f5f627579526577617264735461782063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613e07602c83613680565b9150613e1282613dab565b604082019050919050565b60006020820190508181036000830152613e3681613dfa565b9050919050565b6000604082019050613e52600083018561383f565b613e5f602083018461383f565b9392505050565b6000819050919050565b6000613e8b613e86613e8184613e66565b613b25565b613793565b9050919050565b613e9b81613e70565b82525050565b600060c082019050613eb660008301896139f5565b613ec3602083018861383f565b613ed06040830187613e92565b613edd6060830186613e92565b613eea60808301856139f5565b613ef760a083018461383f565b979650505050505050565b600081519050613f118161379d565b92915050565b600080600060608486031215613f3057613f2f613730565b5b6000613f3e86828701613f02565b9350506020613f4f86828701613f02565b9250506040613f6086828701613f02565b9150509250925092565b7f5f73656c6c526577617264735461782063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613fc6602d83613680565b9150613fd182613f6a565b604082019050919050565b60006020820190508181036000830152613ff581613fb9565b9050919050565b7f5f73656c6c4465765461782063616e6e6f7420657863656564204250535f444560008201527f4e4f4d494e41544f520000000000000000000000000000000000000000000000602082015250565b6000614058602983613680565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f5f6275794465765461782063616e6e6f7420657863656564204250535f44454e60008201527f4f4d494e41544f52000000000000000000000000000000000000000000000000602082015250565b60006140ea602883613680565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061417c602583613680565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4465765461780000000000000000000000000000000000000000000000602082015250565b600061420e602983613680565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b600061424f82613793565b915061425a83613793565b92508282101561426d5761426c613d26565b5b828203905092915050565b600061428382613b51565b9050919050565b61429381614278565b82525050565b60006040820190506142ae600083018561428a565b6142bb602083018461428a565b9392505050565b60006040820190506142d76000830185613815565b6142e46020830184613815565b9392505050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265776172647354617800000000000000000000000000000000000000602082015250565b6000614347602d83613680565b9150614352826142eb565b604082019050919050565b600060208201905081810360008301526143768161433a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143d9602683613680565b91506143e48261437d565b604082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446b602483613680565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144fd602283613680565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000614569601883613680565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b60006145d5601983613680565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f5472616e736665727320617265206e6f74207965742061637469766500000000600082015250565b6000614641601c83613680565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146e481613767565b92915050565b600060208284031215614700576146ff613730565b5b600061470e848285016146d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474c81613755565b82525050565b600061475e8383614743565b60208301905092915050565b6000602082019050919050565b600061478282614717565b61478c8185614722565b935061479783614733565b8060005b838110156147c85781516147af8882614752565b97506147ba8361476a565b92505060018101905061479b565b5085935050505092915050565b600060a0820190506147ea600083018861383f565b6147f76020830187613e92565b81810360408301526148098186614777565b905061481860608301856139f5565b614825608083018461383f565b9695505050505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000614865601e83613680565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b60006148d1601c83613680565b91506148dc8261489b565b602082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b600061493d601f83613680565b915061494882614907565b602082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b600060608201905061498860008301866139f5565b6149956020830185613815565b6149a26040830184613815565b949350505050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b60006149e0601e83613680565b91506149eb826149aa565b602082019050919050565b60006020820190508181036000830152614a0f816149d3565b9050919050565b6000614a2182613793565b9150614a2c83613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6557614a64613d26565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aaa82613793565b9150614ab583613793565b925082614ac557614ac4614a70565b5b82820490509291505056fea2646970667358221220fba78c99578d17ad447e91b1936a89a55a3c8ae1e3a74026c6b3280f977a6fae64736f6c634300080e0033

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

00000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca00000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca

-----Decoded View---------------
Arg [0] : _devTaxRecipient (address): 0x00c242DB938B3CdFcF8096d0bdb73d4F5aeC5aCA
Arg [1] : _rewardsTaxRecipient (address): 0x00c242DB938B3CdFcF8096d0bdb73d4F5aeC5aCA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca
Arg [1] : 00000000000000000000000000c242db938b3cdfcf8096d0bdb73d4f5aec5aca


Deployed Bytecode Sourcemap

36469:16616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13890:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16057:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45561:85;;;;;;;;;;;;;:::i;:::-;;52657:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46130:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50465:107;;;;;;;;;;;;;:::i;:::-;;16708:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37328:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37529:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37621:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14852:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36785:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17609:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38280:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45850:89;;;;;;;;;;;;;:::i;:::-;;48494:116;;;;;;;;;;;;;:::i;:::-;;37425:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42898:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40684:500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37083:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38883:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43339:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37238:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46649:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7125:103;;;;;;;;;;;;;:::i;:::-;;42487:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45425:83;;;;;;;;;;;;;:::i;:::-;;6474:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45029:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37765:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14109:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38637:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42100:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18327:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38155:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15521:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45704:87;;;;;;;;;;;;;:::i;:::-;;37007:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43892:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50267:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38058:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37869:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37160:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38401:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38773:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41706:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15759:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36848:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46494:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44486:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36903:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37967:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7383:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38116:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38513:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41325:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13890:100;13944:13;13977:5;13970:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13890:100;:::o;16057:169::-;16140:4;16157:39;16166:12;:10;:12::i;:::-;16180:7;16189:6;16157:8;:39::i;:::-;16214:4;16207:11;;16057:169;;;;:::o;45561:85::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45633:5:::1;45617:13;;:21;;;;;;;;;;;;;;;;;;45561:85::o:0;52657:100::-;52710:7;52737:12;;52730:19;;52657:100;:::o;46130:215::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46266:12:::1;46242:11;:21;46254:8;46242:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;46294:43;46314:8;46324:12;46294:43;;;;;;;:::i;:::-;;;;;;;;46130:215:::0;;:::o;50465:107::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:7:::1;:5;:7::i;:::-;50516:25;;:48;50542:21;50516:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50465:107::o:0;16708:492::-;16848:4;16865:36;16875:6;16883:9;16894:6;16865:9;:36::i;:::-;16914:24;16941:11;:19;16953:6;16941:19;;;;;;;;;;;;;;;:33;16961:12;:10;:12::i;:::-;16941:33;;;;;;;;;;;;;;;;16914:60;;17013:6;16993:16;:26;;16985:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;17100:57;17109:6;17117:12;:10;:12::i;:::-;17150:6;17131:16;:25;17100:8;:57::i;:::-;17188:4;17181:11;;;16708:492;;;;;:::o;37328:38::-;;;;;;;;;;;;;:::o;37529:26::-;;;;:::o;37621:30::-;;;;:::o;14852:93::-;14910:5;14935:2;14928:9;;14852:93;:::o;36785:56::-;36822:19;36785:56;:::o;17609:215::-;17697:4;17714:80;17723:12;:10;:12::i;:::-;17737:7;17783:10;17746:11;:25;17758:12;:10;:12::i;:::-;17746:25;;;;;;;;;;;;;;;:34;17772:7;17746:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;17714:8;:80::i;:::-;17812:4;17805:11;;17609:215;;;;:::o;38280:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;45850:89::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45926:5:::1;45908:15;;:23;;;;;;;;;;;;;;;;;;45850:89::o:0;48494:116::-;48536:7;;;;;;;;;;;48531:72;;48560:31;48566:24;48584:4;48566:9;:24::i;:::-;48560:5;:31::i;:::-;48531:72;48494:116::o;37425:42::-;;;;;;;;;;;;;:::o;42898:323::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36890:6:::1;43000:14;:33;;42978:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;43121:51;43142:13;;43157:14;43121:51;;;;;;;:::i;:::-;;;;;;;;43199:14;43183:13;:30;;;;42898:323:::0;:::o;40684:500::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36695:4:::1;36677:15;;:22;;;;;;;;;;;;;;;;;;40814:47:::2;40827:10;40847:4;40854:6;40814:12;:47::i;:::-;40872:48;40889:4;40904:6;;;;;;;;;;;40913;40872:8;:48::i;:::-;40933:6;;;;;;;;;;;:22;;;40963:9;40996:4;41016:6;41037:1;41053::::0;41069:7:::2;:5;:7::i;:::-;41150:15;40933:243;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;36740:5:::1;36722:15;;:23;;;;;;;;;;;;;;;;;;40684:500:::0;:::o;37083:34::-;;;;:::o;38883:43::-;;;;:::o;43339:332::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36890:6:::1;43443:15;:34;;43421:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;43566:54;43588:14;;43604:15;43566:54;;;;;;;:::i;:::-;;;;;;;;43648:15;43631:14;:32;;;;43339:332:::0;:::o;37238:35::-;;;;:::o;46649:177::-;46768:7;46800:9;:18;46810:7;46800:18;;;;;;;;;;;;;;;;46793:25;;46649:177;;;:::o;7125:103::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7190:30:::1;7217:1;7190:18;:30::i;:::-;7125:103::o:0;42487:296::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36890:6:::1;42583:11;:30;;42561:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42698:42;42716:10;;42728:11;42698:42;;;;;;;:::i;:::-;;;;;;;;42764:11;42751:10;:24;;;;42487:296:::0;:::o;45425:83::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45496:4:::1;45480:13;;:20;;;;;;;;;;;;;;;;;;45425:83::o:0;6474:87::-;6520:7;6547:6;;;;;;;;;;;6540:13;;6474:87;:::o;45029:160::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45151:30:::1;45168:4;45174:6;45151:16;:30::i;:::-;45029:160:::0;;:::o;37765:41::-;;;;;;;;;;;;;:::o;14109:104::-;14165:13;14198:7;14191:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14109:104;:::o;38637:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;42100:287::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36890:6:::1;42194:10;:29;;42172:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;42307:39;42324:9;;42335:10;42307:39;;;;;;;:::i;:::-;;;;;;;;42369:10;42357:9;:22;;;;42100:287:::0;:::o;18327:413::-;18420:4;18437:24;18464:11;:25;18476:12;:10;:12::i;:::-;18464:25;;;;;;;;;;;;;;;:34;18490:7;18464:34;;;;;;;;;;;;;;;;18437:61;;18537:15;18517:16;:35;;18509:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18630:67;18639:12;:10;:12::i;:::-;18653:7;18681:15;18662:16;:34;18630:8;:67::i;:::-;18728:4;18721:11;;;18327:413;;;;:::o;38155:19::-;;;;;;;;;;;;;:::o;15521:175::-;15607:4;15624:42;15634:12;:10;:12::i;:::-;15648:9;15659:6;15624:9;:42::i;:::-;15684:4;15677:11;;15521:175;;;;:::o;45704:87::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45779:4:::1;45761:15;;:22;;;;;;;;;;;;;;;;;;45704:87::o:0;37007:30::-;;;;:::o;43892:369::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44043:11:::1;;44032:7;:22;;44010:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;44134:48;44155:4;44162:10;44174:7;44134:12;:48::i;:::-;44198:22;44212:7;44198:22;;;;;;:::i;:::-;;;;;;;;44246:7;44231:11;;:22;;;;;;;:::i;:::-;;;;;;;;43892:369:::0;;:::o;50267:126::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50369:16:::1;50351:15;:34;;;;50267:126:::0;:::o;38058:27::-;;;;;;;;;;;;;:::o;37869:33::-;;;;;;;;;;;;;:::o;37160:31::-;;;;:::o;38401:42::-;;;;;;;;;;;;;;;;;:::o;38773:27::-;;;;:::o;41706:295::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41834:106:::1;41875:19;;;;;;;;;;;41909:20;41834:106;;;;;;;:::i;:::-;;;;;;;;41973:20;41951:19;;:42;;;;;;;;;;;;;;;;;;41706:295:::0;:::o;15759:151::-;15848:7;15875:11;:18;15887:5;15875:18;;;;;;;;;;;;;;;:27;15894:7;15875:27;;;;;;;;;;;;;;;;15868:34;;15759:151;;;;:::o;36848:48::-;36890:6;36848:48;:::o;46494:147::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46566:36:::1;46582:8;;;;;;;;;;;46592:9;46566:36;;;;;;;:::i;:::-;;;;;;;;46624:9;46613:8;;:20;;;;;;;;;;;;;;;;;;46494:147:::0;:::o;44486:389::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44641:15:::1;;44630:7;:26;;44608:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;44740:48;44761:4;44768:10;44780:7;44740:12;:48::i;:::-;44804:26;44822:7;44804:26;;;;;;:::i;:::-;;;;;;;;44860:7;44841:15;;:26;;;;;;;:::i;:::-;;;;;;;;44486:389:::0;;:::o;36903:40::-;36942:1;36903:40;:::o;37967:35::-;;;;;;;;;;;;;:::o;7383:201::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7492:1:::1;7472:22;;:8;:22;;::::0;7464:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7548:28;7567:8;7548:18;:28::i;:::-;7383:201:::0;:::o;38116:32::-;;;;;;;;;;;;;:::o;38513:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;41325:230::-;6705:12;:10;:12::i;:::-;6694:23;;:7;:5;:7::i;:::-;:23;;;6686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41445:57:::1;41468:15;;;;;;;;;;;41485:16;41445:57;;;;;;;:::i;:::-;;;;;;;;41531:16;41513:15;;:34;;;;;;;;;;;;;;;;;;41325:230:::0;:::o;26726:98::-;26784:7;26815:1;26811;:5;;;;:::i;:::-;26804:12;;26726:98;;;;:::o;5147:::-;5200:7;5227:10;5220:17;;5147:98;:::o;22011:380::-;22164:1;22147:19;;:5;:19;;;22139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22245:1;22226:21;;:7;:21;;;22218:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22329:6;22299:11;:18;22311:5;22299:18;;;;;;;;;;;;;;;:27;22318:7;22299:27;;;;;;;;;;;;;;;:36;;;;22367:7;22351:32;;22360:5;22351:32;;;22376:6;22351:32;;;;;;:::i;:::-;;;;;;;;22011:380;;;:::o;47115:1310::-;47257:9;:20;47267:9;47257:20;;;;;;;;;;;;;;;;;;;;;;;;;47256:21;47248:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47323:11;:19;47335:6;47323:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;47346:11;:22;47358:9;47346:22;;;;;;;;;;;;;;;;;;;;;;;;;47323:45;47319:138;;;47385:39;47398:6;47406:9;47417:6;47385:12;:39::i;:::-;47439:7;;47319:138;47469:24;47524:15;;47496:24;47514:4;47496:9;:24::i;:::-;:43;;47469:70;;47554:19;:31;;;;;47578:7;;;;;;;;;;;47577:8;47554:31;:49;;;;;47599:4;;;;;;;;;;;47589:14;;:6;:14;;;;47554:49;:61;;;;;47607:8;;;;;;;;;;;47554:61;47550:103;;;47632:9;:7;:9::i;:::-;47550:103;47665:12;47680:6;47665:21;;47697:14;47722:18;47765:4;;;;;;;;;;;47755:14;;:6;:14;;;47751:570;;47794:13;;;;;;;;;;;47786:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:1;47872:12;;:27;;;;:::i;:::-;47856:12;:43;47852:117;;47920:33;47937:9;47948:4;47920:16;:33::i;:::-;47852:117;48012:28;48027:6;48035:4;48012:14;:28::i;:::-;47983:57;;;;;;;;;;;;47751:570;;;48075:4;;;;;;;;;;;48062:17;;:9;:17;;;48058:263;;48104:13;;;;;;;;;;;48096:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;48191:29;48206:6;48214:5;48191:14;:29::i;:::-;48162:58;;;;;;;;;;;;48058:263;;;48261:15;;;;;;;;;;;48253:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48058:263;47751:570;48331:37;48344:6;48352:9;48363:4;48331:12;:37::i;:::-;48379:38;48390:6;48398;48406:10;48379;:38::i;:::-;47237:1188;;;;47115:1310;;;;:::o;48830:1286::-;36584:4;36574:7;;:14;;;;;;;;;;;;;;;;;;48890:21:::1;48928:1;48914:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48890:40;;48959:4;48941;48946:1;48941:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;48985:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48975:4;48980:1;48975:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;49011:48;49028:4;49043:6;;;;;;;;;;;49052;49011:8;:48::i;:::-;49072:26;49101:21;49072:50;;49135:6;;;;;;;;;;;:57;;;49207:6;49228:1;49244:4;49271;49291:15;49135:182;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49330:18;49375;49351:21;:42;;;;:::i;:::-;49330:63;;49406:18;49427:32;49443:15;;49427:11;;:15;;:32;;;;:::i;:::-;49406:53;;49470:17;49490:39;49518:10;49490:23;49501:11;;49490:6;:10;;:23;;;;:::i;:::-;:27;;:39;;;;:::i;:::-;49470:59;;49540:21;49564:43;49596:10;49564:27;49575:15;;49564:6;:10;;:27;;;;:::i;:::-;:31;;:43;;;;:::i;:::-;49540:67;;49620:14;49637:43;49669:10;49637:27;49652:11;;49637:10;:14;;:27;;;;:::i;:::-;:31;;:43;;;;:::i;:::-;49620:60;;49691:18;49712:47;49748:10;49712:31;49727:15;;49712:10;:14;;:31;;;;:::i;:::-;:35;;:47;;;;:::i;:::-;49691:68;;49811:26;49827:9;49811:11;;:15;;:26;;;;:::i;:::-;49797:11;:40;;;;49866:34;49886:13;49866:15;;:19;;:34;;;;:::i;:::-;49848:15;:52;;;;49950:1;49941:6;:10;49937:75;;;49968:15;;;;;;;;;;;:24;;:32;49993:6;49968:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49937:75;50039:1;50026:10;:14;50022:87;;;50057:19;;;;;;;;;;;:28;;:40;50086:10;50057:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50022:87;48879:1237;;;;;;;;36621:5:::0;36611:7;;:15;;;;;;;;;;;;;;;;;;48830:1286;:::o;52071:578::-;52224:1;52206:20;;:6;:20;;;52198:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52301:1;52280:23;;:9;:23;;;52272:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;52349:21;52373:17;52383:6;52373:9;:17::i;:::-;52349:41;;52426:6;52409:13;:23;;52401:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52504:32;52521:6;52529;52504:16;:32::i;:::-;52558:30;52570:9;52581:6;52558:11;:30::i;:::-;52623:9;52606:35;;52615:6;52606:35;;;52634:6;52606:35;;;;;;:::i;:::-;;;;;;;;52187:462;52071:578;;;:::o;7744:191::-;7818:16;7837:6;;;;;;;;;;;7818:25;;7863:8;7854:6;;:17;;;;;;;;;;;;;;;;;;7918:8;7887:40;;7908:8;7887:40;;;;;;;;;;;;7807:128;7744:191;:::o;45197:176::-;45283:47;45300:4;45306:9;:15;45316:4;45306:15;;;;;;;;;;;;;;;;;;;;;;;;;45323:6;45283:47;;;;;;;;:::i;:::-;;;;;;;;45359:6;45341:9;:15;45351:4;45341:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;45197:176;;:::o;51420:602::-;51537:12;51564:14;51593:18;51643:6;51639:324;;;51675:42;36890:6;51675:21;51686:9;;51675:6;:10;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;51666:51;;51745:46;36890:6;51745:25;51756:13;;51745:6;:10;;:25;;;;:::i;:::-;:29;;:46;;;;:::i;:::-;51732:59;;51639:324;;;51833:43;36890:6;51833:22;51844:10;;51833:6;:10;;:22;;;;:::i;:::-;:26;;:43;;;;:::i;:::-;51824:52;;51904:47;36890:6;51904:26;51915:14;;51904:6;:10;;:26;;;;:::i;:::-;:30;;:47;;;;:::i;:::-;51891:60;;51639:324;51980:34;52003:10;51980:18;51991:6;51980;:10;;:18;;;;:::i;:::-;:22;;:34;;;;:::i;:::-;51973:41;;51420:602;;;;;:::o;50779:433::-;50949:1;50929:22;;:8;:22;;;50921:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50999:19;51021:36;51039:17;51021:13;:17;;:36;;;;:::i;:::-;50999:58;;51068:50;51081:8;51099:4;51106:11;51068:12;:50::i;:::-;51144:13;51129:11;;:28;;;;;;;:::i;:::-;;;;;;;;51187:17;51168:15;;:36;;;;;;;:::i;:::-;;;;;;;;50910:302;50779:433;;;:::o;27464:98::-;27522:7;27553:1;27549;:5;;;;:::i;:::-;27542:12;;27464:98;;;;:::o;27863:::-;27921:7;27952:1;27948;:5;;;;:::i;:::-;27941:12;;27863:98;;;;:::o;27107:::-;27165:7;27196:1;27192;:5;;;;:::i;:::-;27185:12;;27107:98;;;;:::o;46972:135::-;47093:6;47072:9;:18;47082:7;47072:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;47051:9;:18;47061:7;47051:18;;;;;;;;;;;;;;;:48;;;;46972:135;;:::o;46834:130::-;46950:6;46929:9;:18;46939:7;46929:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;46908:9;:18;46918:7;46908:18;;;;;;;;;;;;;;;:48;;;;46834:130;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:116::-;3916:21;3931:5;3916:21;:::i;:::-;3909:5;3906:32;3896:60;;3952:1;3949;3942:12;3896:60;3846:116;:::o;3968:133::-;4011:5;4049:6;4036:20;4027:29;;4065:30;4089:5;4065:30;:::i;:::-;3968:133;;;;:::o;4107:468::-;4172:6;4180;4229:2;4217:9;4208:7;4204:23;4200:32;4197:119;;;4235:79;;:::i;:::-;4197:119;4355:1;4380:53;4425:7;4416:6;4405:9;4401:22;4380:53;:::i;:::-;4370:63;;4326:117;4482:2;4508:50;4550:7;4541:6;4530:9;4526:22;4508:50;:::i;:::-;4498:60;;4453:115;4107:468;;;;;:::o;4581:619::-;4658:6;4666;4674;4723:2;4711:9;4702:7;4698:23;4694:32;4691:119;;;4729:79;;:::i;:::-;4691:119;4849:1;4874:53;4919:7;4910:6;4899:9;4895:22;4874:53;:::i;:::-;4864:63;;4820:117;4976:2;5002:53;5047:7;5038:6;5027:9;5023:22;5002:53;:::i;:::-;4992:63;;4947:118;5104:2;5130:53;5175:7;5166:6;5155:9;5151:22;5130:53;:::i;:::-;5120:63;;5075:118;4581:619;;;;;:::o;5206:104::-;5251:7;5280:24;5298:5;5280:24;:::i;:::-;5269:35;;5206:104;;;:::o;5316:142::-;5419:32;5445:5;5419:32;:::i;:::-;5414:3;5407:45;5316:142;;:::o;5464:254::-;5573:4;5611:2;5600:9;5596:18;5588:26;;5624:87;5708:1;5697:9;5693:17;5684:6;5624:87;:::i;:::-;5464:254;;;;:::o;5724:86::-;5759:7;5799:4;5792:5;5788:16;5777:27;;5724:86;;;:::o;5816:112::-;5899:22;5915:5;5899:22;:::i;:::-;5894:3;5887:35;5816:112;;:::o;5934:214::-;6023:4;6061:2;6050:9;6046:18;6038:26;;6074:67;6138:1;6127:9;6123:17;6114:6;6074:67;:::i;:::-;5934:214;;;;:::o;6154:329::-;6213:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6154:329;;;;:::o;6489:::-;6548:6;6597:2;6585:9;6576:7;6572:23;6568:32;6565:119;;;6603:79;;:::i;:::-;6565:119;6723:1;6748:53;6793:7;6784:6;6773:9;6769:22;6748:53;:::i;:::-;6738:63;;6694:117;6489:329;;;;:::o;6824:118::-;6911:24;6929:5;6911:24;:::i;:::-;6906:3;6899:37;6824:118;;:::o;6948:222::-;7041:4;7079:2;7068:9;7064:18;7056:26;;7092:71;7160:1;7149:9;7145:17;7136:6;7092:71;:::i;:::-;6948:222;;;;:::o;7176:474::-;7244:6;7252;7301:2;7289:9;7280:7;7276:23;7272:32;7269:119;;;7307:79;;:::i;:::-;7269:119;7427:1;7452:53;7497:7;7488:6;7477:9;7473:22;7452:53;:::i;:::-;7442:63;;7398:117;7554:2;7580:53;7625:7;7616:6;7605:9;7601:22;7580:53;:::i;:::-;7570:63;;7525:118;7176:474;;;;;:::o;7656:138::-;7737:32;7763:5;7737:32;:::i;:::-;7730:5;7727:43;7717:71;;7784:1;7781;7774:12;7717:71;7656:138;:::o;7800:155::-;7854:5;7892:6;7879:20;7870:29;;7908:41;7943:5;7908:41;:::i;:::-;7800:155;;;;:::o;7961:345::-;8028:6;8077:2;8065:9;8056:7;8052:23;8048:32;8045:119;;;8083:79;;:::i;:::-;8045:119;8203:1;8228:61;8281:7;8272:6;8261:9;8257:22;8228:61;:::i;:::-;8218:71;;8174:125;7961:345;;;;:::o;8312:474::-;8380:6;8388;8437:2;8425:9;8416:7;8412:23;8408:32;8405:119;;;8443:79;;:::i;:::-;8405:119;8563:1;8588:53;8633:7;8624:6;8613:9;8609:22;8588:53;:::i;:::-;8578:63;;8534:117;8690:2;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8706:63;;8661:118;8312:474;;;;;:::o;8792:323::-;8848:6;8897:2;8885:9;8876:7;8872:23;8868:32;8865:119;;;8903:79;;:::i;:::-;8865:119;9023:1;9048:50;9090:7;9081:6;9070:9;9066:22;9048:50;:::i;:::-;9038:60;;8994:114;8792:323;;;;:::o;9121:60::-;9149:3;9170:5;9163:12;;9121:60;;;:::o;9187:142::-;9237:9;9270:53;9288:34;9297:24;9315:5;9297:24;:::i;:::-;9288:34;:::i;:::-;9270:53;:::i;:::-;9257:66;;9187:142;;;:::o;9335:126::-;9385:9;9418:37;9449:5;9418:37;:::i;:::-;9405:50;;9335:126;;;:::o;9467:153::-;9544:9;9577:37;9608:5;9577:37;:::i;:::-;9564:50;;9467:153;;;:::o;9626:185::-;9740:64;9798:5;9740:64;:::i;:::-;9735:3;9728:77;9626:185;;:::o;9817:276::-;9937:4;9975:2;9964:9;9960:18;9952:26;;9988:98;10083:1;10072:9;10068:17;10059:6;9988:98;:::i;:::-;9817:276;;;;:::o;10099:180::-;10147:77;10144:1;10137:88;10244:4;10241:1;10234:15;10268:4;10265:1;10258:15;10285:320;10329:6;10366:1;10360:4;10356:12;10346:22;;10413:1;10407:4;10403:12;10434:18;10424:81;;10490:4;10482:6;10478:17;10468:27;;10424:81;10552:2;10544:6;10541:14;10521:18;10518:38;10515:84;;10571:18;;:::i;:::-;10515:84;10336:269;10285:320;;;:::o;10611:182::-;10751:34;10747:1;10739:6;10735:14;10728:58;10611:182;:::o;10799:366::-;10941:3;10962:67;11026:2;11021:3;10962:67;:::i;:::-;10955:74;;11038:93;11127:3;11038:93;:::i;:::-;11156:2;11151:3;11147:12;11140:19;;10799:366;;;:::o;11171:419::-;11337:4;11375:2;11364:9;11360:18;11352:26;;11424:9;11418:4;11414:20;11410:1;11399:9;11395:17;11388:47;11452:131;11578:4;11452:131;:::i;:::-;11444:139;;11171:419;;;:::o;11596:320::-;11711:4;11749:2;11738:9;11734:18;11726:26;;11762:71;11830:1;11819:9;11815:17;11806:6;11762:71;:::i;:::-;11843:66;11905:2;11894:9;11890:18;11881:6;11843:66;:::i;:::-;11596:320;;;;;:::o;11922:227::-;12062:34;12058:1;12050:6;12046:14;12039:58;12131:10;12126:2;12118:6;12114:15;12107:35;11922:227;:::o;12155:366::-;12297:3;12318:67;12382:2;12377:3;12318:67;:::i;:::-;12311:74;;12394:93;12483:3;12394:93;:::i;:::-;12512:2;12507:3;12503:12;12496:19;;12155:366;;;:::o;12527:419::-;12693:4;12731:2;12720:9;12716:18;12708:26;;12780:9;12774:4;12770:20;12766:1;12755:9;12751:17;12744:47;12808:131;12934:4;12808:131;:::i;:::-;12800:139;;12527:419;;;:::o;12952:180::-;13000:77;12997:1;12990:88;13097:4;13094:1;13087:15;13121:4;13118:1;13111:15;13138:305;13178:3;13197:20;13215:1;13197:20;:::i;:::-;13192:25;;13231:20;13249:1;13231:20;:::i;:::-;13226:25;;13385:1;13317:66;13313:74;13310:1;13307:81;13304:107;;;13391:18;;:::i;:::-;13304:107;13435:1;13432;13428:9;13421:16;;13138:305;;;;:::o;13449:231::-;13589:34;13585:1;13577:6;13573:14;13566:58;13658:14;13653:2;13645:6;13641:15;13634:39;13449:231;:::o;13686:366::-;13828:3;13849:67;13913:2;13908:3;13849:67;:::i;:::-;13842:74;;13925:93;14014:3;13925:93;:::i;:::-;14043:2;14038:3;14034:12;14027:19;;13686:366;;;:::o;14058:419::-;14224:4;14262:2;14251:9;14247:18;14239:26;;14311:9;14305:4;14301:20;14297:1;14286:9;14282:17;14275:47;14339:131;14465:4;14339:131;:::i;:::-;14331:139;;14058:419;;;:::o;14483:332::-;14604:4;14642:2;14631:9;14627:18;14619:26;;14655:71;14723:1;14712:9;14708:17;14699:6;14655:71;:::i;:::-;14736:72;14804:2;14793:9;14789:18;14780:6;14736:72;:::i;:::-;14483:332;;;;;:::o;14821:85::-;14866:7;14895:5;14884:16;;14821:85;;;:::o;14912:158::-;14970:9;15003:61;15021:42;15030:32;15056:5;15030:32;:::i;:::-;15021:42;:::i;:::-;15003:61;:::i;:::-;14990:74;;14912:158;;;:::o;15076:147::-;15171:45;15210:5;15171:45;:::i;:::-;15166:3;15159:58;15076:147;;:::o;15229:807::-;15478:4;15516:3;15505:9;15501:19;15493:27;;15530:71;15598:1;15587:9;15583:17;15574:6;15530:71;:::i;:::-;15611:72;15679:2;15668:9;15664:18;15655:6;15611:72;:::i;:::-;15693:80;15769:2;15758:9;15754:18;15745:6;15693:80;:::i;:::-;15783;15859:2;15848:9;15844:18;15835:6;15783:80;:::i;:::-;15873:73;15941:3;15930:9;15926:19;15917:6;15873:73;:::i;:::-;15956;16024:3;16013:9;16009:19;16000:6;15956:73;:::i;:::-;15229:807;;;;;;;;;:::o;16042:143::-;16099:5;16130:6;16124:13;16115:22;;16146:33;16173:5;16146:33;:::i;:::-;16042:143;;;;:::o;16191:663::-;16279:6;16287;16295;16344:2;16332:9;16323:7;16319:23;16315:32;16312:119;;;16350:79;;:::i;:::-;16312:119;16470:1;16495:64;16551:7;16542:6;16531:9;16527:22;16495:64;:::i;:::-;16485:74;;16441:128;16608:2;16634:64;16690:7;16681:6;16670:9;16666:22;16634:64;:::i;:::-;16624:74;;16579:129;16747:2;16773:64;16829:7;16820:6;16809:9;16805:22;16773:64;:::i;:::-;16763:74;;16718:129;16191:663;;;;;:::o;16860:232::-;17000:34;16996:1;16988:6;16984:14;16977:58;17069:15;17064:2;17056:6;17052:15;17045:40;16860:232;:::o;17098:366::-;17240:3;17261:67;17325:2;17320:3;17261:67;:::i;:::-;17254:74;;17337:93;17426:3;17337:93;:::i;:::-;17455:2;17450:3;17446:12;17439:19;;17098:366;;;:::o;17470:419::-;17636:4;17674:2;17663:9;17659:18;17651:26;;17723:9;17717:4;17713:20;17709:1;17698:9;17694:17;17687:47;17751:131;17877:4;17751:131;:::i;:::-;17743:139;;17470:419;;;:::o;17895:228::-;18035:34;18031:1;18023:6;18019:14;18012:58;18104:11;18099:2;18091:6;18087:15;18080:36;17895:228;:::o;18129:366::-;18271:3;18292:67;18356:2;18351:3;18292:67;:::i;:::-;18285:74;;18368:93;18457:3;18368:93;:::i;:::-;18486:2;18481:3;18477:12;18470:19;;18129:366;;;:::o;18501:419::-;18667:4;18705:2;18694:9;18690:18;18682:26;;18754:9;18748:4;18744:20;18740:1;18729:9;18725:17;18718:47;18782:131;18908:4;18782:131;:::i;:::-;18774:139;;18501:419;;;:::o;18926:227::-;19066:34;19062:1;19054:6;19050:14;19043:58;19135:10;19130:2;19122:6;19118:15;19111:35;18926:227;:::o;19159:366::-;19301:3;19322:67;19386:2;19381:3;19322:67;:::i;:::-;19315:74;;19398:93;19487:3;19398:93;:::i;:::-;19516:2;19511:3;19507:12;19500:19;;19159:366;;;:::o;19531:419::-;19697:4;19735:2;19724:9;19720:18;19712:26;;19784:9;19778:4;19774:20;19770:1;19759:9;19755:17;19748:47;19812:131;19938:4;19812:131;:::i;:::-;19804:139;;19531:419;;;:::o;19956:224::-;20096:34;20092:1;20084:6;20080:14;20073:58;20165:7;20160:2;20152:6;20148:15;20141:32;19956:224;:::o;20186:366::-;20328:3;20349:67;20413:2;20408:3;20349:67;:::i;:::-;20342:74;;20425:93;20514:3;20425:93;:::i;:::-;20543:2;20538:3;20534:12;20527:19;;20186:366;;;:::o;20558:419::-;20724:4;20762:2;20751:9;20747:18;20739:26;;20811:9;20805:4;20801:20;20797:1;20786:9;20782:17;20775:47;20839:131;20965:4;20839:131;:::i;:::-;20831:139;;20558:419;;;:::o;20983:228::-;21123:34;21119:1;21111:6;21107:14;21100:58;21192:11;21187:2;21179:6;21175:15;21168:36;20983:228;:::o;21217:366::-;21359:3;21380:67;21444:2;21439:3;21380:67;:::i;:::-;21373:74;;21456:93;21545:3;21456:93;:::i;:::-;21574:2;21569:3;21565:12;21558:19;;21217:366;;;:::o;21589:419::-;21755:4;21793:2;21782:9;21778:18;21770:26;;21842:9;21836:4;21832:20;21828:1;21817:9;21813:17;21806:47;21870:131;21996:4;21870:131;:::i;:::-;21862:139;;21589:419;;;:::o;22014:191::-;22054:4;22074:20;22092:1;22074:20;:::i;:::-;22069:25;;22108:20;22126:1;22108:20;:::i;:::-;22103:25;;22147:1;22144;22141:8;22138:34;;;22152:18;;:::i;:::-;22138:34;22197:1;22194;22190:9;22182:17;;22014:191;;;;:::o;22211:134::-;22269:9;22302:37;22333:5;22302:37;:::i;:::-;22289:50;;22211:134;;;:::o;22351:147::-;22446:45;22485:5;22446:45;:::i;:::-;22441:3;22434:58;22351:147;;:::o;22504:364::-;22641:4;22679:2;22668:9;22664:18;22656:26;;22692:79;22768:1;22757:9;22753:17;22744:6;22692:79;:::i;:::-;22781:80;22857:2;22846:9;22842:18;22833:6;22781:80;:::i;:::-;22504:364;;;;;:::o;22874:308::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23034:65;23096:1;23085:9;23081:17;23072:6;23034:65;:::i;:::-;23109:66;23171:2;23160:9;23156:18;23147:6;23109:66;:::i;:::-;22874:308;;;;;:::o;23188:232::-;23328:34;23324:1;23316:6;23312:14;23305:58;23397:15;23392:2;23384:6;23380:15;23373:40;23188:232;:::o;23426:366::-;23568:3;23589:67;23653:2;23648:3;23589:67;:::i;:::-;23582:74;;23665:93;23754:3;23665:93;:::i;:::-;23783:2;23778:3;23774:12;23767:19;;23426:366;;;:::o;23798:419::-;23964:4;24002:2;23991:9;23987:18;23979:26;;24051:9;24045:4;24041:20;24037:1;24026:9;24022:17;24015:47;24079:131;24205:4;24079:131;:::i;:::-;24071:139;;23798:419;;;:::o;24223:225::-;24363:34;24359:1;24351:6;24347:14;24340:58;24432:8;24427:2;24419:6;24415:15;24408:33;24223:225;:::o;24454:366::-;24596:3;24617:67;24681:2;24676:3;24617:67;:::i;:::-;24610:74;;24693:93;24782:3;24693:93;:::i;:::-;24811:2;24806:3;24802:12;24795:19;;24454:366;;;:::o;24826:419::-;24992:4;25030:2;25019:9;25015:18;25007:26;;25079:9;25073:4;25069:20;25065:1;25054:9;25050:17;25043:47;25107:131;25233:4;25107:131;:::i;:::-;25099:139;;24826:419;;;:::o;25251:223::-;25391:34;25387:1;25379:6;25375:14;25368:58;25460:6;25455:2;25447:6;25443:15;25436:31;25251:223;:::o;25480:366::-;25622:3;25643:67;25707:2;25702:3;25643:67;:::i;:::-;25636:74;;25719:93;25808:3;25719:93;:::i;:::-;25837:2;25832:3;25828:12;25821:19;;25480:366;;;:::o;25852:419::-;26018:4;26056:2;26045:9;26041:18;26033:26;;26105:9;26099:4;26095:20;26091:1;26080:9;26076:17;26069:47;26133:131;26259:4;26133:131;:::i;:::-;26125:139;;25852:419;;;:::o;26277:221::-;26417:34;26413:1;26405:6;26401:14;26394:58;26486:4;26481:2;26473:6;26469:15;26462:29;26277:221;:::o;26504:366::-;26646:3;26667:67;26731:2;26726:3;26667:67;:::i;:::-;26660:74;;26743:93;26832:3;26743:93;:::i;:::-;26861:2;26856:3;26852:12;26845:19;;26504:366;;;:::o;26876:419::-;27042:4;27080:2;27069:9;27065:18;27057:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27157:131;27283:4;27157:131;:::i;:::-;27149:139;;26876:419;;;:::o;27301:174::-;27441:26;27437:1;27429:6;27425:14;27418:50;27301:174;:::o;27481:366::-;27623:3;27644:67;27708:2;27703:3;27644:67;:::i;:::-;27637:74;;27720:93;27809:3;27720:93;:::i;:::-;27838:2;27833:3;27829:12;27822:19;;27481:366;;;:::o;27853:419::-;28019:4;28057:2;28046:9;28042:18;28034:26;;28106:9;28100:4;28096:20;28092:1;28081:9;28077:17;28070:47;28134:131;28260:4;28134:131;:::i;:::-;28126:139;;27853:419;;;:::o;28278:175::-;28418:27;28414:1;28406:6;28402:14;28395:51;28278:175;:::o;28459:366::-;28601:3;28622:67;28686:2;28681:3;28622:67;:::i;:::-;28615:74;;28698:93;28787:3;28698:93;:::i;:::-;28816:2;28811:3;28807:12;28800:19;;28459:366;;;:::o;28831:419::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;28831:419;;;:::o;29256:178::-;29396:30;29392:1;29384:6;29380:14;29373:54;29256:178;:::o;29440:366::-;29582:3;29603:67;29667:2;29662:3;29603:67;:::i;:::-;29596:74;;29679:93;29768:3;29679:93;:::i;:::-;29797:2;29792:3;29788:12;29781:19;;29440:366;;;:::o;29812:419::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:180::-;30285:77;30282:1;30275:88;30382:4;30379:1;30372:15;30406:4;30403:1;30396:15;30423:180;30471:77;30468:1;30461:88;30568:4;30565:1;30558:15;30592:4;30589:1;30582:15;30609:143;30666:5;30697:6;30691:13;30682:22;;30713:33;30740:5;30713:33;:::i;:::-;30609:143;;;;:::o;30758:351::-;30828:6;30877:2;30865:9;30856:7;30852:23;30848:32;30845:119;;;30883:79;;:::i;:::-;30845:119;31003:1;31028:64;31084:7;31075:6;31064:9;31060:22;31028:64;:::i;:::-;31018:74;;30974:128;30758:351;;;;:::o;31115:114::-;31182:6;31216:5;31210:12;31200:22;;31115:114;;;:::o;31235:184::-;31334:11;31368:6;31363:3;31356:19;31408:4;31403:3;31399:14;31384:29;;31235:184;;;;:::o;31425:132::-;31492:4;31515:3;31507:11;;31545:4;31540:3;31536:14;31528:22;;31425:132;;;:::o;31563:108::-;31640:24;31658:5;31640:24;:::i;:::-;31635:3;31628:37;31563:108;;:::o;31677:179::-;31746:10;31767:46;31809:3;31801:6;31767:46;:::i;:::-;31845:4;31840:3;31836:14;31822:28;;31677:179;;;;:::o;31862:113::-;31932:4;31964;31959:3;31955:14;31947:22;;31862:113;;;:::o;32011:732::-;32130:3;32159:54;32207:5;32159:54;:::i;:::-;32229:86;32308:6;32303:3;32229:86;:::i;:::-;32222:93;;32339:56;32389:5;32339:56;:::i;:::-;32418:7;32449:1;32434:284;32459:6;32456:1;32453:13;32434:284;;;32535:6;32529:13;32562:63;32621:3;32606:13;32562:63;:::i;:::-;32555:70;;32648:60;32701:6;32648:60;:::i;:::-;32638:70;;32494:224;32481:1;32478;32474:9;32469:14;;32434:284;;;32438:14;32734:3;32727:10;;32135:608;;;32011:732;;;;:::o;32749:831::-;33012:4;33050:3;33039:9;33035:19;33027:27;;33064:71;33132:1;33121:9;33117:17;33108:6;33064:71;:::i;:::-;33145:80;33221:2;33210:9;33206:18;33197:6;33145:80;:::i;:::-;33272:9;33266:4;33262:20;33257:2;33246:9;33242:18;33235:48;33300:108;33403:4;33394:6;33300:108;:::i;:::-;33292:116;;33418:72;33486:2;33475:9;33471:18;33462:6;33418:72;:::i;:::-;33500:73;33568:3;33557:9;33553:19;33544:6;33500:73;:::i;:::-;32749:831;;;;;;;;:::o;33586:180::-;33726:32;33722:1;33714:6;33710:14;33703:56;33586:180;:::o;33772:366::-;33914:3;33935:67;33999:2;33994:3;33935:67;:::i;:::-;33928:74;;34011:93;34100:3;34011:93;:::i;:::-;34129:2;34124:3;34120:12;34113:19;;33772:366;;;:::o;34144:419::-;34310:4;34348:2;34337:9;34333:18;34325:26;;34397:9;34391:4;34387:20;34383:1;34372:9;34368:17;34361:47;34425:131;34551:4;34425:131;:::i;:::-;34417:139;;34144:419;;;:::o;34569:178::-;34709:30;34705:1;34697:6;34693:14;34686:54;34569:178;:::o;34753:366::-;34895:3;34916:67;34980:2;34975:3;34916:67;:::i;:::-;34909:74;;34992:93;35081:3;34992:93;:::i;:::-;35110:2;35105:3;35101:12;35094:19;;34753:366;;;:::o;35125:419::-;35291:4;35329:2;35318:9;35314:18;35306:26;;35378:9;35372:4;35368:20;35364:1;35353:9;35349:17;35342:47;35406:131;35532:4;35406:131;:::i;:::-;35398:139;;35125:419;;;:::o;35550:181::-;35690:33;35686:1;35678:6;35674:14;35667:57;35550:181;:::o;35737:366::-;35879:3;35900:67;35964:2;35959:3;35900:67;:::i;:::-;35893:74;;35976:93;36065:3;35976:93;:::i;:::-;36094:2;36089:3;36085:12;36078:19;;35737:366;;;:::o;36109:419::-;36275:4;36313:2;36302:9;36298:18;36290:26;;36362:9;36356:4;36352:20;36348:1;36337:9;36333:17;36326:47;36390:131;36516:4;36390:131;:::i;:::-;36382:139;;36109:419;;;:::o;36534:418::-;36671:4;36709:2;36698:9;36694:18;36686:26;;36722:71;36790:1;36779:9;36775:17;36766:6;36722:71;:::i;:::-;36803:66;36865:2;36854:9;36850:18;36841:6;36803:66;:::i;:::-;36879;36941:2;36930:9;36926:18;36917:6;36879:66;:::i;:::-;36534:418;;;;;;:::o;36958:180::-;37098:32;37094:1;37086:6;37082:14;37075:56;36958:180;:::o;37144:366::-;37286:3;37307:67;37371:2;37366:3;37307:67;:::i;:::-;37300:74;;37383:93;37472:3;37383:93;:::i;:::-;37501:2;37496:3;37492:12;37485:19;;37144:366;;;:::o;37516:419::-;37682:4;37720:2;37709:9;37705:18;37697:26;;37769:9;37763:4;37759:20;37755:1;37744:9;37740:17;37733:47;37797:131;37923:4;37797:131;:::i;:::-;37789:139;;37516:419;;;:::o;37941:348::-;37981:7;38004:20;38022:1;38004:20;:::i;:::-;37999:25;;38038:20;38056:1;38038:20;:::i;:::-;38033:25;;38226:1;38158:66;38154:74;38151:1;38148:81;38143:1;38136:9;38129:17;38125:105;38122:131;;;38233:18;;:::i;:::-;38122:131;38281:1;38278;38274:9;38263:20;;37941:348;;;;:::o;38295:180::-;38343:77;38340:1;38333:88;38440:4;38437:1;38430:15;38464:4;38461:1;38454:15;38481:185;38521:1;38538:20;38556:1;38538:20;:::i;:::-;38533:25;;38572:20;38590:1;38572:20;:::i;:::-;38567:25;;38611:1;38601:35;;38616:18;;:::i;:::-;38601:35;38658:1;38655;38651:9;38646:14;;38481:185;;;;:::o

Swarm Source

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