ETH Price: $3,395.15 (+1.35%)
Gas: 8 Gwei

Token

SHELTIE INU (SHINU)
 

Overview

Max Total Supply

1,000,000,000,000,000 SHINU

Holders

582

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,031,557.459039187079753488 SHINU

Value
$0.00
0x23b6d97798808f55bc9cc228c68428af736223cb
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:
SHINU

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-10
*/

// SPDX-License-Identifier: MIT

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. 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) {
        
        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) {
        
            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) {
        
            // 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) {
        
            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) {
        
            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) {
        
            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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        
            require(b > 0, errorMessage);
            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) {
        
            require(b > 0, errorMessage);
            return a % b;
        
    }
}

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

/**
 * @dev 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
    ERC20 token, 3% redistribution, 5% burn, 3% charity wallet
    1,000,000,000,000,000
    SHINU , SHELTIE INU, 18
 */
contract SHINU is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    string private _name = "SHELTIE INU";
    string private _symbol = "SHINU";
    uint8 private _decimals = 18;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000 * 10**6 * 10**_decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _tBurnTotal;

    uint256 public _rewardFee = 3;
    uint256 private _previousRewardFee = _rewardFee;
    uint256 public _burnFee = 5;
    uint256 private _previousBurnFee = _burnFee;
    uint256 public _taxFee = 3;
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _maxTxAmount = 5000000 * 10**6 * 10**_decimals;

    string private _charityAddress = "0x46E98D41dAA949F53BA16172d581Fd5c9c9B7721";
    address private _charityWallet;

    constructor() {
        _rOwned[_msgSender()] = _rTotal;

        _charityWallet = parseAddr(_charityAddress);
        _tOwned[_charityWallet] = 0;
        _rOwned[_charityWallet] = 0;

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender,_msgSender(),_allowances[sender][_msgSender()].sub(amount,"ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function totalBurns() public view returns (uint256) {
        return _tBurnTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (
            uint256 rAmount, 
            uint256 rTransferAmount, 
            uint256 rRewardFee,
            uint256 tTransferAmount, 
            uint256 tRewardFee, 
            uint256 tBurnFee, 
            uint256 tTaxFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeBurn(tBurnFee);
        _takeCharity(tTaxFee);
        _reflectFee(rRewardFee, tRewardFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**2);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view 
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) 
    {
        (uint256 tTransferAmount, uint256 tRewardFee, uint256 tBurnFee, uint256 tTaxFee) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rRewardFee) =
            _getRValues(tAmount, tRewardFee, tBurnFee, tTaxFee, _getRate());
        return (rAmount, rTransferAmount, rRewardFee, tTransferAmount, tRewardFee, tBurnFee, tTaxFee);
    }

    function _getTValues(uint256 tAmount) private view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tRewardFee = calculateRewardFee(tAmount);
        uint256 tBurnFee = calculateBurnFee(tAmount);
        uint256 tTaxFee = calculateTaxFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tRewardFee).sub(tBurnFee).sub(tTaxFee);
        return (tTransferAmount, tRewardFee, tBurnFee, tTaxFee);
    }

    function _getRValues(uint256 tAmount, uint256 tRewardFee, uint256 tBurnFee, uint256 tTaxFee, uint256 currentRate) private pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rRewardFee = tRewardFee.mul(currentRate);
        uint256 rBurnFee = tBurnFee.mul(currentRate);
        uint256 rTaxFee = tTaxFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rRewardFee).sub(rBurnFee).sub(rTaxFee);
        return (rAmount, rTransferAmount, rRewardFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function calculateRewardFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_rewardFee).div(10**2);
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(10**2);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0) return;
        _previousRewardFee = _rewardFee;
        _previousBurnFee = _burnFee;
        _previousTaxFee = _taxFee;

        _rewardFee = 0;
        _burnFee = 0;
        _taxFee = 0;
    }

    function restoreAllFee() private {
        _rewardFee = _previousRewardFee;
        _burnFee = _previousBurnFee;
        _taxFee = _previousTaxFee;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        //transfer amount, it will take reward, burn, tax fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if (!takeFee) removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (
            uint256 rAmount, 
            uint256 rTransferAmount, 
            uint256 rRewardFee,
            uint256 tTransferAmount, 
            uint256 tRewardFee, 
            uint256 tBurnFee, 
            uint256 tTaxFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeBurn(tBurnFee);
        _takeCharity(tTaxFee);
        _reflectFee(rRewardFee, tRewardFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (
            uint256 rAmount, 
            uint256 rTransferAmount, 
            uint256 rRewardFee,
            uint256 tTransferAmount, 
            uint256 tRewardFee,
            uint256 tBurnFee, 
            uint256 tTaxFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeBurn(tBurnFee);
        _takeCharity(tTaxFee);
        _reflectFee(rRewardFee, tRewardFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (
            uint256 rAmount, 
            uint256 rTransferAmount, 
            uint256 rRewardFee,
            uint256 tTransferAmount, 
            uint256 tRewardFee, 
            uint256 tBurnFee, 
            uint256 tTaxFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeBurn(tBurnFee);
        _takeCharity(tTaxFee);
        _reflectFee(rRewardFee, tRewardFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeBurn(uint256 tBurnFee) private {
        _tBurnTotal = _tBurnTotal.add(tBurnFee);
    }

    function _takeCharity(uint256 tCharity) private {
        uint256 currentRate = _getRate();
        uint256 rCharity = tCharity.mul(currentRate);
        _rOwned[_charityWallet] = _rOwned[_charityWallet].add(rCharity);
    }

    function parseAddr(string memory _stringAddress) internal pure returns (address _parsedAddress) {
        bytes memory tmp = bytes(_stringAddress);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i = 2; i < 2 + 2 * 20; i += 2) {
            iaddr *= 256;
            b1 = uint160(uint8(tmp[i]));
            b2 = uint160(uint8(tmp[i + 1]));
            if ((b1 >= 97) && (b1 <= 102)) {
                b1 -= 87;
            } else if ((b1 >= 65) && (b1 <= 70)) {
                b1 -= 55;
            } else if ((b1 >= 48) && (b1 <= 57)) {
                b1 -= 48;
            }
            if ((b2 >= 97) && (b2 <= 102)) {
                b2 -= 87;
            } else if ((b2 >= 65) && (b2 <= 70)) {
                b2 -= 55;
            } else if ((b2 >= 48) && (b2 <= 57)) {
                b2 -= 48;
            }
            iaddr += (b1 * 16 + b2);
        }
        return address(iaddr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600b81526020017f5348454c54494520494e55000000000000000000000000000000000000000000815250600790805190602001906200005192919062000915565b506040518060400160405280600581526020017f5348494e55000000000000000000000000000000000000000000000000000000815250600890805190602001906200009f92919062000915565b506012600960006101000a81548160ff021916908360ff160217905550600960009054906101000a900460ff16600a620000da919062000afc565b66038d7ea4c68000620000ee919062000c8e565b600a55600a5460001962000103919062000dd2565b60001962000112919062000d2a565b600b556003600e55600e54600f5560056010556010546011556003601255601254601355600960009054906101000a900460ff16600a62000154919062000afc565b65048c2739500062000167919062000c8e565b6014556040518060600160405280602a815260200162004f2c602a9139601590805190602001906200019b92919062000915565b50348015620001a957600080fd5b506000620001bc6200059e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600b5460016000620002716200059e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200035260158054620002c29062000d9c565b80601f0160208091040260200160405190810160405280929190818152602001828054620002f09062000d9c565b8015620003415780601f10620003155761010080835404028352916020019162000341565b820191906000526020600020905b8154815290600101906020018083116200032357829003601f168201915b5050505050620005a660201b60201c565b601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060026000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060016000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016004600062000476620008ec60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200052f6200059e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a54604051620005909190620009d6565b60405180910390a362000ea4565b600033905090565b600080829050600080806000600290505b602a811015620008df5761010084620005d1919062000c39565b93508481815181106200060d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1692508460018262000630919062000a44565b8151811062000668577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff16915060618373ffffffffffffffffffffffffffffffffffffffff1610158015620006ba575060668373ffffffffffffffffffffffffffffffffffffffff1611155b15620006d757605783620006cf919062000cef565b92506200078c565b60418373ffffffffffffffffffffffffffffffffffffffff161015801562000716575060468373ffffffffffffffffffffffffffffffffffffffff1611155b1562000733576037836200072b919062000cef565b92506200078b565b60308373ffffffffffffffffffffffffffffffffffffffff161015801562000772575060398373ffffffffffffffffffffffffffffffffffffffff1611155b156200078a5760308362000787919062000cef565b92505b5b5b60618273ffffffffffffffffffffffffffffffffffffffff1610158015620007cb575060668273ffffffffffffffffffffffffffffffffffffffff1611155b15620007e857605782620007e0919062000cef565b91506200089d565b60418273ffffffffffffffffffffffffffffffffffffffff161015801562000827575060468273ffffffffffffffffffffffffffffffffffffffff1611155b1562000844576037826200083c919062000cef565b91506200089c565b60308273ffffffffffffffffffffffffffffffffffffffff161015801562000883575060398273ffffffffffffffffffffffffffffffffffffffff1611155b156200089b5760308262000898919062000cef565b91505b5b5b81601084620008ad919062000c39565b620008b99190620009f3565b84620008c69190620009f3565b9350600281620008d7919062000a44565b9050620005b7565b5082945050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620009239062000d9c565b90600052602060002090601f01602090048101928262000947576000855562000993565b82601f106200096257805160ff191683800117855562000993565b8280016001018555821562000993579182015b828111156200099257825182559160200191906001019062000975565b5b509050620009a29190620009a6565b5090565b5b80821115620009c1576000816000905550600101620009a7565b5090565b620009d08162000d85565b82525050565b6000602082019050620009ed6000830184620009c5565b92915050565b600062000a008262000d65565b915062000a0d8362000d65565b92508273ffffffffffffffffffffffffffffffffffffffff0382111562000a395762000a3862000e0a565b5b828201905092915050565b600062000a518262000d85565b915062000a5e8362000d85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a965762000a9562000e0a565b5b828201905092915050565b6000808291508390505b600185111562000af35780860481111562000acb5762000aca62000e0a565b5b600185161562000adb5780820291505b808102905062000aeb8562000e97565b945062000aab565b94509492505050565b600062000b098262000d85565b915062000b168362000d8f565b925062000b457fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000b4d565b905092915050565b60008262000b5f576001905062000c32565b8162000b6f576000905062000c32565b816001811462000b88576002811462000b935762000bc9565b600191505062000c32565b60ff84111562000ba85762000ba762000e0a565b5b8360020a91508482111562000bc25762000bc162000e0a565b5b5062000c32565b5060208310610133831016604e8410600b841016171562000c035782820a90508381111562000bfd5762000bfc62000e0a565b5b62000c32565b62000c12848484600162000aa1565b9250905081840481111562000c2c5762000c2b62000e0a565b5b81810290505b9392505050565b600062000c468262000d65565b915062000c538362000d65565b92508173ffffffffffffffffffffffffffffffffffffffff048311821515161562000c835762000c8262000e0a565b5b828202905092915050565b600062000c9b8262000d85565b915062000ca88362000d85565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000ce45762000ce362000e0a565b5b828202905092915050565b600062000cfc8262000d65565b915062000d098362000d65565b92508282101562000d1f5762000d1e62000e0a565b5b828203905092915050565b600062000d378262000d85565b915062000d448362000d85565b92508282101562000d5a5762000d5962000e0a565b5b828203905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000db557607f821691505b6020821081141562000dcc5762000dcb62000e68565b5b50919050565b600062000ddf8262000d85565b915062000dec8362000d85565b92508262000dff5762000dfe62000e39565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b6140788062000eb46000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806352390c021161010f57806395d89b41116100a2578063d543dbeb11610071578063d543dbeb146105aa578063dd62ed3e146105c6578063ea2f0b37146105f6578063f2fde38b14610612576101e5565b806395d89b411461050e578063a457c2d71461052c578063a9059cbb1461055c578063c0b0fda21461058c576101e5565b8063715018a6116100de578063715018a6146104985780637d1db4a5146104a257806388f82020146104c05780638da5cb5b146104f0576101e5565b806352390c02146103fe5780635342acb41461041a578063694ca01d1461044a57806370a0823114610468576101e5565b8063313ce567116101875780633bd5d173116101565780633bd5d17314610378578063437823ec146103945780634549b039146103b057806351fde4bb146103e0576101e5565b8063313ce567146102f05780633685d4191461030e578063395093511461032a5780633b124fe71461035a576101e5565b806313114a9d116101c357806313114a9d1461025457806318160ddd1461027257806323b872dd146102905780632d838119146102c0576101e5565b8063061c82d0146101ea57806306fdde0314610206578063095ea7b314610224575b600080fd5b61020460048036038101906101ff91906135a0565b61062e565b005b61020e6106b4565b60405161021b9190613b06565b60405180910390f35b61023e60048036038101906102399190613564565b610746565b60405161024b9190613aeb565b60405180910390f35b61025c610764565b6040516102699190613ca8565b60405180910390f35b61027a61076e565b6040516102879190613ca8565b60405180910390f35b6102aa60048036038101906102a59190613515565b610778565b6040516102b79190613aeb565b60405180910390f35b6102da60048036038101906102d591906135a0565b610851565b6040516102e79190613ca8565b60405180910390f35b6102f86108bf565b6040516103059190613cc3565b60405180910390f35b610328600480360381019061032391906134b0565b6108d6565b005b610344600480360381019061033f9190613564565b610ca4565b6040516103519190613aeb565b60405180910390f35b610362610d57565b60405161036f9190613ca8565b60405180910390f35b610392600480360381019061038d91906135a0565b610d5d565b005b6103ae60048036038101906103a991906134b0565b610ed9565b005b6103ca60048036038101906103c591906135c9565b610fb0565b6040516103d79190613ca8565b60405180910390f35b6103e8611036565b6040516103f59190613ca8565b60405180910390f35b610418600480360381019061041391906134b0565b61103c565b005b610434600480360381019061042f91906134b0565b6112d7565b6040516104419190613aeb565b60405180910390f35b61045261132d565b60405161045f9190613ca8565b60405180910390f35b610482600480360381019061047d91906134b0565b611337565b60405161048f9190613ca8565b60405180910390f35b6104a0611422565b005b6104aa61155c565b6040516104b79190613ca8565b60405180910390f35b6104da60048036038101906104d591906134b0565b611562565b6040516104e79190613aeb565b60405180910390f35b6104f86115b8565b6040516105059190613ad0565b60405180910390f35b6105166115e1565b6040516105239190613b06565b60405180910390f35b61054660048036038101906105419190613564565b611673565b6040516105539190613aeb565b60405180910390f35b61057660048036038101906105719190613564565b611740565b6040516105839190613aeb565b60405180910390f35b61059461175e565b6040516105a19190613ca8565b60405180910390f35b6105c460048036038101906105bf91906135a0565b611764565b005b6105e060048036038101906105db91906134d9565b611811565b6040516105ed9190613ca8565b60405180910390f35b610610600480360381019061060b91906134b0565b611898565b005b61062c600480360381019061062791906134b0565b61196f565b005b610636611b18565b73ffffffffffffffffffffffffffffffffffffffff166106546115b8565b73ffffffffffffffffffffffffffffffffffffffff16146106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190613c08565b60405180910390fd5b8060128190555050565b6060600780546106c390613e97565b80601f01602080910402602001604051908101604052809291908181526020018280546106ef90613e97565b801561073c5780601f106107115761010080835404028352916020019161073c565b820191906000526020600020905b81548152906001019060200180831161071f57829003601f168201915b5050505050905090565b600061075a610753611b18565b8484611b20565b6001905092915050565b6000600c54905090565b6000600a54905090565b6000610785848484611ceb565b61084684610791611b18565b61084185604051806060016040528060288152602001613ff660289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006107f7611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f929092919063ffffffff16565b611b20565b600190509392505050565b6000600b54821115610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90613b48565b60405180910390fd5b60006108a2611ff0565b90506108b7818461201b90919063ffffffff16565b915050919050565b6000600960009054906101000a900460ff16905090565b6108de611b18565b73ffffffffffffffffffffffffffffffffffffffff166108fc6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990613c08565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590613ba8565b60405180910390fd5b60005b600680549050811015610ca0578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8d5760066001600680549050610a9a9190613ddb565b81548110610ad1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610b36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610c53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610ca0565b8080610c9890613ec9565b9150506109e1565b5050565b6000610d4d610cb1611b18565b84610d488560036000610cc2611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b611b20565b6001905092915050565b60125481565b6000610d67611b18565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90613c88565b60405180910390fd5b6000610e0183612047565b5050505050509050610e5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610eb381600b546120af90919063ffffffff16565b600b81905550610ece83600c5461203190919063ffffffff16565b600c81905550505050565b610ee1611b18565b73ffffffffffffffffffffffffffffffffffffffff16610eff6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613c08565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a54831115610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90613bc8565b60405180910390fd5b8161101857600061100784612047565b505050505050905080915050611030565b600061102384612047565b5050505050915050809150505b92915050565b600e5481565b611044611b18565b73ffffffffffffffffffffffffffffffffffffffff166110626115b8565b73ffffffffffffffffffffffffffffffffffffffff16146110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90613c08565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613ba8565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611219576111d5600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610851565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600d54905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113d257600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061141d565b61141a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610851565b90505b919050565b61142a611b18565b73ffffffffffffffffffffffffffffffffffffffff166114486115b8565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590613c08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60145481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600880546115f090613e97565b80601f016020809104026020016040519081016040528092919081815260200182805461161c90613e97565b80156116695780601f1061163e57610100808354040283529160200191611669565b820191906000526020600020905b81548152906001019060200180831161164c57829003601f168201915b5050505050905090565b6000611736611680611b18565b846117318560405180606001604052806025815260200161401e60259139600360006116aa611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f929092919063ffffffff16565b611b20565b6001905092915050565b600061175461174d611b18565b8484611ceb565b6001905092915050565b60105481565b61176c611b18565b73ffffffffffffffffffffffffffffffffffffffff1661178a6115b8565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613c08565b60405180910390fd5b61180860646117fa83600a546120c590919063ffffffff16565b61201b90919063ffffffff16565b60148190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6118a0611b18565b73ffffffffffffffffffffffffffffffffffffffff166118be6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90613c08565b60405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611977611b18565b73ffffffffffffffffffffffffffffffffffffffff166119956115b8565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613c08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613b68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613b88565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cde9190613ca8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5290613c48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290613b28565b60405180910390fd5b60008111611e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0590613c28565b60405180910390fd5b611e166115b8565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e845750611e546115b8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611ecf57601454811115611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590613be8565b60405180910390fd5b5b600060019050600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f765750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f8057600090505b611f8c848484846120db565b50505050565b6000838311158290611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd19190613b06565b60405180910390fd5b508284611fe79190613ddb565b90509392505050565b6000806000611ffd6123ec565b91509150612014818361201b90919063ffffffff16565b9250505090565b600081836120299190613d50565b905092915050565b6000818361203f9190613cfa565b905092915050565b60008060008060008060008060008060006120618c612737565b935093509350935060008060006120828f87878761207d611ff0565b6127b6565b925092509250828282898989899d509d509d509d509d509d509d5050505050505050919395979092949650565b600081836120bd9190613ddb565b905092915050565b600081836120d39190613d81565b905092915050565b806120e9576120e861286a565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561218c5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156121a15761219c8484846128b0565b6123d8565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122445750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561225957612254848484612b1e565b6123d7565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122fd5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123125761230d848484612d8c565b6123d6565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156123b45750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156123c9576123c4848484612f65565b6123d5565b6123d4848484612d8c565b5b5b5b5b806123e6576123e5613268565b5b50505050565b6000806000600b5490506000600a54905060005b6006805490508110156126fa5782600160006006848154811061244c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061256057508160026000600684815481106124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561257757600b54600a5494509450505050612733565b61262d60016000600684815481106125b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846120af90919063ffffffff16565b92506126e56002600060068481548110612670577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836120af90919063ffffffff16565b915080806126f290613ec9565b915050612400565b50612712600a54600b5461201b90919063ffffffff16565b82101561272a57600b54600a54935093505050612733565b81819350935050505b9091565b600080600080600061274886613285565b90506000612755876132b6565b90506000612762886132e7565b9050600061279d8261278f85612781888e6120af90919063ffffffff16565b6120af90919063ffffffff16565b6120af90919063ffffffff16565b9050808484849750975097509750505050509193509193565b6000806000806127cf858a6120c590919063ffffffff16565b905060006127e6868a6120c590919063ffffffff16565b905060006127fd878a6120c590919063ffffffff16565b90506000612814888a6120c590919063ffffffff16565b9050600061284f8261284185612833888a6120af90919063ffffffff16565b6120af90919063ffffffff16565b6120af90919063ffffffff16565b90508481859750975097505050505050955095509592505050565b6000601254141561287a576128ae565b600e54600f819055506010546011819055506012546013819055506000600e81905550600060108190555060006012819055505b565b60008060008060008060006128c488612047565b965096509650965096509650965061292488600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129b987600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a4e86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9a82613318565b612aa381613336565b612aad8584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b0a9190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612b3288612047565b9650965096509650965096509650612b9287600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c2784600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cbc86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d0882613318565b612d1181613336565b612d1b8584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612d789190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612da088612047565b9650965096509650965096509650612e0087600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ee182613318565b612eea81613336565b612ef48584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f519190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612f7988612047565b9650965096509650965096509650612fd988600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061306e87600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061310384600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061319886600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131e482613318565b6131ed81613336565b6131f78584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516132549190613ca8565b60405180910390a350505050505050505050565b600f54600e81905550601154601081905550601354601281905550565b60006132af60646132a1600e54856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b60006132e060646132d2601054856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b60006133116064613303601254856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b61332d81600d5461203190919063ffffffff16565b600d8190555050565b6000613340611ff0565b9050600061335782846120c590919063ffffffff16565b90506133cd8160016000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b60016000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b61344c82600b546120af90919063ffffffff16565b600b8190555061346781600c5461203190919063ffffffff16565b600c819055505050565b60008135905061348081613fb0565b92915050565b60008135905061349581613fc7565b92915050565b6000813590506134aa81613fde565b92915050565b6000602082840312156134c257600080fd5b60006134d084828501613471565b91505092915050565b600080604083850312156134ec57600080fd5b60006134fa85828601613471565b925050602061350b85828601613471565b9150509250929050565b60008060006060848603121561352a57600080fd5b600061353886828701613471565b935050602061354986828701613471565b925050604061355a8682870161349b565b9150509250925092565b6000806040838503121561357757600080fd5b600061358585828601613471565b92505060206135968582860161349b565b9150509250929050565b6000602082840312156135b257600080fd5b60006135c08482850161349b565b91505092915050565b600080604083850312156135dc57600080fd5b60006135ea8582860161349b565b92505060206135fb85828601613486565b9150509250929050565b61360e81613e0f565b82525050565b61361d81613e21565b82525050565b600061362e82613cde565b6136388185613ce9565b9350613648818560208601613e64565b61365181613f9f565b840191505092915050565b6000613669602383613ce9565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136cf602a83613ce9565b91507f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008301527f65666c656374696f6e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613735602683613ce9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379b602283613ce9565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613801601b83613ce9565b91507f4163636f756e7420697320616c7265616479206578636c7564656400000000006000830152602082019050919050565b6000613841601f83613ce9565b91507f416d6f756e74206d757374206265206c657373207468616e20737570706c79006000830152602082019050919050565b6000613881602883613ce9565b91507f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008301527f78416d6f756e742e0000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138e7602083613ce9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613927602983613ce9565b91507f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b600061398d602583613ce9565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f3602483613ce9565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a59602c83613ce9565b91507f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008301527f6869732066756e6374696f6e00000000000000000000000000000000000000006020830152604082019050919050565b613abb81613e4d565b82525050565b613aca81613e57565b82525050565b6000602082019050613ae56000830184613605565b92915050565b6000602082019050613b006000830184613614565b92915050565b60006020820190508181036000830152613b208184613623565b905092915050565b60006020820190508181036000830152613b418161365c565b9050919050565b60006020820190508181036000830152613b61816136c2565b9050919050565b60006020820190508181036000830152613b8181613728565b9050919050565b60006020820190508181036000830152613ba18161378e565b9050919050565b60006020820190508181036000830152613bc1816137f4565b9050919050565b60006020820190508181036000830152613be181613834565b9050919050565b60006020820190508181036000830152613c0181613874565b9050919050565b60006020820190508181036000830152613c21816138da565b9050919050565b60006020820190508181036000830152613c418161391a565b9050919050565b60006020820190508181036000830152613c6181613980565b9050919050565b60006020820190508181036000830152613c81816139e6565b9050919050565b60006020820190508181036000830152613ca181613a4c565b9050919050565b6000602082019050613cbd6000830184613ab2565b92915050565b6000602082019050613cd86000830184613ac1565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613d0582613e4d565b9150613d1083613e4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4557613d44613f12565b5b828201905092915050565b6000613d5b82613e4d565b9150613d6683613e4d565b925082613d7657613d75613f41565b5b828204905092915050565b6000613d8c82613e4d565b9150613d9783613e4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dd057613dcf613f12565b5b828202905092915050565b6000613de682613e4d565b9150613df183613e4d565b925082821015613e0457613e03613f12565b5b828203905092915050565b6000613e1a82613e2d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613e82578082015181840152602081019050613e67565b83811115613e91576000848401525b50505050565b60006002820490506001821680613eaf57607f821691505b60208210811415613ec357613ec2613f70565b5b50919050565b6000613ed482613e4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0757613f06613f12565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b613fb981613e0f565b8114613fc457600080fd5b50565b613fd081613e21565b8114613fdb57600080fd5b50565b613fe781613e4d565b8114613ff257600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203128e0274f8a545615ce976b8d9e83c1cacf2a91fa4d7f092f28e90102fa4acc64736f6c63430008000033307834364539384434316441413934394635334241313631373264353831466435633963394237373231

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806352390c021161010f57806395d89b41116100a2578063d543dbeb11610071578063d543dbeb146105aa578063dd62ed3e146105c6578063ea2f0b37146105f6578063f2fde38b14610612576101e5565b806395d89b411461050e578063a457c2d71461052c578063a9059cbb1461055c578063c0b0fda21461058c576101e5565b8063715018a6116100de578063715018a6146104985780637d1db4a5146104a257806388f82020146104c05780638da5cb5b146104f0576101e5565b806352390c02146103fe5780635342acb41461041a578063694ca01d1461044a57806370a0823114610468576101e5565b8063313ce567116101875780633bd5d173116101565780633bd5d17314610378578063437823ec146103945780634549b039146103b057806351fde4bb146103e0576101e5565b8063313ce567146102f05780633685d4191461030e578063395093511461032a5780633b124fe71461035a576101e5565b806313114a9d116101c357806313114a9d1461025457806318160ddd1461027257806323b872dd146102905780632d838119146102c0576101e5565b8063061c82d0146101ea57806306fdde0314610206578063095ea7b314610224575b600080fd5b61020460048036038101906101ff91906135a0565b61062e565b005b61020e6106b4565b60405161021b9190613b06565b60405180910390f35b61023e60048036038101906102399190613564565b610746565b60405161024b9190613aeb565b60405180910390f35b61025c610764565b6040516102699190613ca8565b60405180910390f35b61027a61076e565b6040516102879190613ca8565b60405180910390f35b6102aa60048036038101906102a59190613515565b610778565b6040516102b79190613aeb565b60405180910390f35b6102da60048036038101906102d591906135a0565b610851565b6040516102e79190613ca8565b60405180910390f35b6102f86108bf565b6040516103059190613cc3565b60405180910390f35b610328600480360381019061032391906134b0565b6108d6565b005b610344600480360381019061033f9190613564565b610ca4565b6040516103519190613aeb565b60405180910390f35b610362610d57565b60405161036f9190613ca8565b60405180910390f35b610392600480360381019061038d91906135a0565b610d5d565b005b6103ae60048036038101906103a991906134b0565b610ed9565b005b6103ca60048036038101906103c591906135c9565b610fb0565b6040516103d79190613ca8565b60405180910390f35b6103e8611036565b6040516103f59190613ca8565b60405180910390f35b610418600480360381019061041391906134b0565b61103c565b005b610434600480360381019061042f91906134b0565b6112d7565b6040516104419190613aeb565b60405180910390f35b61045261132d565b60405161045f9190613ca8565b60405180910390f35b610482600480360381019061047d91906134b0565b611337565b60405161048f9190613ca8565b60405180910390f35b6104a0611422565b005b6104aa61155c565b6040516104b79190613ca8565b60405180910390f35b6104da60048036038101906104d591906134b0565b611562565b6040516104e79190613aeb565b60405180910390f35b6104f86115b8565b6040516105059190613ad0565b60405180910390f35b6105166115e1565b6040516105239190613b06565b60405180910390f35b61054660048036038101906105419190613564565b611673565b6040516105539190613aeb565b60405180910390f35b61057660048036038101906105719190613564565b611740565b6040516105839190613aeb565b60405180910390f35b61059461175e565b6040516105a19190613ca8565b60405180910390f35b6105c460048036038101906105bf91906135a0565b611764565b005b6105e060048036038101906105db91906134d9565b611811565b6040516105ed9190613ca8565b60405180910390f35b610610600480360381019061060b91906134b0565b611898565b005b61062c600480360381019061062791906134b0565b61196f565b005b610636611b18565b73ffffffffffffffffffffffffffffffffffffffff166106546115b8565b73ffffffffffffffffffffffffffffffffffffffff16146106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190613c08565b60405180910390fd5b8060128190555050565b6060600780546106c390613e97565b80601f01602080910402602001604051908101604052809291908181526020018280546106ef90613e97565b801561073c5780601f106107115761010080835404028352916020019161073c565b820191906000526020600020905b81548152906001019060200180831161071f57829003601f168201915b5050505050905090565b600061075a610753611b18565b8484611b20565b6001905092915050565b6000600c54905090565b6000600a54905090565b6000610785848484611ceb565b61084684610791611b18565b61084185604051806060016040528060288152602001613ff660289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006107f7611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f929092919063ffffffff16565b611b20565b600190509392505050565b6000600b54821115610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90613b48565b60405180910390fd5b60006108a2611ff0565b90506108b7818461201b90919063ffffffff16565b915050919050565b6000600960009054906101000a900460ff16905090565b6108de611b18565b73ffffffffffffffffffffffffffffffffffffffff166108fc6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990613c08565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590613ba8565b60405180910390fd5b60005b600680549050811015610ca0578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8d5760066001600680549050610a9a9190613ddb565b81548110610ad1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610b36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610c53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610ca0565b8080610c9890613ec9565b9150506109e1565b5050565b6000610d4d610cb1611b18565b84610d488560036000610cc2611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b611b20565b6001905092915050565b60125481565b6000610d67611b18565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90613c88565b60405180910390fd5b6000610e0183612047565b5050505050509050610e5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610eb381600b546120af90919063ffffffff16565b600b81905550610ece83600c5461203190919063ffffffff16565b600c81905550505050565b610ee1611b18565b73ffffffffffffffffffffffffffffffffffffffff16610eff6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613c08565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a54831115610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90613bc8565b60405180910390fd5b8161101857600061100784612047565b505050505050905080915050611030565b600061102384612047565b5050505050915050809150505b92915050565b600e5481565b611044611b18565b73ffffffffffffffffffffffffffffffffffffffff166110626115b8565b73ffffffffffffffffffffffffffffffffffffffff16146110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90613c08565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613ba8565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611219576111d5600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610851565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600d54905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113d257600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061141d565b61141a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610851565b90505b919050565b61142a611b18565b73ffffffffffffffffffffffffffffffffffffffff166114486115b8565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590613c08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60145481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600880546115f090613e97565b80601f016020809104026020016040519081016040528092919081815260200182805461161c90613e97565b80156116695780601f1061163e57610100808354040283529160200191611669565b820191906000526020600020905b81548152906001019060200180831161164c57829003601f168201915b5050505050905090565b6000611736611680611b18565b846117318560405180606001604052806025815260200161401e60259139600360006116aa611b18565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f929092919063ffffffff16565b611b20565b6001905092915050565b600061175461174d611b18565b8484611ceb565b6001905092915050565b60105481565b61176c611b18565b73ffffffffffffffffffffffffffffffffffffffff1661178a6115b8565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613c08565b60405180910390fd5b61180860646117fa83600a546120c590919063ffffffff16565b61201b90919063ffffffff16565b60148190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6118a0611b18565b73ffffffffffffffffffffffffffffffffffffffff166118be6115b8565b73ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90613c08565b60405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611977611b18565b73ffffffffffffffffffffffffffffffffffffffff166119956115b8565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613c08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613b68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613b88565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cde9190613ca8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5290613c48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290613b28565b60405180910390fd5b60008111611e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0590613c28565b60405180910390fd5b611e166115b8565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e845750611e546115b8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611ecf57601454811115611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590613be8565b60405180910390fd5b5b600060019050600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f765750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f8057600090505b611f8c848484846120db565b50505050565b6000838311158290611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd19190613b06565b60405180910390fd5b508284611fe79190613ddb565b90509392505050565b6000806000611ffd6123ec565b91509150612014818361201b90919063ffffffff16565b9250505090565b600081836120299190613d50565b905092915050565b6000818361203f9190613cfa565b905092915050565b60008060008060008060008060008060006120618c612737565b935093509350935060008060006120828f87878761207d611ff0565b6127b6565b925092509250828282898989899d509d509d509d509d509d509d5050505050505050919395979092949650565b600081836120bd9190613ddb565b905092915050565b600081836120d39190613d81565b905092915050565b806120e9576120e861286a565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561218c5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156121a15761219c8484846128b0565b6123d8565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122445750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561225957612254848484612b1e565b6123d7565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122fd5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123125761230d848484612d8c565b6123d6565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156123b45750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156123c9576123c4848484612f65565b6123d5565b6123d4848484612d8c565b5b5b5b5b806123e6576123e5613268565b5b50505050565b6000806000600b5490506000600a54905060005b6006805490508110156126fa5782600160006006848154811061244c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061256057508160026000600684815481106124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561257757600b54600a5494509450505050612733565b61262d60016000600684815481106125b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846120af90919063ffffffff16565b92506126e56002600060068481548110612670577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836120af90919063ffffffff16565b915080806126f290613ec9565b915050612400565b50612712600a54600b5461201b90919063ffffffff16565b82101561272a57600b54600a54935093505050612733565b81819350935050505b9091565b600080600080600061274886613285565b90506000612755876132b6565b90506000612762886132e7565b9050600061279d8261278f85612781888e6120af90919063ffffffff16565b6120af90919063ffffffff16565b6120af90919063ffffffff16565b9050808484849750975097509750505050509193509193565b6000806000806127cf858a6120c590919063ffffffff16565b905060006127e6868a6120c590919063ffffffff16565b905060006127fd878a6120c590919063ffffffff16565b90506000612814888a6120c590919063ffffffff16565b9050600061284f8261284185612833888a6120af90919063ffffffff16565b6120af90919063ffffffff16565b6120af90919063ffffffff16565b90508481859750975097505050505050955095509592505050565b6000601254141561287a576128ae565b600e54600f819055506010546011819055506012546013819055506000600e81905550600060108190555060006012819055505b565b60008060008060008060006128c488612047565b965096509650965096509650965061292488600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129b987600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a4e86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9a82613318565b612aa381613336565b612aad8584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b0a9190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612b3288612047565b9650965096509650965096509650612b9287600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c2784600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cbc86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d0882613318565b612d1181613336565b612d1b8584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612d789190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612da088612047565b9650965096509650965096509650612e0087600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e9586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ee182613318565b612eea81613336565b612ef48584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f519190613ca8565b60405180910390a350505050505050505050565b6000806000806000806000612f7988612047565b9650965096509650965096509650612fd988600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061306e87600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120af90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061310384600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061319886600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131e482613318565b6131ed81613336565b6131f78584613437565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516132549190613ca8565b60405180910390a350505050505050505050565b600f54600e81905550601154601081905550601354601281905550565b60006132af60646132a1600e54856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b60006132e060646132d2601054856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b60006133116064613303601254856120c590919063ffffffff16565b61201b90919063ffffffff16565b9050919050565b61332d81600d5461203190919063ffffffff16565b600d8190555050565b6000613340611ff0565b9050600061335782846120c590919063ffffffff16565b90506133cd8160016000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461203190919063ffffffff16565b60016000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b61344c82600b546120af90919063ffffffff16565b600b8190555061346781600c5461203190919063ffffffff16565b600c819055505050565b60008135905061348081613fb0565b92915050565b60008135905061349581613fc7565b92915050565b6000813590506134aa81613fde565b92915050565b6000602082840312156134c257600080fd5b60006134d084828501613471565b91505092915050565b600080604083850312156134ec57600080fd5b60006134fa85828601613471565b925050602061350b85828601613471565b9150509250929050565b60008060006060848603121561352a57600080fd5b600061353886828701613471565b935050602061354986828701613471565b925050604061355a8682870161349b565b9150509250925092565b6000806040838503121561357757600080fd5b600061358585828601613471565b92505060206135968582860161349b565b9150509250929050565b6000602082840312156135b257600080fd5b60006135c08482850161349b565b91505092915050565b600080604083850312156135dc57600080fd5b60006135ea8582860161349b565b92505060206135fb85828601613486565b9150509250929050565b61360e81613e0f565b82525050565b61361d81613e21565b82525050565b600061362e82613cde565b6136388185613ce9565b9350613648818560208601613e64565b61365181613f9f565b840191505092915050565b6000613669602383613ce9565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136cf602a83613ce9565b91507f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008301527f65666c656374696f6e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613735602683613ce9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379b602283613ce9565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613801601b83613ce9565b91507f4163636f756e7420697320616c7265616479206578636c7564656400000000006000830152602082019050919050565b6000613841601f83613ce9565b91507f416d6f756e74206d757374206265206c657373207468616e20737570706c79006000830152602082019050919050565b6000613881602883613ce9565b91507f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008301527f78416d6f756e742e0000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138e7602083613ce9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613927602983613ce9565b91507f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b600061398d602583613ce9565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f3602483613ce9565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a59602c83613ce9565b91507f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008301527f6869732066756e6374696f6e00000000000000000000000000000000000000006020830152604082019050919050565b613abb81613e4d565b82525050565b613aca81613e57565b82525050565b6000602082019050613ae56000830184613605565b92915050565b6000602082019050613b006000830184613614565b92915050565b60006020820190508181036000830152613b208184613623565b905092915050565b60006020820190508181036000830152613b418161365c565b9050919050565b60006020820190508181036000830152613b61816136c2565b9050919050565b60006020820190508181036000830152613b8181613728565b9050919050565b60006020820190508181036000830152613ba18161378e565b9050919050565b60006020820190508181036000830152613bc1816137f4565b9050919050565b60006020820190508181036000830152613be181613834565b9050919050565b60006020820190508181036000830152613c0181613874565b9050919050565b60006020820190508181036000830152613c21816138da565b9050919050565b60006020820190508181036000830152613c418161391a565b9050919050565b60006020820190508181036000830152613c6181613980565b9050919050565b60006020820190508181036000830152613c81816139e6565b9050919050565b60006020820190508181036000830152613ca181613a4c565b9050919050565b6000602082019050613cbd6000830184613ab2565b92915050565b6000602082019050613cd86000830184613ac1565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613d0582613e4d565b9150613d1083613e4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4557613d44613f12565b5b828201905092915050565b6000613d5b82613e4d565b9150613d6683613e4d565b925082613d7657613d75613f41565b5b828204905092915050565b6000613d8c82613e4d565b9150613d9783613e4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dd057613dcf613f12565b5b828202905092915050565b6000613de682613e4d565b9150613df183613e4d565b925082821015613e0457613e03613f12565b5b828203905092915050565b6000613e1a82613e2d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613e82578082015181840152602081019050613e67565b83811115613e91576000848401525b50505050565b60006002820490506001821680613eaf57607f821691505b60208210811415613ec357613ec2613f70565b5b50919050565b6000613ed482613e4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0757613f06613f12565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b613fb981613e0f565b8114613fc457600080fd5b50565b613fd081613e21565b8114613fdb57600080fd5b50565b613fe781613e4d565b8114613ff257600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203128e0274f8a545615ce976b8d9e83c1cacf2a91fa4d7f092f28e90102fa4acc64736f6c63430008000033

Deployed Bytecode Sourcemap

20669:16251:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27519:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22334:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23246:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24364:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23415:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25389:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22520:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25992:479;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23733:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21643:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24556:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27282:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24942:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21469:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25650:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31251:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24459:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22714:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19985:148;;;:::i;:::-;;21726:61;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24236:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19334:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22425;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23959:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22920:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21559:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27625:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23095:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27401:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20288:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27519:98;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27603:6:::1;27593:7;:16;;;;27519:98:::0;:::o;22334:83::-;22371:13;22404:5;22397:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22334:83;:::o;23246:161::-;23321:4;23338:39;23347:12;:10;:12::i;:::-;23361:7;23370:6;23338:8;:39::i;:::-;23395:4;23388:11;;23246:161;;;;:::o;24364:87::-;24406:7;24433:10;;24426:17;;24364:87;:::o;22611:95::-;22664:7;22691;;22684:14;;22611:95;:::o;23415:310::-;23513:4;23530:36;23540:6;23548:9;23559:6;23530:9;:36::i;:::-;23577:118;23586:6;23593:12;:10;:12::i;:::-;23606:88;23644:6;23606:88;;;;;;;;;;;;;;;;;:11;:19;23618:6;23606:19;;;;;;;;;;;;;;;:33;23626:12;:10;:12::i;:::-;23606:33;;;;;;;;;;;;;;;;:37;;:88;;;;;:::i;:::-;23577:8;:118::i;:::-;23713:4;23706:11;;23415:310;;;;;:::o;25389:253::-;25456:7;25495;;25484;:18;;25476:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25560:19;25582:10;:8;:10::i;:::-;25560:32;;25610:24;25622:11;25610:7;:11;;:24;;;;:::i;:::-;25603:31;;;25389:253;;;:::o;22520:83::-;22561:5;22586:9;;;;;;;;;;;22579:16;;22520:83;:::o;25992:479::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26074:11:::1;:20;26086:7;26074:20;;;;;;;;;;;;;;;;;;;;;;;;;26066:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26142:9;26137:327;26161:9;:16;;;;26157:1;:20;26137:327;;;26219:7;26203:23;;:9;26213:1;26203:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;26199:254;;;26262:9;26291:1;26272:9;:16;;;;:20;;;;:::i;:::-;26262:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26247:9;26257:1;26247:12;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;26331:1;26312:7;:16;26320:7;26312:16;;;;;;;;;;;;;;;:20;;;;26374:5;26351:11;:20;26363:7;26351:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;26398:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26432:5;;26199:254;26179:3;;;;;:::i;:::-;;;;26137:327;;;;25992:479:::0;:::o;23733:218::-;23821:4;23838:83;23847:12;:10;:12::i;:::-;23861:7;23870:50;23909:10;23870:11;:25;23882:12;:10;:12::i;:::-;23870:25;;;;;;;;;;;;;;;:34;23896:7;23870:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;23838:8;:83::i;:::-;23939:4;23932:11;;23733:218;;;;:::o;21643:26::-;;;;:::o;24556:378::-;24608:14;24625:12;:10;:12::i;:::-;24608:29;;24657:11;:19;24669:6;24657:19;;;;;;;;;;;;;;;;;;;;;;;;;24656:20;24648:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;24737:15;24762:19;24773:7;24762:10;:19::i;:::-;24736:45;;;;;;;;24810:28;24830:7;24810;:15;24818:6;24810:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;24792:7;:15;24800:6;24792:15;;;;;;;;;;;;;;;:46;;;;24859:20;24871:7;24859;;:11;;:20;;;;:::i;:::-;24849:7;:30;;;;24903:23;24918:7;24903:10;;:14;;:23;;;;:::i;:::-;24890:10;:36;;;;24556:378;;;:::o;27282:111::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27381:4:::1;27351:18;:27;27370:7;27351:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;27282:111:::0;:::o;24942:439::-;25033:7;25072;;25061;:18;;25053:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25131:17;25126:248;;25166:15;25191:19;25202:7;25191:10;:19::i;:::-;25165:45;;;;;;;;25232:7;25225:14;;;;;25126:248;25274:23;25306:19;25317:7;25306:10;:19::i;:::-;25272:53;;;;;;;;25347:15;25340:22;;;24942:439;;;;;:::o;21469:29::-;;;;:::o;25650:334::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25733:11:::1;:20;25745:7;25733:20;;;;;;;;;;;;;;;;;;;;;;;;;25732:21;25724:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;25819:1;25800:7;:16;25808:7;25800:16;;;;;;;;;;;;;;;;:20;25796:109;;;25856:37;25876:7;:16;25884:7;25876:16;;;;;;;;;;;;;;;;25856:19;:37::i;:::-;25837:7;:16;25845:7;25837:16;;;;;;;;;;;;;;;:56;;;;25796:109;25938:4;25915:11;:20;25927:7;25915:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;25953:9;25968:7;25953:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25650:334:::0;:::o;31251:124::-;31316:4;31340:18;:27;31359:7;31340:27;;;;;;;;;;;;;;;;;;;;;;;;;31333:34;;31251:124;;;:::o;24459:89::-;24502:7;24529:11;;24522:18;;24459:89;:::o;22714:198::-;22780:7;22804:11;:20;22816:7;22804:20;;;;;;;;;;;;;;;;;;;;;;;;;22800:49;;;22833:7;:16;22841:7;22833:16;;;;;;;;;;;;;;;;22826:23;;;;22800:49;22867:37;22887:7;:16;22895:7;22887:16;;;;;;;;;;;;;;;;22867:19;:37::i;:::-;22860:44;;22714:198;;;;:::o;19985:148::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20092:1:::1;20055:40;;20076:6;::::0;::::1;;;;;;;;20055:40;;;;;;;;;;;;20123:1;20106:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;19985:148::o:0;21726:61::-;;;;:::o;24236:120::-;24304:4;24328:11;:20;24340:7;24328:20;;;;;;;;;;;;;;;;;;;;;;;;;24321:27;;24236:120;;;:::o;19334:87::-;19380:7;19407:6;;;;;;;;;;;19400:13;;19334:87;:::o;22425:::-;22464:13;22497:7;22490:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22425:87;:::o;23959:269::-;24052:4;24069:129;24078:12;:10;:12::i;:::-;24092:7;24101:96;24140:15;24101:96;;;;;;;;;;;;;;;;;:11;:25;24113:12;:10;:12::i;:::-;24101:25;;;;;;;;;;;;;;;:34;24127:7;24101:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;24069:8;:129::i;:::-;24216:4;24209:11;;23959:269;;;;:::o;22920:167::-;22998:4;23015:42;23025:12;:10;:12::i;:::-;23039:9;23050:6;23015:9;:42::i;:::-;23075:4;23068:11;;22920:167;;;;:::o;21559:27::-;;;;:::o;27625:138::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27719:36:::1;27749:5;27719:25;27731:12;27719:7;;:11;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;27704:12;:51;;;;27625:138:::0;:::o;23095:143::-;23176:7;23203:11;:18;23215:5;23203:18;;;;;;;;;;;;;;;:27;23222:7;23203:27;;;;;;;;;;;;;;;;23196:34;;23095:143;;;;:::o;27401:110::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27498:5:::1;27468:18;:27;27487:7;27468:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;27401:110:::0;:::o;20288:244::-;19565:12;:10;:12::i;:::-;19554:23;;:7;:5;:7::i;:::-;:23;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20397:1:::1;20377:22;;:8;:22;;;;20369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20487:8;20458:38;;20479:6;::::0;::::1;;;;;;;;20458:38;;;;;;;;;;;;20516:8;20507:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20288:244:::0;:::o;10038:98::-;10091:7;10118:10;10111:17;;10038:98;:::o;31383:337::-;31493:1;31476:19;;:5;:19;;;;31468:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31574:1;31555:21;;:7;:21;;;;31547:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31658:6;31628:11;:18;31640:5;31628:18;;;;;;;;;;;;;;;:27;31647:7;31628:27;;;;;;;;;;;;;;;:36;;;;31696:7;31680:32;;31689:5;31680:32;;;31705:6;31680:32;;;;;;:::i;:::-;;;;;;;;31383:337;;;:::o;31728:847::-;31832:1;31816:18;;:4;:18;;;;31808:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31909:1;31895:16;;:2;:16;;;;31887:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31979:1;31970:6;:10;31962:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32049:7;:5;:7::i;:::-;32041:15;;:4;:15;;;;:32;;;;;32066:7;:5;:7::i;:::-;32060:13;;:2;:13;;;;32041:32;32037:126;;;32106:12;;32096:6;:22;;32088:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32037:126;32237:12;32252:4;32237:19;;32357:18;:24;32376:4;32357:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;32385:18;:22;32404:2;32385:22;;;;;;;;;;;;;;;;;;;;;;;;;32357:50;32353:98;;;32434:5;32424:15;;32353:98;32526:41;32541:4;32547:2;32551:6;32559:7;32526:14;:41::i;:::-;31728:847;;;;:::o;7524:194::-;7610:7;7657:1;7652;:6;;7660:12;7644:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7699:1;7695;:5;;;;:::i;:::-;7688:12;;7524:194;;;;;:::o;29657:164::-;29699:7;29720:15;29737;29756:19;:17;:19::i;:::-;29719:56;;;;29793:20;29805:7;29793;:11;;:20;;;;:::i;:::-;29786:27;;;;29657:164;:::o;6382:98::-;6440:7;6471:1;6467;:5;;;;:::i;:::-;6460:12;;6382:98;;;;:::o;5245:::-;5303:7;5334:1;5330;:5;;;;:::i;:::-;5323:12;;5245:98;;;;:::o;27926:608::-;28009:7;28031;28053;28075;28097;28119;28141;28168:23;28193:18;28213:16;28231:15;28250:20;28262:7;28250:11;:20::i;:::-;28167:103;;;;;;;;28282:15;28299:23;28324:18;28359:63;28371:7;28380:10;28392:8;28402:7;28411:10;:8;:10::i;:::-;28359:11;:63::i;:::-;28281:141;;;;;;28441:7;28450:15;28467:10;28479:15;28496:10;28508:8;28518:7;28433:93;;;;;;;;;;;;;;;;;;;;;27926:608;;;;;;;;;:::o;5626:98::-;5684:7;5715:1;5711;:5;;;;:::i;:::-;5704:12;;5626:98;;;;:::o;5983:::-;6041:7;6072:1;6068;:5;;;;:::i;:::-;6061:12;;5983:98;;;;:::o;32656:795::-;32769:7;32764:28;;32778:14;:12;:14::i;:::-;32764:28;32809:11;:19;32821:6;32809:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;32833:11;:22;32845:9;32833:22;;;;;;;;;;;;;;;;;;;;;;;;;32832:23;32809:46;32805:597;;;32872:48;32894:6;32902:9;32913:6;32872:21;:48::i;:::-;32805:597;;;32943:11;:19;32955:6;32943:19;;;;;;;;;;;;;;;;;;;;;;;;;32942:20;:46;;;;;32966:11;:22;32978:9;32966:22;;;;;;;;;;;;;;;;;;;;;;;;;32942:46;32938:464;;;33005:46;33025:6;33033:9;33044:6;33005:19;:46::i;:::-;32938:464;;;33074:11;:19;33086:6;33074:19;;;;;;;;;;;;;;;;;;;;;;;;;33073:20;:47;;;;;33098:11;:22;33110:9;33098:22;;;;;;;;;;;;;;;;;;;;;;;;;33097:23;33073:47;33069:333;;;33137:44;33155:6;33163:9;33174:6;33137:17;:44::i;:::-;33069:333;;;33203:11;:19;33215:6;33203:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;33226:11;:22;33238:9;33226:22;;;;;;;;;;;;;;;;;;;;;;;;;33203:45;33199:203;;;33265:48;33287:6;33295:9;33306:6;33265:21;:48::i;:::-;33199:203;;;33346:44;33364:6;33372:9;33383:6;33346:17;:44::i;:::-;33199:203;33069:333;32938:464;32805:597;33419:7;33414:29;;33428:15;:13;:15::i;:::-;33414:29;32656:795;;;;:::o;29829:556::-;29880:7;29889;29909:15;29927:7;;29909:25;;29945:15;29963:7;;29945:25;;29986:9;29981:289;30005:9;:16;;;;30001:1;:20;29981:289;;;30071:7;30047;:21;30055:9;30065:1;30055:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30047:21;;;;;;;;;;;;;;;;:31;:66;;;;30106:7;30082;:21;30090:9;30100:1;30090:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30082:21;;;;;;;;;;;;;;;;:31;30047:66;30043:97;;;30123:7;;30132;;30115:25;;;;;;;;;30043:97;30165:34;30177:7;:21;30185:9;30195:1;30185:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30177:21;;;;;;;;;;;;;;;;30165:7;:11;;:34;;;;:::i;:::-;30155:44;;30224:34;30236:7;:21;30244:9;30254:1;30244:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30236:21;;;;;;;;;;;;;;;;30224:7;:11;;:34;;;;:::i;:::-;30214:44;;30023:3;;;;;:::i;:::-;;;;29981:289;;;;30294:20;30306:7;;30294;;:11;;:20;;;;:::i;:::-;30284:7;:30;30280:61;;;30324:7;;30333;;30316:25;;;;;;;;30280:61;30360:7;30369;30352:25;;;;;;29829:556;;;:::o;28542:501::-;28625:7;28647;28669;28691;28726:18;28747:27;28766:7;28747:18;:27::i;:::-;28726:48;;28785:16;28804:25;28821:7;28804:16;:25::i;:::-;28785:44;;28840:15;28858:24;28874:7;28858:15;:24::i;:::-;28840:42;;28893:23;28919:50;28961:7;28919:37;28947:8;28919:23;28931:10;28919:7;:11;;:23;;;;:::i;:::-;:27;;:37;;;;:::i;:::-;:41;;:50;;;;:::i;:::-;28893:76;;28988:15;29005:10;29017:8;29027:7;28980:55;;;;;;;;;;;;28542:501;;;;;:::o;29051:598::-;29210:7;29232;29254;29289:15;29307:24;29319:11;29307:7;:11;;:24;;;;:::i;:::-;29289:42;;29342:18;29363:27;29378:11;29363:10;:14;;:27;;;;:::i;:::-;29342:48;;29401:16;29420:25;29433:11;29420:8;:12;;:25;;;;:::i;:::-;29401:44;;29456:15;29474:24;29486:11;29474:7;:11;;:24;;;;:::i;:::-;29456:42;;29509:23;29535:50;29577:7;29535:37;29563:8;29535:23;29547:10;29535:7;:11;;:23;;;;:::i;:::-;:27;;:37;;;;:::i;:::-;:41;;:50;;;;:::i;:::-;29509:76;;29604:7;29613:15;29630:10;29596:45;;;;;;;;;;;29051:598;;;;;;;;;:::o;30815:263::-;30873:1;30862:7;;:12;30858:25;;;30876:7;;30858:25;30914:10;;30893:18;:31;;;;30954:8;;30935:16;:27;;;;30991:7;;30973:15;:25;;;;31024:1;31011:10;:14;;;;31047:1;31036:8;:12;;;;31069:1;31059:7;:11;;;;30815:263;:::o;34873:724::-;34990:15;35021:23;35060:18;35093:23;35132:18;35166:16;35198:15;35217:19;35228:7;35217:10;:19::i;:::-;34975:261;;;;;;;;;;;;;;35265:28;35285:7;35265;:15;35273:6;35265:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35247:7;:15;35255:6;35247:15;;;;;;;;;;;;;;;:46;;;;35322:28;35342:7;35322;:15;35330:6;35322:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35304:7;:15;35312:6;35304:15;;;;;;;;;;;;;;;:46;;;;35382:39;35405:15;35382:7;:18;35390:9;35382:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35361:7;:18;35369:9;35361:18;;;;;;;;;;;;;;;:60;;;;35432:19;35442:8;35432:9;:19::i;:::-;35462:21;35475:7;35462:12;:21::i;:::-;35494:35;35506:10;35518;35494:11;:35::i;:::-;35562:9;35545:44;;35554:6;35545:44;;;35573:15;35545:44;;;;;;:::i;:::-;;;;;;;;34873:724;;;;;;;;;;:::o;34130:735::-;34245:15;34276:23;34315:18;34348:23;34387:18;34420:16;34452:15;34471:19;34482:7;34471:10;:19::i;:::-;34230:260;;;;;;;;;;;;;;34519:28;34539:7;34519;:15;34527:6;34519:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;34501:7;:15;34509:6;34501:15;;;;;;;;;;;;;;;:46;;;;34579:39;34602:15;34579:7;:18;34587:9;34579:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34558:7;:18;34566:9;34558:18;;;;;;;;;;;;;;;:60;;;;34650:39;34673:15;34650:7;:18;34658:9;34650:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34629:7;:18;34637:9;34629:18;;;;;;;;;;;;;;;:60;;;;34700:19;34710:8;34700:9;:19::i;:::-;34730:21;34743:7;34730:12;:21::i;:::-;34762:35;34774:10;34786;34762:11;:35::i;:::-;34830:9;34813:44;;34822:6;34813:44;;;34841:15;34813:44;;;;;;:::i;:::-;;;;;;;;34130:735;;;;;;;;;;:::o;33459:663::-;33572:15;33603:23;33642:18;33675:23;33714:18;33748:16;33780:15;33799:19;33810:7;33799:10;:19::i;:::-;33557:261;;;;;;;;;;;;;;33847:28;33867:7;33847;:15;33855:6;33847:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;33829:7;:15;33837:6;33829:15;;;;;;;;;;;;;;;:46;;;;33907:39;33930:15;33907:7;:18;33915:9;33907:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;33886:7;:18;33894:9;33886:18;;;;;;;;;;;;;;;:60;;;;33957:19;33967:8;33957:9;:19::i;:::-;33987:21;34000:7;33987:12;:21::i;:::-;34019:35;34031:10;34043;34019:11;:35::i;:::-;34087:9;34070:44;;34079:6;34070:44;;;34098:15;34070:44;;;;;;:::i;:::-;;;;;;;;33459:663;;;;;;;;;;:::o;26479:795::-;26596:15;26627:23;26666:18;26699:23;26738:18;26772:16;26804:15;26823:19;26834:7;26823:10;:19::i;:::-;26581:261;;;;;;;;;;;;;;26871:28;26891:7;26871;:15;26879:6;26871:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;26853:7;:15;26861:6;26853:15;;;;;;;;;;;;;;;:46;;;;26928:28;26948:7;26928;:15;26936:6;26928:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;26910:7;:15;26918:6;26910:15;;;;;;;;;;;;;;;:46;;;;26988:39;27011:15;26988:7;:18;26996:9;26988:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;26967:7;:18;26975:9;26967:18;;;;;;;;;;;;;;;:60;;;;27059:39;27082:15;27059:7;:18;27067:9;27059:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;27038:7;:18;27046:9;27038:18;;;;;;;;;;;;;;;:60;;;;27109:19;27119:8;27109:9;:19::i;:::-;27139:21;27152:7;27139:12;:21::i;:::-;27171:35;27183:10;27195;27171:11;:35::i;:::-;27239:9;27222:44;;27231:6;27222:44;;;27250:15;27222:44;;;;;;:::i;:::-;;;;;;;;26479:795;;;;;;;;;;:::o;31086:157::-;31143:18;;31130:10;:31;;;;31183:16;;31172:8;:27;;;;31220:15;;31210:7;:25;;;;31086:157::o;30393:136::-;30460:7;30487:34;30515:5;30487:23;30499:10;;30487:7;:11;;:23;;;;:::i;:::-;:27;;:34;;;;:::i;:::-;30480:41;;30393:136;;;:::o;30537:132::-;30602:7;30629:32;30655:5;30629:21;30641:8;;30629:7;:11;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;30622:39;;30537:132;;;:::o;30677:130::-;30741:7;30768:31;30793:5;30768:20;30780:7;;30768;:11;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;30761:38;;30677:130;;;:::o;35605:103::-;35675:25;35691:8;35675:11;;:15;;:25;;;;:::i;:::-;35661:11;:39;;;;35605:103;:::o;35716:228::-;35775:19;35797:10;:8;:10::i;:::-;35775:32;;35818:16;35837:25;35850:11;35837:8;:12;;:25;;;;:::i;:::-;35818:44;;35899:37;35927:8;35899:7;:23;35907:14;;;;;;;;;;;35899:23;;;;;;;;;;;;;;;;:27;;:37;;;;:::i;:::-;35873:7;:23;35881:14;;;;;;;;;;;35873:23;;;;;;;;;;;;;;;:63;;;;35716:228;;;:::o;27771:147::-;27849:17;27861:4;27849:7;;:11;;:17;;;;:::i;:::-;27839:7;:27;;;;27890:20;27905:4;27890:10;;:14;;:20;;;;:::i;:::-;27877:10;:33;;;;27771:147;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:139::-;;375:6;362:20;353:29;;391:33;418:5;391:33;:::i;:::-;343:87;;;;:::o;436:262::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;560:1;557;550:12;512:2;603:1;628:53;673:7;664:6;653:9;649:22;628:53;:::i;:::-;618:63;;574:117;502:196;;;;:::o;704:407::-;;;829:2;817:9;808:7;804:23;800:32;797:2;;;845:1;842;835:12;797:2;888:1;913:53;958:7;949:6;938:9;934:22;913:53;:::i;:::-;903:63;;859:117;1015:2;1041:53;1086:7;1077:6;1066:9;1062:22;1041:53;:::i;:::-;1031:63;;986:118;787:324;;;;;:::o;1117:552::-;;;;1259:2;1247:9;1238:7;1234:23;1230:32;1227:2;;;1275:1;1272;1265:12;1227:2;1318:1;1343:53;1388:7;1379:6;1368:9;1364:22;1343:53;:::i;:::-;1333:63;;1289:117;1445:2;1471:53;1516:7;1507:6;1496:9;1492:22;1471:53;:::i;:::-;1461:63;;1416:118;1573:2;1599:53;1644:7;1635:6;1624:9;1620:22;1599:53;:::i;:::-;1589:63;;1544:118;1217:452;;;;;:::o;1675:407::-;;;1800:2;1788:9;1779:7;1775:23;1771:32;1768:2;;;1816:1;1813;1806:12;1768:2;1859:1;1884:53;1929:7;1920:6;1909:9;1905:22;1884:53;:::i;:::-;1874:63;;1830:117;1986:2;2012:53;2057:7;2048:6;2037:9;2033:22;2012:53;:::i;:::-;2002:63;;1957:118;1758:324;;;;;:::o;2088:262::-;;2196:2;2184:9;2175:7;2171:23;2167:32;2164:2;;;2212:1;2209;2202:12;2164:2;2255:1;2280:53;2325:7;2316:6;2305:9;2301:22;2280:53;:::i;:::-;2270:63;;2226:117;2154:196;;;;:::o;2356:401::-;;;2478:2;2466:9;2457:7;2453:23;2449:32;2446:2;;;2494:1;2491;2484:12;2446:2;2537:1;2562:53;2607:7;2598:6;2587:9;2583:22;2562:53;:::i;:::-;2552:63;;2508:117;2664:2;2690:50;2732:7;2723:6;2712:9;2708:22;2690:50;:::i;:::-;2680:60;;2635:115;2436:321;;;;;:::o;2763:118::-;2850:24;2868:5;2850:24;:::i;:::-;2845:3;2838:37;2828:53;;:::o;2887:109::-;2968:21;2983:5;2968:21;:::i;:::-;2963:3;2956:34;2946:50;;:::o;3002:364::-;;3118:39;3151:5;3118:39;:::i;:::-;3173:71;3237:6;3232:3;3173:71;:::i;:::-;3166:78;;3253:52;3298:6;3293:3;3286:4;3279:5;3275:16;3253:52;:::i;:::-;3330:29;3352:6;3330:29;:::i;:::-;3325:3;3321:39;3314:46;;3094:272;;;;;:::o;3372:367::-;;3535:67;3599:2;3594:3;3535:67;:::i;:::-;3528:74;;3632:34;3628:1;3623:3;3619:11;3612:55;3698:5;3693:2;3688:3;3684:12;3677:27;3730:2;3725:3;3721:12;3714:19;;3518:221;;;:::o;3745:374::-;;3908:67;3972:2;3967:3;3908:67;:::i;:::-;3901:74;;4005:34;4001:1;3996:3;3992:11;3985:55;4071:12;4066:2;4061:3;4057:12;4050:34;4110:2;4105:3;4101:12;4094:19;;3891:228;;;:::o;4125:370::-;;4288:67;4352:2;4347:3;4288:67;:::i;:::-;4281:74;;4385:34;4381:1;4376:3;4372:11;4365:55;4451:8;4446:2;4441:3;4437:12;4430:30;4486:2;4481:3;4477:12;4470:19;;4271:224;;;:::o;4501:366::-;;4664:67;4728:2;4723:3;4664:67;:::i;:::-;4657:74;;4761:34;4757:1;4752:3;4748:11;4741:55;4827:4;4822:2;4817:3;4813:12;4806:26;4858:2;4853:3;4849:12;4842:19;;4647:220;;;:::o;4873:325::-;;5036:67;5100:2;5095:3;5036:67;:::i;:::-;5029:74;;5133:29;5129:1;5124:3;5120:11;5113:50;5189:2;5184:3;5180:12;5173:19;;5019:179;;;:::o;5204:329::-;;5367:67;5431:2;5426:3;5367:67;:::i;:::-;5360:74;;5464:33;5460:1;5455:3;5451:11;5444:54;5524:2;5519:3;5515:12;5508:19;;5350:183;;;:::o;5539:372::-;;5702:67;5766:2;5761:3;5702:67;:::i;:::-;5695:74;;5799:34;5795:1;5790:3;5786:11;5779:55;5865:10;5860:2;5855:3;5851:12;5844:32;5902:2;5897:3;5893:12;5886:19;;5685:226;;;:::o;5917:330::-;;6080:67;6144:2;6139:3;6080:67;:::i;:::-;6073:74;;6177:34;6173:1;6168:3;6164:11;6157:55;6238:2;6233:3;6229:12;6222:19;;6063:184;;;:::o;6253:373::-;;6416:67;6480:2;6475:3;6416:67;:::i;:::-;6409:74;;6513:34;6509:1;6504:3;6500:11;6493:55;6579:11;6574:2;6569:3;6565:12;6558:33;6617:2;6612:3;6608:12;6601:19;;6399:227;;;:::o;6632:369::-;;6795:67;6859:2;6854:3;6795:67;:::i;:::-;6788:74;;6892:34;6888:1;6883:3;6879:11;6872:55;6958:7;6953:2;6948:3;6944:12;6937:29;6992:2;6987:3;6983:12;6976:19;;6778:223;;;:::o;7007:368::-;;7170:67;7234:2;7229:3;7170:67;:::i;:::-;7163:74;;7267:34;7263:1;7258:3;7254:11;7247:55;7333:6;7328:2;7323:3;7319:12;7312:28;7366:2;7361:3;7357:12;7350:19;;7153:222;;;:::o;7381:376::-;;7544:67;7608:2;7603:3;7544:67;:::i;:::-;7537:74;;7641:34;7637:1;7632:3;7628:11;7621:55;7707:14;7702:2;7697:3;7693:12;7686:36;7748:2;7743:3;7739:12;7732:19;;7527:230;;;:::o;7763:118::-;7850:24;7868:5;7850:24;:::i;:::-;7845:3;7838:37;7828:53;;:::o;7887:112::-;7970:22;7986:5;7970:22;:::i;:::-;7965:3;7958:35;7948:51;;:::o;8005:222::-;;8136:2;8125:9;8121:18;8113:26;;8149:71;8217:1;8206:9;8202:17;8193:6;8149:71;:::i;:::-;8103:124;;;;:::o;8233:210::-;;8358:2;8347:9;8343:18;8335:26;;8371:65;8433:1;8422:9;8418:17;8409:6;8371:65;:::i;:::-;8325:118;;;;:::o;8449:313::-;;8600:2;8589:9;8585:18;8577:26;;8649:9;8643:4;8639:20;8635:1;8624:9;8620:17;8613:47;8677:78;8750:4;8741:6;8677:78;:::i;:::-;8669:86;;8567:195;;;;:::o;8768:419::-;;8972:2;8961:9;8957:18;8949:26;;9021:9;9015:4;9011:20;9007:1;8996:9;8992:17;8985:47;9049:131;9175:4;9049:131;:::i;:::-;9041:139;;8939:248;;;:::o;9193:419::-;;9397:2;9386:9;9382:18;9374:26;;9446:9;9440:4;9436:20;9432:1;9421:9;9417:17;9410:47;9474:131;9600:4;9474:131;:::i;:::-;9466:139;;9364:248;;;:::o;9618:419::-;;9822:2;9811:9;9807:18;9799:26;;9871:9;9865:4;9861:20;9857:1;9846:9;9842:17;9835:47;9899:131;10025:4;9899:131;:::i;:::-;9891:139;;9789:248;;;:::o;10043:419::-;;10247:2;10236:9;10232:18;10224:26;;10296:9;10290:4;10286:20;10282:1;10271:9;10267:17;10260:47;10324:131;10450:4;10324:131;:::i;:::-;10316:139;;10214:248;;;:::o;10468:419::-;;10672:2;10661:9;10657:18;10649:26;;10721:9;10715:4;10711:20;10707:1;10696:9;10692:17;10685:47;10749:131;10875:4;10749:131;:::i;:::-;10741:139;;10639:248;;;:::o;10893:419::-;;11097:2;11086:9;11082:18;11074:26;;11146:9;11140:4;11136:20;11132:1;11121:9;11117:17;11110:47;11174:131;11300:4;11174:131;:::i;:::-;11166:139;;11064:248;;;:::o;11318:419::-;;11522:2;11511:9;11507:18;11499:26;;11571:9;11565:4;11561:20;11557:1;11546:9;11542:17;11535:47;11599:131;11725:4;11599:131;:::i;:::-;11591:139;;11489:248;;;:::o;11743:419::-;;11947:2;11936:9;11932:18;11924:26;;11996:9;11990:4;11986:20;11982:1;11971:9;11967:17;11960:47;12024:131;12150:4;12024:131;:::i;:::-;12016:139;;11914:248;;;:::o;12168:419::-;;12372:2;12361:9;12357:18;12349:26;;12421:9;12415:4;12411:20;12407:1;12396:9;12392:17;12385:47;12449:131;12575:4;12449:131;:::i;:::-;12441:139;;12339:248;;;:::o;12593:419::-;;12797:2;12786:9;12782:18;12774:26;;12846:9;12840:4;12836:20;12832:1;12821:9;12817:17;12810:47;12874:131;13000:4;12874:131;:::i;:::-;12866:139;;12764:248;;;:::o;13018:419::-;;13222:2;13211:9;13207:18;13199:26;;13271:9;13265:4;13261:20;13257:1;13246:9;13242:17;13235:47;13299:131;13425:4;13299:131;:::i;:::-;13291:139;;13189:248;;;:::o;13443:419::-;;13647:2;13636:9;13632:18;13624:26;;13696:9;13690:4;13686:20;13682:1;13671:9;13667:17;13660:47;13724:131;13850:4;13724:131;:::i;:::-;13716:139;;13614:248;;;:::o;13868:222::-;;13999:2;13988:9;13984:18;13976:26;;14012:71;14080:1;14069:9;14065:17;14056:6;14012:71;:::i;:::-;13966:124;;;;:::o;14096:214::-;;14223:2;14212:9;14208:18;14200:26;;14236:67;14300:1;14289:9;14285:17;14276:6;14236:67;:::i;:::-;14190:120;;;;:::o;14316:99::-;;14402:5;14396:12;14386:22;;14375:40;;;:::o;14421:169::-;;14539:6;14534:3;14527:19;14579:4;14574:3;14570:14;14555:29;;14517:73;;;;:::o;14596:305::-;;14655:20;14673:1;14655:20;:::i;:::-;14650:25;;14689:20;14707:1;14689:20;:::i;:::-;14684:25;;14843:1;14775:66;14771:74;14768:1;14765:81;14762:2;;;14849:18;;:::i;:::-;14762:2;14893:1;14890;14886:9;14879:16;;14640:261;;;;:::o;14907:185::-;;14964:20;14982:1;14964:20;:::i;:::-;14959:25;;14998:20;15016:1;14998:20;:::i;:::-;14993:25;;15037:1;15027:2;;15042:18;;:::i;:::-;15027:2;15084:1;15081;15077:9;15072:14;;14949:143;;;;:::o;15098:348::-;;15161:20;15179:1;15161:20;:::i;:::-;15156:25;;15195:20;15213:1;15195:20;:::i;:::-;15190:25;;15383:1;15315:66;15311:74;15308:1;15305:81;15300:1;15293:9;15286:17;15282:105;15279:2;;;15390:18;;:::i;:::-;15279:2;15438:1;15435;15431:9;15420:20;;15146:300;;;;:::o;15452:191::-;;15512:20;15530:1;15512:20;:::i;:::-;15507:25;;15546:20;15564:1;15546:20;:::i;:::-;15541:25;;15585:1;15582;15579:8;15576:2;;;15590:18;;:::i;:::-;15576:2;15635:1;15632;15628:9;15620:17;;15497:146;;;;:::o;15649:96::-;;15715:24;15733:5;15715:24;:::i;:::-;15704:35;;15694:51;;;:::o;15751:90::-;;15828:5;15821:13;15814:21;15803:32;;15793:48;;;:::o;15847:126::-;;15924:42;15917:5;15913:54;15902:65;;15892:81;;;:::o;15979:77::-;;16045:5;16034:16;;16024:32;;;:::o;16062:86::-;;16137:4;16130:5;16126:16;16115:27;;16105:43;;;:::o;16154:307::-;16222:1;16232:113;16246:6;16243:1;16240:13;16232:113;;;16331:1;16326:3;16322:11;16316:18;16312:1;16307:3;16303:11;16296:39;16268:2;16265:1;16261:10;16256:15;;16232:113;;;16363:6;16360:1;16357:13;16354:2;;;16443:1;16434:6;16429:3;16425:16;16418:27;16354:2;16203:258;;;;:::o;16467:320::-;;16548:1;16542:4;16538:12;16528:22;;16595:1;16589:4;16585:12;16616:18;16606:2;;16672:4;16664:6;16660:17;16650:27;;16606:2;16734;16726:6;16723:14;16703:18;16700:38;16697:2;;;16753:18;;:::i;:::-;16697:2;16518:269;;;;:::o;16793:233::-;;16855:24;16873:5;16855:24;:::i;:::-;16846:33;;16901:66;16894:5;16891:77;16888:2;;;16971:18;;:::i;:::-;16888:2;17018:1;17011:5;17007:13;17000:20;;16836:190;;;:::o;17032:180::-;17080:77;17077:1;17070:88;17177:4;17174:1;17167:15;17201:4;17198:1;17191:15;17218:180;17266:77;17263:1;17256:88;17363:4;17360:1;17353:15;17387:4;17384:1;17377:15;17404:180;17452:77;17449:1;17442:88;17549:4;17546:1;17539:15;17573:4;17570:1;17563:15;17590:102;;17682:2;17678:7;17673:2;17666:5;17662:14;17658:28;17648:38;;17638:54;;;:::o;17698:122::-;17771:24;17789:5;17771:24;:::i;:::-;17764:5;17761:35;17751:2;;17810:1;17807;17800:12;17751:2;17741:79;:::o;17826:116::-;17896:21;17911:5;17896:21;:::i;:::-;17889:5;17886:32;17876:2;;17932:1;17929;17922:12;17876:2;17866:76;:::o;17948:122::-;18021:24;18039:5;18021:24;:::i;:::-;18014:5;18011:35;18001:2;;18060:1;18057;18050:12;18001:2;17991:79;:::o

Swarm Source

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