ETH Price: $2,383.39 (-1.08%)

Token

Zero Tax (ZTX)
 

Overview

Max Total Supply

100,000,000 ZTX

Holders

50

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.847738674728125 ZTX

Value
$0.00
0x139f8c976b95ce1d46245d14937e90b0abad9fa8
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:
ZeroTax

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 2022-11-11
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

/**
 ________  _______   ________  ________          _________  ________     ___    ___      ___  ________           ________  ________  ________  ________     
|\_____  \|\  ___ \ |\   __  \|\   __  \        |\___   ___\\   __  \   |\  \  /  /|    |\  \|\   ____\         |\   ____\|\   __  \|\   __  \|\   ___ \    
 \|___/  /\ \   __/|\ \  \|\  \ \  \|\  \       \|___ \  \_\ \  \|\  \  \ \  \/  / /    \ \  \ \  \___|_        \ \  \___|\ \  \|\  \ \  \|\  \ \  \_|\ \   
     /  / /\ \  \_|/_\ \   _  _\ \  \\\  \           \ \  \ \ \   __  \  \ \    / /      \ \  \ \_____  \        \ \  \  __\ \  \\\  \ \  \\\  \ \  \ \\ \  
    /  /_/__\ \  \_|\ \ \  \\  \\ \  \\\  \           \ \  \ \ \  \ \  \  /     \/        \ \  \|____|\  \        \ \  \|\  \ \  \\\  \ \  \\\  \ \  \_\\ \ 
   |\________\ \_______\ \__\\ _\\ \_______\           \ \__\ \ \__\ \__\/  /\   \         \ \__\____\_\  \        \ \_______\ \_______\ \_______\ \_______\
    \|_______|\|_______|\|__|\|__|\|_______|            \|__|  \|__|\|__/__/ /\ __\         \|__|\_________\        \|_______|\|_______|\|_______|\|_______|
                                                                        |__|/ \|__|             \|_________|                                                
*/

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    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;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    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);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    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);
        }
    }
}
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    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;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            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;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    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;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    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);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    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);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 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;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    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);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 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;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    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);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    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;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    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);
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract ZeroTax is Context, IERC20, Ownable
{


    // Info? are you sure?
    string private constant Name = "Zero Tax";
    string private constant Symbol = "ZTX";
    uint8 private constant Decimals = 18;
    uint256 private TotalSupply = 100_000_000 * 10**Decimals;
    uint256 private constant MAX = ~uint256(0);
    uint256 private ReflactionaryTotal = (MAX - (MAX % TotalSupply));

    // Routing to nowhere
    IUniswapV2Router02 public UniswapV2Router;
    address public PancakeSwapAddress;

    // Snipers are not welcomed
    uint256 public liqAddedBlockNumber;
    uint256 public blocksToWait = 0;

    // Important addresses
    address payable private DevAddress = payable(0x21D5a3F29f6D4deA6702Fc9dC0235b1320B72BB7);
    address payable private MarketingAddress = payable(0x21D5a3F29f6D4deA6702Fc9dC0235b1320B72BB7);
    address payable private BurnAddress = payable(0x000000000000000000000000000000000000dEaD);

    uint256 private HardCap = TotalSupply / 33;
    uint256 private HardCapBuy = HardCap;
    uint256 private HardCapSell = HardCap;

    mapping (address => uint256) private BalancesRefraccionarios;
    mapping (address => uint256) private BalancesReales;
    mapping (address => mapping (address => uint256)) private Allowances;
    mapping (address => bool) private Bots;


    mapping (address => bool) private WalletsExcludedFromFee;
    mapping (address => bool) private WalletsExcludedFromHardCap;
    mapping (address => bool) public AutomatedMarketMakerPairs;

    // Some cool statistics
    uint256 public TotalFee;
    uint256 public TotalSwapped;
    uint256 private TotalTokenBurn;

    // Swap for... nothing...
    bool private InSwap = false;
    bool private SwapEnabled = false;


    // Cool trick to control swap
    modifier swaping {
        InSwap = true;
        _;
        InSwap = false;
    }

    // Distribution based on taxes collected.
    uint256 private MarketingDistributionPct = 50;
    uint256 private DevDistributionPct = 25;
    uint256 private LPDistributionPct = 25;

    uint256 private LiquidityThreshold = 1 * 10 ** Decimals;

    // Tax rates
    struct TaxRates
    {
        uint256 BurnTax;
        uint256 LiquidityTax;
        uint256 MarketingTax;
        uint256 DevelopmentTax;
        uint256 RewardTax;
        string TaxPresetName;
    }

    // Fees, which are amounts calculated based on tax
    struct TransactionFees
    {
        uint256 TransactionFee;
        uint256 BurnFee;
        uint256 DevFee;
        uint256 MarketingFee;
        uint256 LiquidityFee;
        uint256 TransferrableFee;
        uint256 TotalFee;
    }

    TaxRates public BuyingTaxes =
    TaxRates({
    RewardTax: 0,
    BurnTax: 0,
    DevelopmentTax: 33,
    MarketingTax: 33,
    LiquidityTax: 33,
    TaxPresetName: "Buying"
    });

    TaxRates public SellTaxes =
    TaxRates({
    RewardTax: 0,
    BurnTax: 0,
    DevelopmentTax: 33,
    MarketingTax: 33,
    LiquidityTax: 33,
    TaxPresetName: "Selling"
    });

    TaxRates public AppliedRatesPercentage = BuyingTaxes;


    TransactionFees private AccumulatedFeeForDistribution = TransactionFees({
    DevFee: 0,
    MarketingFee: 0,
    LiquidityFee: 0,
    BurnFee:0,
    TransferrableFee: 0,
    TotalFee: 0,
    TransactionFee: 0
    });


    // Events
    event setDevAddress(address indexed previous, address indexed adr);
    event setMktAddress(address indexed previous, address indexed adr);
    event LiquidityAdded(uint256 tokenAmount, uint256 ETHAmount);
    event TreasuryAndDevFeesAdded(uint256 devFee, uint256 treasuryFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event BlacklistedUser(address botAddress, bool indexed value);
    event MaxWalletAmountUpdated(uint256 amount);
    event ExcludeFromMaxWallet(address account, bool indexed isExcluded);
    event SwapAndLiquifyEnabledUpdated(bool _enabled);


    constructor(address swap)
    {
        // Discovering Uniswap, where is the unicorn??
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(swap);
        UniswapV2Router = _uniswapV2Router;

        PancakeSwapAddress = IUniswapV2Factory(UniswapV2Router.factory()).createPair(address(this), UniswapV2Router.WETH());

        AutomatedMarketMakerPairs[PancakeSwapAddress] = true;

        // Some nifty configs

        WalletsExcludedFromFee[owner()] = true;
        WalletsExcludedFromFee[address(this)] = true;
        WalletsExcludedFromFee[DevAddress] = true;
        WalletsExcludedFromFee[MarketingAddress] = true;
        WalletsExcludedFromFee[swap] = true;


        WalletsExcludedFromHardCap[owner()] = true;
        WalletsExcludedFromHardCap[address(this)] = true;
        WalletsExcludedFromHardCap[DevAddress] = true;
        WalletsExcludedFromHardCap[MarketingAddress] = true;
        WalletsExcludedFromHardCap[PancakeSwapAddress] = true;
        WalletsExcludedFromHardCap[swap] = true;

        BalancesRefraccionarios[_msgSender()] = ReflactionaryTotal;

        // Approving swap for LP
        _approve(address(this), address(UniswapV2Router), ~uint256(0));

        // Notifying the initial mint
        emit Transfer(address(0x0000000000000000000000000000000000000000), _msgSender(), TotalSupply);
    }

    function ChangeTaxes(uint256 rewardTax, uint256 mktTax, uint256 devTax, uint256 lpTax, bool buying) public onlyOwner
    {
        if(buying)
        {
            BuyingTaxes.RewardTax = rewardTax;
            BuyingTaxes.MarketingTax = mktTax;
            BuyingTaxes.DevelopmentTax = devTax;
            BuyingTaxes.LiquidityTax = lpTax;
        }
        else
        {
            SellTaxes.RewardTax = rewardTax;
            SellTaxes.MarketingTax = mktTax;
            SellTaxes.DevelopmentTax = devTax;
            SellTaxes.LiquidityTax = lpTax;
        }
    }


    function AdjustMaxHardCap(uint256 newHardCap) public onlyOwner
    {
        HardCap = newHardCap;
    }

    function AdjustMaxTxSell(uint256 maxTxSell) public onlyOwner
    {
        HardCapSell = maxTxSell;
    }

    function AdjustMaxTxBuy(uint256 mxTxBuy) public onlyOwner
    {
        HardCapBuy = mxTxBuy;
    }

    function swapTokensForETH(uint256 tokenAmount) private
    {
        // generate the pair path of token
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UniswapV2Router.WETH();

        // make the swap
        UniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function SwapPct(uint256 pct) public
    {
        uint256 balance = (balanceOf(address(this)) * pct) / 100;

        if(balance > 0)
        {
            uint256 tokensForLP = (balance * LPDistributionPct)/100;
            uint256 tokensForLiquidity = tokensForLP / 2;
            uint256 tokensToSwap = balance - tokensForLiquidity;

            swapTokensForETH(tokensToSwap);
            uint256 contractBalance = address(this).balance;

            uint256 devShare = (contractBalance * DevDistributionPct)/100;
            uint256 mktShare = (contractBalance * MarketingDistributionPct)/100;

            DevAddress.transfer(devShare);
            MarketingAddress.transfer(mktShare);

            uint256 eth = address(this).balance;

            UniswapV2Router.addLiquidityETH{value: address(this).balance}(
                address(this),
                tokensForLiquidity,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                DevAddress,
                block.timestamp
            );


            AccumulatedFeeForDistribution.LiquidityFee = 0;
            AccumulatedFeeForDistribution.DevFee = 0;
            AccumulatedFeeForDistribution.MarketingFee = 0;

            TotalSwapped += tokensForLiquidity;

            emit LiquidityAdded(tokensForLiquidity, eth);
        }
    }

    // Funciones para cambiar las wallets de los VIP
    function ChangeExcludeFromFeeToForWallet(address add, bool isExcluded) public onlyOwner
    {
        WalletsExcludedFromFee[add] = isExcluded;
    }

    function IsWalletExcludedFromFee(address targetAddress) public view returns(bool)
    {
        return WalletsExcludedFromFee[targetAddress];
    }

    function ChangeDevAddress(address payable newDevAddress) public onlyOwner
    {
        address oldAddress = DevAddress;
        emit setDevAddress(oldAddress, newDevAddress);
        ChangeExcludeFromFeeToForWallet(DevAddress, false); // Excluyendo la wallet antigua, que se joda ese cabron
        DevAddress = newDevAddress;
        ChangeExcludeFromFeeToForWallet(DevAddress, true);  // Incluyendo a la nueva
    }

    function ChangeMarketingAddress(address payable marketingAddress) public onlyOwner
    {
        address oldAddress = MarketingAddress;
        emit setMktAddress(oldAddress, marketingAddress);
        ChangeExcludeFromFeeToForWallet(MarketingAddress, false); // Excluyendo la wallet antigua, que se joda ese cabron
        MarketingAddress = marketingAddress;
        ChangeExcludeFromFeeToForWallet(MarketingAddress, true);  // Incluyendo a la nueva
    }


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

    function decimals() public pure returns (uint8)
    {
        return Decimals;
    }

    function symbol() public pure returns (string memory)
    {
        return Symbol;
    }


    function name() public pure returns (string memory)
    {
        return Name;
    }

    function getOwner() external view returns (address)
    {
        return owner();
    }


    function totalBurn() public view returns (uint256)
    {
        return TotalTokenBurn;
    }

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool)
    {
        uint256 currentAllowance = allowance(sender,_msgSender());
        require(currentAllowance >= amount, "BEP20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);

    unchecked
    {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

    // Funciones para modificar  las lista de wallets
    // Funcion para banear a una wallet de usar el contrato (a.k.a decir que es un bot/apestao)
    // Esto lo tiene 100million
    function MarkBot(address targetAddress, bool isBot) public onlyOwner
    {
        Bots[targetAddress] = isBot;
        emit BlacklistedUser(targetAddress, isBot);
    }

    function IsBot(address targetAddress) public view returns(bool)
    {
        return Bots[targetAddress];
    }

    function ChangeExclusionFromHardCap(address targetAddress, bool isExcluded) public onlyOwner
    {
        WalletsExcludedFromHardCap[targetAddress] = isExcluded;
        emit ExcludeFromMaxWallet(targetAddress, isExcluded);
    }

    function IsExcludedFromHardCap(address targetAddress) public view returns(bool)
    {
        return WalletsExcludedFromHardCap[targetAddress];
    }

    // Funcion para setear una address para que pueda hacer tradeo automatico
    function setAutomatedMarketMakerPair(address _pair, bool value) external onlyOwner
    {
        require( AutomatedMarketMakerPairs[_pair] != value,"Automated market maker pair is already set to that value");
        AutomatedMarketMakerPairs[_pair] = value;
        ChangeExclusionFromHardCap(_pair, value);
        emit SetAutomatedMarketMakerPair(_pair, value);
    }

    // Funciones para manipular el allowance
    function _approve(address owner, address spender, uint256 amount) private
    {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        Allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool)
    {
        uint256 currentAllowance = Allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked
    {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }


    // Funciones de transferencia
    function _transfer(address from, address to, uint256 amount) private
    {
        if (liqAddedBlockNumber == 0 && AutomatedMarketMakerPairs[to])
        {
            liqAddedBlockNumber = block.number;
        }

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!IsBot(from), "ERC20: address blacklisted (bot)");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(from), "You are trying to transfer more than your balance");

        bool takeFee =  !(IsWalletExcludedFromFee(from) || IsWalletExcludedFromFee(to));

        if (takeFee)
        {
            // Hello stranger, what are you buying?
            if (AutomatedMarketMakerPairs[from])
            {
                // Not so fast ma boi
                if (block.number < liqAddedBlockNumber + blocksToWait)
                {
                    MarkBot(to, true);
                }

                // Si, el origen es el address de la transaccion, estamos sacando tokens del pool. Aplicamos el hard cap de compra
                AppliedRatesPercentage = BuyingTaxes;
                require(amount <= HardCapBuy, "amount must be <= maxTxAmountBuy" );
            }
            // What are you sellin'?
            else
            {
                // Si, la transferencia la inicia un address que no es de trading, aplicamos rates de venta (o transferencia entre peers)
                AppliedRatesPercentage = SellTaxes;
                require(amount <= HardCapSell,"amount must be <= maxTxAmountSell");
            }
        }

        // Repartir lo que ya hay si no estamos interactuando con el pair
        if (
            !InSwap &&
            !AutomatedMarketMakerPairs[from] &&
            SwapEnabled &&
            from != owner() && 
            to != owner() &&
            from != address(UniswapV2Router)
        ) {
            //add liquidity
            swapAndLiquify();
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    // This method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 cantidadBruta, bool takeFee) private
    {

        (uint256 cantidadNeta,
        uint256 cantidadBrutaRefracionaria,
        uint256 cantidadNetaRefracionaria,
        TransactionFees memory feesReales,
        TransactionFees memory feesRefracionarios) = GenerarFeesYCantidadesATransferir(cantidadBruta, takeFee);

        // Comprobando que el receptor de la transferencia no supere el hard cap de tokens
        require(WalletsExcludedFromHardCap[recipient] ||
            (balanceOf(recipient) + cantidadNeta) <= HardCap,
            "Recipient cannot hold more than maxWalletAmount");

        // Se siguen actualizando los valore reflaccionarios en caso de que las wallets
        // sean reincluidas en las recompensas de nuevo
        BalancesRefraccionarios[sender] -= cantidadBrutaRefracionaria;
        BalancesRefraccionarios[recipient] += cantidadNetaRefracionaria;

        if (takeFee)
        {

            ReflactionaryTotal -= feesRefracionarios.TransactionFee;
            TotalFee += feesReales.TransactionFee;

            AccumulateFee(feesReales, feesRefracionarios);
            // Quemando tokens
            TotalTokenBurn += feesReales.BurnFee;
            BalancesRefraccionarios[BurnAddress] += feesRefracionarios.BurnFee;

            // Emitiendo enventos para reflejar las acciones realizadas
            emit Transfer(address(this), BurnAddress, feesReales.BurnFee);
            emit Transfer(sender, address(this), feesReales.TransferrableFee);
        }
       
        emit Transfer(sender, recipient, cantidadNeta);
    }

    function GenerarFeesYCantidadesATransferir(uint256 cantidadBruta, bool aplicarImpuestos) private view returns(
        uint256 cantidadNeta,
        uint256 cantidadBrutaRefracionaria,
        uint256 cantidadNetaRefracionaria,
        TransactionFees memory feesReales,
        TransactionFees memory feesRefracionarios)
    {
        (feesReales, feesRefracionarios) = CalcularTasasRealesYRefracionarias(cantidadBruta, aplicarImpuestos);
        cantidadNeta = cantidadBruta - feesReales.TotalFee;
        cantidadBrutaRefracionaria =  cantidadBruta * GetConversionRate();
        cantidadNetaRefracionaria = cantidadBrutaRefracionaria - feesRefracionarios.TotalFee;
    }


    function CalcularTasasRealesYRefracionarias(uint256 cantidadBruta, bool takeFee) private view returns (TransactionFees memory realFees, TransactionFees memory refractionaryFees)
    {
        if (takeFee)
        {
            uint256 currentRate = GetConversionRate();

            // Caluclando las tasas
            realFees.TransactionFee = (cantidadBruta * AppliedRatesPercentage.RewardTax) / 100;
            realFees.BurnFee =  (cantidadBruta * AppliedRatesPercentage.BurnTax) / 100;
            realFees.DevFee =  (cantidadBruta * AppliedRatesPercentage.DevelopmentTax) / 100;
            realFees.MarketingFee =  (cantidadBruta * AppliedRatesPercentage.MarketingTax) / 100;
            realFees.LiquidityFee =  (cantidadBruta * AppliedRatesPercentage.LiquidityTax) / 100;

            // Sumando las tasas y agrupando entre las que se van al contrato y las que no
            realFees.TransferrableFee = realFees.DevFee + realFees.MarketingFee + realFees.LiquidityFee;
            realFees.TotalFee = realFees.TransactionFee + realFees.BurnFee + realFees.TransferrableFee;

            refractionaryFees.TransactionFee = realFees.TransactionFee * currentRate;
            refractionaryFees.BurnFee =  realFees.BurnFee * currentRate;
            refractionaryFees.DevFee =   realFees.DevFee * currentRate;
            refractionaryFees.MarketingFee = realFees.MarketingFee * currentRate;
            refractionaryFees.LiquidityFee = realFees.LiquidityFee * currentRate;

            refractionaryFees.TotalFee = realFees.TotalFee * currentRate;
            refractionaryFees.TransferrableFee = realFees.TransferrableFee * currentRate;
        }
    }

    function AccumulateFee(TransactionFees memory realFees, TransactionFees memory refractionaryFees) private
    {
        BalancesRefraccionarios[address(this)] += refractionaryFees.TransferrableFee;

        AccumulatedFeeForDistribution.LiquidityFee += realFees.LiquidityFee;

        AccumulatedFeeForDistribution.DevFee += realFees.DevFee;

        AccumulatedFeeForDistribution.MarketingFee += realFees.MarketingFee;

    }



    function swapAndLiquify() private swaping
    {
        // Swapping the rest of the fees
        if(balanceOf(address(this)) > 0)
        {
            uint256 tokensToSwap = AccumulatedFeeForDistribution.LiquidityFee / 2;
            uint256 tokensForLiquidity = AccumulatedFeeForDistribution.LiquidityFee - tokensToSwap;

            swapTokensForETH(AccumulatedFeeForDistribution.DevFee + AccumulatedFeeForDistribution.MarketingFee + tokensToSwap);

            uint256 contractBalance = address(this).balance;
            uint256 devShare = (contractBalance* DevDistributionPct)/100;
            uint256 mktShare = (contractBalance * MarketingDistributionPct)/100;

            DevAddress.transfer(devShare);
            MarketingAddress.transfer(mktShare);

            uint256 eth = address(this).balance;

            UniswapV2Router.addLiquidityETH{value: address(this).balance}(
                address(this),
                tokensForLiquidity,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                DevAddress,
                block.timestamp
            );

            AccumulatedFeeForDistribution.LiquidityFee = 0;
            AccumulatedFeeForDistribution.DevFee = 0;
            AccumulatedFeeForDistribution.MarketingFee = 0;

            TotalSwapped += tokensForLiquidity;


            emit LiquidityAdded(tokensForLiquidity, eth);
        }
    }

    function tokenFromReflection(uint256 reflactionaryAmount) public view returns (uint256)
    {
        require(reflactionaryAmount <= ReflactionaryTotal,"Amount must be less than total reflections");
        return reflactionaryAmount / GetConversionRate();
    }

    function GetConversionRate() private view returns (uint256)
    {
        return ReflactionaryTotal / totalSupply();
    }

    // Funciones para modificar cositas del swap
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner
    {
        SwapEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }


    // Esto es para poder recibir cosas de pancake swap
    receive() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"swap","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"botAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"BlacklistedUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":false,"internalType":"uint256","name":"devFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"TreasuryAndDevFeesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"adr","type":"address"}],"name":"setDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"adr","type":"address"}],"name":"setMktAddress","type":"event"},{"inputs":[{"internalType":"uint256","name":"newHardCap","type":"uint256"}],"name":"AdjustMaxHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mxTxBuy","type":"uint256"}],"name":"AdjustMaxTxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxSell","type":"uint256"}],"name":"AdjustMaxTxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AppliedRatesPercentage","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"AutomatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyingTaxes","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevAddress","type":"address"}],"name":"ChangeDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ChangeExcludeFromFeeToForWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ChangeExclusionFromHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingAddress","type":"address"}],"name":"ChangeMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardTax","type":"uint256"},{"internalType":"uint256","name":"mktTax","type":"uint256"},{"internalType":"uint256","name":"devTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"},{"internalType":"bool","name":"buying","type":"bool"}],"name":"ChangeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsExcludedFromHardCap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"IsWalletExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"bool","name":"isBot","type":"bool"}],"name":"MarkBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PancakeSwapAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellTaxes","outputs":[{"internalType":"uint256","name":"BurnTax","type":"uint256"},{"internalType":"uint256","name":"LiquidityTax","type":"uint256"},{"internalType":"uint256","name":"MarketingTax","type":"uint256"},{"internalType":"uint256","name":"DevelopmentTax","type":"uint256"},{"internalType":"uint256","name":"RewardTax","type":"uint256"},{"internalType":"string","name":"TaxPresetName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"}],"name":"SwapPct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalSwapped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksToWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"getOwner","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":"liqAddedBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflactionaryAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526012600a620000149190620010f9565b6305f5e1006200002591906200114a565b6001556001546000196200003a9190620011c4565b600019620000499190620011fc565b60025560006006557321d5a3f29f6d4dea6702fc9dc0235b1320b72bb7600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507321d5a3f29f6d4dea6702fc9dc0235b1320b72bb7600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060216001546200014f919062001237565b600a55600a54600b55600a54600c556000601760006101000a81548160ff0219169083151502179055506000601760016101000a81548160ff0219169083151502179055506032601855601980556019601a556012600a620001b29190620010f9565b6001620001c091906200114a565b601b556040518060c0016040528060008152602001602181526020016021815260200160218152602001600081526020016040518060400160405280600681526020017f427579696e670000000000000000000000000000000000000000000000000000815250815250601c600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005019081620002759190620014df565b5050506040518060c0016040528060008152602001602181526020016021815260200160218152602001600081526020016040518060400160405280600781526020017f53656c6c696e67000000000000000000000000000000000000000000000000008152508152506022600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190816200032a9190620014df565b505050601c6028600082015481600001556001820154816001015560028201548160020155600382015481600301556004820154816004015560058201816005019081620003799190620015de565b5050506040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815250602e600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550503480156200040d57600080fd5b5060405162005f6638038062005f66833981810160405281019062000433919062001749565b620004536200044762000c9960201b60201c565b62000ca160201b60201c565b600081905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000507573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200052d919062001749565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005dd919062001749565b6040518363ffffffff1660e01b8152600401620005fc9291906200178c565b6020604051808303816000875af11580156200061c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000642919062001749565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160136000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160006200071262000d6560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260006200091d62000d6560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600254600d600062000ba362000c9960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000c1830600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660001962000d8e60201b60201c565b62000c2862000c9960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60015460405162000c899190620017ca565b60405180910390a3505062001928565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000df7906200186e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000e72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e699062001906565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000f529190620017ca565b60405180910390a3505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000fed5780860481111562000fc55762000fc462000f5f565b5b600185161562000fd55780820291505b808102905062000fe58562000f8e565b945062000fa5565b94509492505050565b600082620010085760019050620010db565b81620010185760009050620010db565b81600181146200103157600281146200103c5762001072565b6001915050620010db565b60ff84111562001051576200105062000f5f565b5b8360020a9150848211156200106b576200106a62000f5f565b5b50620010db565b5060208310610133831016604e8410600b8410161715620010ac5782820a905083811115620010a657620010a562000f5f565b5b620010db565b620010bb848484600162000f9b565b92509050818404811115620010d557620010d462000f5f565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200110682620010e2565b91506200111383620010ec565b9250620011427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ff6565b905092915050565b60006200115782620010e2565b91506200116483620010e2565b92508282026200117481620010e2565b915082820484148315176200118e576200118d62000f5f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620011d182620010e2565b9150620011de83620010e2565b925082620011f157620011f062001195565b5b828206905092915050565b60006200120982620010e2565b91506200121683620010e2565b925082820390508181111562001231576200123062000f5f565b5b92915050565b60006200124482620010e2565b91506200125183620010e2565b92508262001264576200126362001195565b5b828204905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620012f157607f821691505b602082108103620013075762001306620012a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620013717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001332565b6200137d868362001332565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620013c0620013ba620013b484620010e2565b62001395565b620010e2565b9050919050565b6000819050919050565b620013dc836200139f565b620013f4620013eb82620013c7565b8484546200133f565b825550505050565b600090565b6200140b620013fc565b62001418818484620013d1565b505050565b5b8181101562001440576200143460008262001401565b6001810190506200141e565b5050565b601f8211156200148f5762001459816200130d565b620014648462001322565b8101602085101562001474578190505b6200148c620014838562001322565b8301826200141d565b50505b505050565b600082821c905092915050565b6000620014b46000198460080262001494565b1980831691505092915050565b6000620014cf8383620014a1565b9150826002028217905092915050565b620014ea826200126f565b67ffffffffffffffff8111156200150657620015056200127a565b5b620015128254620012d8565b6200151f82828562001444565b600060209050601f83116001811462001557576000841562001542578287015190505b6200154e8582620014c1565b865550620015be565b601f19841662001567866200130d565b60005b8281101562001591578489015182556001820191506020850194506020810190506200156a565b86831015620015b15784890151620015ad601f891682620014a1565b8355505b6001600288020188555050505b505050505050565b600081549050620015d781620012d8565b9050919050565b818103620015ee575050620016dd565b620015f982620015c6565b67ffffffffffffffff8111156200161557620016146200127a565b5b620016218254620012d8565b6200162e82828562001444565b6000601f8311600181146200166257600084156200164d578287015490505b620016598582620014c1565b865550620016d6565b601f19841662001672876200130d565b96506200167f866200130d565b60005b82811015620016a95784890154825560018201915060018501945060208101905062001682565b86831015620016c95784890154620016c5601f891682620014a1565b8355505b6001600288020188555050505b5050505050505b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200171182620016e4565b9050919050565b620017238162001704565b81146200172f57600080fd5b50565b600081519050620017438162001718565b92915050565b600060208284031215620017625762001761620016df565b5b6000620017728482850162001732565b91505092915050565b620017868162001704565b82525050565b6000604082019050620017a360008301856200177b565b620017b260208301846200177b565b9392505050565b620017c481620010e2565b82525050565b6000602082019050620017e16000830184620017b9565b92915050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062001856602483620017e7565b91506200186382620017f8565b604082019050919050565b60006020820190508181036000830152620018898162001847565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000620018ee602283620017e7565b9150620018fb8262001890565b604082019050919050565b600060208201905081810360008301526200192181620018df565b9050919050565b61462e80620019386000396000f3fe6080604052600436106102545760003560e01c8063893d20e811610139578063c5927207116100b6578063dd62ed3e1161007a578063dd62ed3e146108fb578063df2abc2414610938578063f2bc6ea414610961578063f2fde38b14610991578063fc962edb146109ba578063fdca8605146109ea5761025b565b8063c592720714610802578063c84dc0481461083f578063d43ad1e914610868578063d7c0991514610893578063d8dcac4f146108d05761025b565b80639a7a23d6116100fd5780639a7a23d614610706578063a457c2d71461072f578063a9059cbb1461076c578063a9c21468146107a9578063c49b9a80146107d95761025b565b8063893d20e8146106315780638a0eef5a1461065c5780638da5cb5b1461068757806395d89b41146106b257806399ec86fe146106dd5761025b565b8063313ce567116101d25780634f7addbc116101965780634f7addbc146105255780635a0b1a6d1461056257806368dc04c31461058b5780636a9e1458146105b457806370a08231146105dd578063715018a61461061a5761025b565b8063313ce5671461043e57806331df899a1461046957806339509351146104925780633c9f861d146104cf5780634d3314f4146104fa5761025b565b806313afbca71161021957806313afbca71461034757806318160ddd146103705780631850e44f1461039b57806323b872dd146103c45780632d838119146104015761025b565b8062470d3a14610260578063055add0d1461028b57806306fdde03146102b6578063095ea7b3146102e15780630a4ea2021461031e5761025b565b3661025b57005b600080fd5b34801561026c57600080fd5b50610275610a27565b60405161028291906130b2565b60405180910390f35b34801561029757600080fd5b506102a0610a4d565b6040516102ad919061312c565b60405180910390f35b3480156102c257600080fd5b506102cb610a73565b6040516102d891906131d7565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190613260565b610ab0565b60405161031591906132bb565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613314565b610ace565b005b34801561035357600080fd5b5061036e6004803603810190610369919061336d565b610bf6565b005b34801561037c57600080fd5b50610385610c93565b60405161039291906133bc565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd919061336d565b610c9d565b005b3480156103d057600080fd5b506103eb60048036038101906103e691906133d7565b610d00565b6040516103f891906132bb565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061342a565b610d84565b60405161043591906133bc565b60405180910390f35b34801561044a57600080fd5b50610453610de5565b6040516104609190613473565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b919061348e565b610dee565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613260565b610e59565b6040516104c691906132bb565b60405180910390f35b3480156104db57600080fd5b506104e4610f05565b6040516104f191906133bc565b60405180910390f35b34801561050657600080fd5b5061050f610f0f565b60405161051c91906133bc565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613509565b610f15565b60405161055991906132bb565b60405180910390f35b34801561056e57600080fd5b506105896004803603810190610584919061342a565b610f6b565b005b34801561059757600080fd5b506105b260048036038101906105ad919061342a565b610f7d565b005b3480156105c057600080fd5b506105db60048036038101906105d6919061342a565b611258565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613509565b61126a565b60405161061191906133bc565b60405180910390f35b34801561062657600080fd5b5061062f6112bb565b005b34801561063d57600080fd5b506106466112cf565b60405161065391906130b2565b60405180910390f35b34801561066857600080fd5b506106716112de565b60405161067e91906133bc565b60405180910390f35b34801561069357600080fd5b5061069c6112e4565b6040516106a991906130b2565b60405180910390f35b3480156106be57600080fd5b506106c761130d565b6040516106d491906131d7565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613314565b61134a565b005b34801561071257600080fd5b5061072d6004803603810190610728919061336d565b611472565b005b34801561073b57600080fd5b5061075660048036038101906107519190613260565b6115b7565b60405161076391906132bb565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613260565b6116a2565b6040516107a091906132bb565b60405180910390f35b3480156107b557600080fd5b506107be6116c0565b6040516107d096959493929190613536565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb919061359e565b611772565b005b34801561080e57600080fd5b5061082960048036038101906108249190613509565b6117ce565b60405161083691906132bb565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061342a565b6117ee565b005b34801561087457600080fd5b5061087d611800565b60405161088a91906133bc565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613509565b611806565b6040516108c791906132bb565b60405180910390f35b3480156108dc57600080fd5b506108e561185c565b6040516108f291906133bc565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d91906135cb565b611862565b60405161092f91906133bc565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a919061336d565b6118e9565b005b34801561096d57600080fd5b50610976611986565b60405161098896959493929190613536565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190613509565b611a38565b005b3480156109c657600080fd5b506109cf611abb565b6040516109e196959493929190613536565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c9190613509565b611b6d565b604051610a1e91906132bb565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f5a65726f20546178000000000000000000000000000000000000000000000000815250905090565b6000610ac4610abd611bc3565b8484611bcb565b6001905092915050565b610ad6611d94565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f0f9ab6c7b3a29f5eca7cf80f42ea6b1262432064b221200268394c9a5e63569f60405160405180910390a3610b84600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bf2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b610bfe611d94565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b283604051610c8791906130b2565b60405180910390a25050565b6000600154905090565b610ca5611d94565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610d1485610d0f611bc3565b611862565b905082811015610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d509061367d565b60405180910390fd5b610d64858585611e12565b610d7885610d70611bc3565b858403611bcb565b60019150509392505050565b6000600254821115610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc29061370f565b60405180910390fd5b610dd361236c565b82610dde919061378d565b9050919050565b60006012905090565b610df6611d94565b8015610e295784601c6004018190555083601c6002018190555082601c6003018190555081601c60010181905550610e52565b846022600401819055508360226002018190555082602260030181905550816022600101819055505b5050505050565b6000610efb610e66611bc3565b8484600f6000610e74611bc3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef691906137be565b611bcb565b6001905092915050565b6000601654905090565b60145481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f73611d94565b80600c8190555050565b6000606482610f8b3061126a565b610f9591906137f2565b610f9f919061378d565b905060008111156112545760006064601a5483610fbc91906137f2565b610fc6919061378d565b90506000600282610fd7919061378d565b905060008184610fe79190613834565b9050610ff281612388565b6000479050600060646019548361100991906137f2565b611013919061378d565b9050600060646018548461102791906137f2565b611031919061378d565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561109b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611104573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473089600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611193969594939291906138c4565b60606040518083038185885af11580156111b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111d6919061393a565b5050506000602e600401819055506000602e600201819055506000602e60030181905550856015600082825461120c91906137be565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b868260405161124492919061398d565b60405180910390a1505050505050505b5050565b611260611d94565b80600b8190555050565b60006112b4600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d84565b9050919050565b6112c3611d94565b6112cd600061259e565b565b60006112d96112e4565b905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f5a54580000000000000000000000000000000000000000000000000000000000815250905090565b611352611d94565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f194c6407864834414a3adaa18aab4cb81b733d5986a0c3b1e0fc9a8bccc0c0fb60405160405180910390a3611400600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061146e600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b61147a611d94565b801515601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613a28565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061156d8282610bf6565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600f60006115c6611bc3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90613aba565b60405180910390fd5b61169761168e611bc3565b85858403611bcb565b600191505092915050565b60006116b66116af611bc3565b8484611e12565b6001905092915050565b60288060000154908060010154908060020154908060030154908060040154908060050180546116ef90613b09565b80601f016020809104026020016040519081016040528092919081815260200182805461171b90613b09565b80156117685780601f1061173d57610100808354040283529160200191611768565b820191906000526020600020905b81548152906001019060200180831161174b57829003601f168201915b5050505050905086565b61177a611d94565b80601760016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516117c391906132bb565b60405180910390a150565b60136020528060005260406000206000915054906101000a900460ff1681565b6117f6611d94565b80600a8190555050565b60155481565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60065481565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6118f1611d94565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f3159dadbd8e2d720a851b412e3358e7e44bb11734c9bfd5715340e21798e8b258360405161197a91906130b2565b60405180910390a25050565b601c8060000154908060010154908060020154908060030154908060040154908060050180546119b590613b09565b80601f01602080910402602001604051908101604052809291908181526020018280546119e190613b09565b8015611a2e5780601f10611a0357610100808354040283529160200191611a2e565b820191906000526020600020905b815481529060010190602001808311611a1157829003601f168201915b5050505050905086565b611a40611d94565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613bac565b60405180910390fd5b611ab88161259e565b50565b6022806000015490806001015490806002015490806003015490806004015490806005018054611aea90613b09565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1690613b09565b8015611b635780601f10611b3857610100808354040283529160200191611b63565b820191906000526020600020905b815481529060010190602001808311611b4657829003601f168201915b5050505050905086565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613c3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613cd0565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d8791906133bc565b60405180910390a3505050565b611d9c611bc3565b73ffffffffffffffffffffffffffffffffffffffff16611dba6112e4565b73ffffffffffffffffffffffffffffffffffffffff1614611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790613d3c565b60405180910390fd5b565b6000600554148015611e6d5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e7a57436005819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090613dce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90613e60565b60405180910390fd5b611f6183611806565b15611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890613ecc565b60405180910390fd5b60008111611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90613f5e565b60405180910390fd5b611fed8361126a565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690613ff0565b60405180910390fd5b600061203a84611b6d565b8061204a575061204983611b6d565b5b15905080156121f557601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612160576006546005546120b591906137be565b4310156120c8576120c78360016118e9565b5b601c602860008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820181600501908161211291906141f7565b50905050600b5482111561215b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121529061432b565b60405180910390fd5b6121f4565b602260286000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582018160050190816121aa91906141f7565b50905050600c548211156121f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ea906143bd565b60405180910390fd5b5b5b601760009054906101000a900460ff1615801561225c5750601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122745750601760019054906101000a900460ff165b80156122b357506122836112e4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156122f257506122c26112e4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561234c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561235a57612359612662565b5b61236684848484612960565b50505050565b6000612376610c93565b600254612383919061378d565b905090565b6000600267ffffffffffffffff8111156123a5576123a4614026565b5b6040519080825280602002602001820160405280156123d35781602001602082028036833780820191505090505b50905030816000815181106123eb576123ea6143dd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614421565b816001815181106124ca576124c96143dd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161256895949392919061450c565b600060405180830381600087803b15801561258257600080fd5b505af1158015612596573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601760006101000a81548160ff02191690831515021790555060006126883061126a565b11156129435760006002602e600401546126a2919061378d565b9050600081602e600401546126b79190613834565b90506126e282602e60030154602e600201546126d391906137be565b6126dd91906137be565b612388565b600047905060006064601954836126f991906137f2565b612703919061378d565b9050600060646018548461271791906137f2565b612721919061378d565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561278b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156127f4573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473088600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612883969594939291906138c4565b60606040518083038185885af11580156128a1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128c6919061393a565b5050506000602e600401819055506000602e600201819055506000602e6003018190555084601560008282546128fc91906137be565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b858260405161293492919061398d565b60405180910390a15050505050505b6000601760006101000a81548160ff021916908315150217905550565b60008060008060006129728787612d1c565b94509450945094509450601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129e95750600a54856129dc8a61126a565b6129e691906137be565b11155b612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f906145d8565b60405180910390fd5b83600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a779190613834565b9250508190555082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612acd91906137be565b925050819055508515612cac57806000015160026000828254612af09190613834565b92505081905550816000015160146000828254612b0d91906137be565b92505081905550612b1e8282612d86565b816020015160166000828254612b3491906137be565b925050819055508060200151600d6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb091906137be565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051612c3a91906133bc565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460a00151604051612ca391906133bc565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d0991906133bc565b60405180910390a3505050505050505050565b6000806000612d29613034565b612d31613034565b612d3b8787612e44565b80925081935050508160c0015187612d539190613834565b9450612d5d61236c565b87612d6891906137f2565b93508060c0015184612d7a9190613834565b92509295509295909350565b8060a00151600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd991906137be565b925050819055508160800151602e6004016000828254612df991906137be565b925050819055508160400151602e6002016000828254612e1991906137be565b925050819055508160600151602e6003016000828254612e3991906137be565b925050819055505050565b612e4c613034565b612e54613034565b821561302d576000612e6461236c565b9050606460286004015486612e7991906137f2565b612e83919061378d565b836000018181525050606460286000015486612e9f91906137f2565b612ea9919061378d565b836020018181525050606460286003015486612ec591906137f2565b612ecf919061378d565b836040018181525050606460286002015486612eeb91906137f2565b612ef5919061378d565b836060018181525050606460286001015486612f1191906137f2565b612f1b919061378d565b836080018181525050826080015183606001518460400151612f3d91906137be565b612f4791906137be565b8360a00181815250508260a0015183602001518460000151612f6991906137be565b612f7391906137be565b8360c0018181525050808360000151612f8c91906137f2565b826000018181525050808360200151612fa591906137f2565b826020018181525050808360400151612fbe91906137f2565b826040018181525050808360600151612fd791906137f2565b826060018181525050808360800151612ff091906137f2565b826080018181525050808360c0015161300991906137f2565b8260c0018181525050808360a0015161302291906137f2565b8260a0018181525050505b9250929050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309c82613071565b9050919050565b6130ac81613091565b82525050565b60006020820190506130c760008301846130a3565b92915050565b6000819050919050565b60006130f26130ed6130e884613071565b6130cd565b613071565b9050919050565b6000613104826130d7565b9050919050565b6000613116826130f9565b9050919050565b6131268161310b565b82525050565b6000602082019050613141600083018461311d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613181578082015181840152602081019050613166565b60008484015250505050565b6000601f19601f8301169050919050565b60006131a982613147565b6131b38185613152565b93506131c3818560208601613163565b6131cc8161318d565b840191505092915050565b600060208201905081810360008301526131f1818461319e565b905092915050565b600080fd5b61320781613091565b811461321257600080fd5b50565b600081359050613224816131fe565b92915050565b6000819050919050565b61323d8161322a565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60008060408385031215613277576132766131f9565b5b600061328585828601613215565b92505060206132968582860161324b565b9150509250929050565b60008115159050919050565b6132b5816132a0565b82525050565b60006020820190506132d060008301846132ac565b92915050565b60006132e182613071565b9050919050565b6132f1816132d6565b81146132fc57600080fd5b50565b60008135905061330e816132e8565b92915050565b60006020828403121561332a576133296131f9565b5b6000613338848285016132ff565b91505092915050565b61334a816132a0565b811461335557600080fd5b50565b60008135905061336781613341565b92915050565b60008060408385031215613384576133836131f9565b5b600061339285828601613215565b92505060206133a385828601613358565b9150509250929050565b6133b68161322a565b82525050565b60006020820190506133d160008301846133ad565b92915050565b6000806000606084860312156133f0576133ef6131f9565b5b60006133fe86828701613215565b935050602061340f86828701613215565b92505060406134208682870161324b565b9150509250925092565b6000602082840312156134405761343f6131f9565b5b600061344e8482850161324b565b91505092915050565b600060ff82169050919050565b61346d81613457565b82525050565b60006020820190506134886000830184613464565b92915050565b600080600080600060a086880312156134aa576134a96131f9565b5b60006134b88882890161324b565b95505060206134c98882890161324b565b94505060406134da8882890161324b565b93505060606134eb8882890161324b565b92505060806134fc88828901613358565b9150509295509295909350565b60006020828403121561351f5761351e6131f9565b5b600061352d84828501613215565b91505092915050565b600060c08201905061354b60008301896133ad565b61355860208301886133ad565b61356560408301876133ad565b61357260608301866133ad565b61357f60808301856133ad565b81810360a0830152613591818461319e565b9050979650505050505050565b6000602082840312156135b4576135b36131f9565b5b60006135c284828501613358565b91505092915050565b600080604083850312156135e2576135e16131f9565b5b60006135f085828601613215565b925050602061360185828601613215565b9150509250929050565b7f42455032303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613667602883613152565b91506136728261360b565b604082019050919050565b600060208201905081810360008301526136968161365a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006136f9602a83613152565b91506137048261369d565b604082019050919050565b60006020820190508181036000830152613728816136ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137988261322a565b91506137a38361322a565b9250826137b3576137b261372f565b5b828204905092915050565b60006137c98261322a565b91506137d48361322a565b92508282019050808211156137ec576137eb61375e565b5b92915050565b60006137fd8261322a565b91506138088361322a565b92508282026138168161322a565b9150828204841483151761382d5761382c61375e565b5b5092915050565b600061383f8261322a565b915061384a8361322a565b92508282039050818111156138625761386161375e565b5b92915050565b6000819050919050565b600061388d61388861388384613868565b6130cd565b61322a565b9050919050565b61389d81613872565b82525050565b60006138ae826130f9565b9050919050565b6138be816138a3565b82525050565b600060c0820190506138d960008301896130a3565b6138e660208301886133ad565b6138f36040830187613894565b6139006060830186613894565b61390d60808301856138b5565b61391a60a08301846133ad565b979650505050505050565b60008151905061393481613234565b92915050565b600080600060608486031215613953576139526131f9565b5b600061396186828701613925565b935050602061397286828701613925565b925050604061398386828701613925565b9150509250925092565b60006040820190506139a260008301856133ad565b6139af60208301846133ad565b9392505050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000613a12603883613152565b9150613a1d826139b6565b604082019050919050565b60006020820190508181036000830152613a4181613a05565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613aa4602583613152565b9150613aaf82613a48565b604082019050919050565b60006020820190508181036000830152613ad381613a97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b2157607f821691505b602082108103613b3457613b33613ada565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b96602683613152565b9150613ba182613b3a565b604082019050919050565b60006020820190508181036000830152613bc581613b89565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c28602483613152565b9150613c3382613bcc565b604082019050919050565b60006020820190508181036000830152613c5781613c1b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cba602283613152565b9150613cc582613c5e565b604082019050919050565b60006020820190508181036000830152613ce981613cad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d26602083613152565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613db8602583613152565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613e4a602383613152565b9150613e5582613dee565b604082019050919050565b60006020820190508181036000830152613e7981613e3d565b9050919050565b7f45524332303a206164647265737320626c61636b6c69737465642028626f7429600082015250565b6000613eb6602083613152565b9150613ec182613e80565b602082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000613f48602983613152565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f596f752061726520747279696e6720746f207472616e73666572206d6f72652060008201527f7468616e20796f75722062616c616e6365000000000000000000000000000000602082015250565b6000613fda603183613152565b9150613fe582613f7e565b604082019050919050565b6000602082019050818103600083015261400981613fcd565b9050919050565b60008154905061401f81613b09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261407a565b6140c1868361407a565b95508019841693508086168417925050509392505050565b60006140f46140ef6140ea8461322a565b6130cd565b61322a565b9050919050565b6000819050919050565b61410e836140d9565b61412261411a826140fb565b848454614087565b825550505050565b600090565b61413761412a565b614142818484614105565b505050565b5b818110156141665761415b60008261412f565b600181019050614148565b5050565b601f8211156141ab5761417c81614055565b6141858461406a565b81016020851015614194578190505b6141a86141a08561406a565b830182614147565b50505b505050565b600082821c905092915050565b60006141ce600019846008026141b0565b1980831691505092915050565b60006141e783836141bd565b9150826002028217905092915050565b8181036142055750506142dd565b61420e82614010565b67ffffffffffffffff81111561422757614226614026565b5b6142318254613b09565b61423c82828561416a565b6000601f83116001811461426b5760008415614259578287015490505b61426385826141db565b8655506142d6565b601f19841661427987614055565b965061428486614055565b60005b828110156142ac57848901548255600182019150600185019450602081019050614287565b868310156142c957848901546142c5601f8916826141bd565b8355505b6001600288020188555050505b5050505050505b565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e74427579600082015250565b6000614315602083613152565b9150614320826142df565b602082019050919050565b6000602082019050818103600083015261434481614308565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c60008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006143a7602183613152565b91506143b28261434b565b604082019050919050565b600060208201905081810360008301526143d68161439a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061441b816131fe565b92915050565b600060208284031215614437576144366131f9565b5b60006144458482850161440c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448381613091565b82525050565b6000614495838361447a565b60208301905092915050565b6000602082019050919050565b60006144b98261444e565b6144c38185614459565b93506144ce8361446a565b8060005b838110156144ff5781516144e68882614489565b97506144f1836144a1565b9250506001810190506144d2565b5085935050505092915050565b600060a08201905061452160008301886133ad565b61452e6020830187613894565b818103604083015261454081866144ae565b905061454f60608301856130a3565b61455c60808301846133ad565b9695505050505050565b7f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060008201527f6d617857616c6c6574416d6f756e740000000000000000000000000000000000602082015250565b60006145c2602f83613152565b91506145cd82614566565b604082019050919050565b600060208201905081810360008301526145f1816145b5565b905091905056fea2646970667358221220a2a311a16ca9accf0654552ab46f7dedc51a420753a4338d0ddf25f6b83bbff164736f6c634300081100330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x6080604052600436106102545760003560e01c8063893d20e811610139578063c5927207116100b6578063dd62ed3e1161007a578063dd62ed3e146108fb578063df2abc2414610938578063f2bc6ea414610961578063f2fde38b14610991578063fc962edb146109ba578063fdca8605146109ea5761025b565b8063c592720714610802578063c84dc0481461083f578063d43ad1e914610868578063d7c0991514610893578063d8dcac4f146108d05761025b565b80639a7a23d6116100fd5780639a7a23d614610706578063a457c2d71461072f578063a9059cbb1461076c578063a9c21468146107a9578063c49b9a80146107d95761025b565b8063893d20e8146106315780638a0eef5a1461065c5780638da5cb5b1461068757806395d89b41146106b257806399ec86fe146106dd5761025b565b8063313ce567116101d25780634f7addbc116101965780634f7addbc146105255780635a0b1a6d1461056257806368dc04c31461058b5780636a9e1458146105b457806370a08231146105dd578063715018a61461061a5761025b565b8063313ce5671461043e57806331df899a1461046957806339509351146104925780633c9f861d146104cf5780634d3314f4146104fa5761025b565b806313afbca71161021957806313afbca71461034757806318160ddd146103705780631850e44f1461039b57806323b872dd146103c45780632d838119146104015761025b565b8062470d3a14610260578063055add0d1461028b57806306fdde03146102b6578063095ea7b3146102e15780630a4ea2021461031e5761025b565b3661025b57005b600080fd5b34801561026c57600080fd5b50610275610a27565b60405161028291906130b2565b60405180910390f35b34801561029757600080fd5b506102a0610a4d565b6040516102ad919061312c565b60405180910390f35b3480156102c257600080fd5b506102cb610a73565b6040516102d891906131d7565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190613260565b610ab0565b60405161031591906132bb565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613314565b610ace565b005b34801561035357600080fd5b5061036e6004803603810190610369919061336d565b610bf6565b005b34801561037c57600080fd5b50610385610c93565b60405161039291906133bc565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd919061336d565b610c9d565b005b3480156103d057600080fd5b506103eb60048036038101906103e691906133d7565b610d00565b6040516103f891906132bb565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061342a565b610d84565b60405161043591906133bc565b60405180910390f35b34801561044a57600080fd5b50610453610de5565b6040516104609190613473565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b919061348e565b610dee565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613260565b610e59565b6040516104c691906132bb565b60405180910390f35b3480156104db57600080fd5b506104e4610f05565b6040516104f191906133bc565b60405180910390f35b34801561050657600080fd5b5061050f610f0f565b60405161051c91906133bc565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613509565b610f15565b60405161055991906132bb565b60405180910390f35b34801561056e57600080fd5b506105896004803603810190610584919061342a565b610f6b565b005b34801561059757600080fd5b506105b260048036038101906105ad919061342a565b610f7d565b005b3480156105c057600080fd5b506105db60048036038101906105d6919061342a565b611258565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613509565b61126a565b60405161061191906133bc565b60405180910390f35b34801561062657600080fd5b5061062f6112bb565b005b34801561063d57600080fd5b506106466112cf565b60405161065391906130b2565b60405180910390f35b34801561066857600080fd5b506106716112de565b60405161067e91906133bc565b60405180910390f35b34801561069357600080fd5b5061069c6112e4565b6040516106a991906130b2565b60405180910390f35b3480156106be57600080fd5b506106c761130d565b6040516106d491906131d7565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613314565b61134a565b005b34801561071257600080fd5b5061072d6004803603810190610728919061336d565b611472565b005b34801561073b57600080fd5b5061075660048036038101906107519190613260565b6115b7565b60405161076391906132bb565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613260565b6116a2565b6040516107a091906132bb565b60405180910390f35b3480156107b557600080fd5b506107be6116c0565b6040516107d096959493929190613536565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb919061359e565b611772565b005b34801561080e57600080fd5b5061082960048036038101906108249190613509565b6117ce565b60405161083691906132bb565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061342a565b6117ee565b005b34801561087457600080fd5b5061087d611800565b60405161088a91906133bc565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613509565b611806565b6040516108c791906132bb565b60405180910390f35b3480156108dc57600080fd5b506108e561185c565b6040516108f291906133bc565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d91906135cb565b611862565b60405161092f91906133bc565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a919061336d565b6118e9565b005b34801561096d57600080fd5b50610976611986565b60405161098896959493929190613536565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190613509565b611a38565b005b3480156109c657600080fd5b506109cf611abb565b6040516109e196959493929190613536565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c9190613509565b611b6d565b604051610a1e91906132bb565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f5a65726f20546178000000000000000000000000000000000000000000000000815250905090565b6000610ac4610abd611bc3565b8484611bcb565b6001905092915050565b610ad6611d94565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f0f9ab6c7b3a29f5eca7cf80f42ea6b1262432064b221200268394c9a5e63569f60405160405180910390a3610b84600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bf2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b610bfe611d94565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f4a8452f723db48bf05f301f94d62a2cf7a72976cde77d83e3646584858b8f4b283604051610c8791906130b2565b60405180910390a25050565b6000600154905090565b610ca5611d94565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610d1485610d0f611bc3565b611862565b905082811015610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d509061367d565b60405180910390fd5b610d64858585611e12565b610d7885610d70611bc3565b858403611bcb565b60019150509392505050565b6000600254821115610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc29061370f565b60405180910390fd5b610dd361236c565b82610dde919061378d565b9050919050565b60006012905090565b610df6611d94565b8015610e295784601c6004018190555083601c6002018190555082601c6003018190555081601c60010181905550610e52565b846022600401819055508360226002018190555082602260030181905550816022600101819055505b5050505050565b6000610efb610e66611bc3565b8484600f6000610e74611bc3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef691906137be565b611bcb565b6001905092915050565b6000601654905090565b60145481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f73611d94565b80600c8190555050565b6000606482610f8b3061126a565b610f9591906137f2565b610f9f919061378d565b905060008111156112545760006064601a5483610fbc91906137f2565b610fc6919061378d565b90506000600282610fd7919061378d565b905060008184610fe79190613834565b9050610ff281612388565b6000479050600060646019548361100991906137f2565b611013919061378d565b9050600060646018548461102791906137f2565b611031919061378d565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561109b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611104573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473089600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611193969594939291906138c4565b60606040518083038185885af11580156111b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111d6919061393a565b5050506000602e600401819055506000602e600201819055506000602e60030181905550856015600082825461120c91906137be565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b868260405161124492919061398d565b60405180910390a1505050505050505b5050565b611260611d94565b80600b8190555050565b60006112b4600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d84565b9050919050565b6112c3611d94565b6112cd600061259e565b565b60006112d96112e4565b905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f5a54580000000000000000000000000000000000000000000000000000000000815250905090565b611352611d94565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f194c6407864834414a3adaa18aab4cb81b733d5986a0c3b1e0fc9a8bccc0c0fb60405160405180910390a3611400600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610c9d565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061146e600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610c9d565b5050565b61147a611d94565b801515601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613a28565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061156d8282610bf6565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600f60006115c6611bc3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90613aba565b60405180910390fd5b61169761168e611bc3565b85858403611bcb565b600191505092915050565b60006116b66116af611bc3565b8484611e12565b6001905092915050565b60288060000154908060010154908060020154908060030154908060040154908060050180546116ef90613b09565b80601f016020809104026020016040519081016040528092919081815260200182805461171b90613b09565b80156117685780601f1061173d57610100808354040283529160200191611768565b820191906000526020600020905b81548152906001019060200180831161174b57829003601f168201915b5050505050905086565b61177a611d94565b80601760016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516117c391906132bb565b60405180910390a150565b60136020528060005260406000206000915054906101000a900460ff1681565b6117f6611d94565b80600a8190555050565b60155481565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60065481565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6118f1611d94565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015157f3159dadbd8e2d720a851b412e3358e7e44bb11734c9bfd5715340e21798e8b258360405161197a91906130b2565b60405180910390a25050565b601c8060000154908060010154908060020154908060030154908060040154908060050180546119b590613b09565b80601f01602080910402602001604051908101604052809291908181526020018280546119e190613b09565b8015611a2e5780601f10611a0357610100808354040283529160200191611a2e565b820191906000526020600020905b815481529060010190602001808311611a1157829003601f168201915b5050505050905086565b611a40611d94565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613bac565b60405180910390fd5b611ab88161259e565b50565b6022806000015490806001015490806002015490806003015490806004015490806005018054611aea90613b09565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1690613b09565b8015611b635780601f10611b3857610100808354040283529160200191611b63565b820191906000526020600020905b815481529060010190602001808311611b4657829003601f168201915b5050505050905086565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613c3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090613cd0565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d8791906133bc565b60405180910390a3505050565b611d9c611bc3565b73ffffffffffffffffffffffffffffffffffffffff16611dba6112e4565b73ffffffffffffffffffffffffffffffffffffffff1614611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790613d3c565b60405180910390fd5b565b6000600554148015611e6d5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e7a57436005819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090613dce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90613e60565b60405180910390fd5b611f6183611806565b15611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890613ecc565b60405180910390fd5b60008111611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90613f5e565b60405180910390fd5b611fed8361126a565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690613ff0565b60405180910390fd5b600061203a84611b6d565b8061204a575061204983611b6d565b5b15905080156121f557601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612160576006546005546120b591906137be565b4310156120c8576120c78360016118e9565b5b601c602860008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820181600501908161211291906141f7565b50905050600b5482111561215b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121529061432b565b60405180910390fd5b6121f4565b602260286000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582018160050190816121aa91906141f7565b50905050600c548211156121f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ea906143bd565b60405180910390fd5b5b5b601760009054906101000a900460ff1615801561225c5750601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122745750601760019054906101000a900460ff165b80156122b357506122836112e4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156122f257506122c26112e4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561234c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561235a57612359612662565b5b61236684848484612960565b50505050565b6000612376610c93565b600254612383919061378d565b905090565b6000600267ffffffffffffffff8111156123a5576123a4614026565b5b6040519080825280602002602001820160405280156123d35781602001602082028036833780820191505090505b50905030816000815181106123eb576123ea6143dd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614421565b816001815181106124ca576124c96143dd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161256895949392919061450c565b600060405180830381600087803b15801561258257600080fd5b505af1158015612596573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601760006101000a81548160ff02191690831515021790555060006126883061126a565b11156129435760006002602e600401546126a2919061378d565b9050600081602e600401546126b79190613834565b90506126e282602e60030154602e600201546126d391906137be565b6126dd91906137be565b612388565b600047905060006064601954836126f991906137f2565b612703919061378d565b9050600060646018548461271791906137f2565b612721919061378d565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561278b573d6000803e3d6000fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156127f4573d6000803e3d6000fd5b506000479050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473088600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612883969594939291906138c4565b60606040518083038185885af11580156128a1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128c6919061393a565b5050506000602e600401819055506000602e600201819055506000602e6003018190555084601560008282546128fc91906137be565b925050819055507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b858260405161293492919061398d565b60405180910390a15050505050505b6000601760006101000a81548160ff021916908315150217905550565b60008060008060006129728787612d1c565b94509450945094509450601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129e95750600a54856129dc8a61126a565b6129e691906137be565b11155b612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f906145d8565b60405180910390fd5b83600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a779190613834565b9250508190555082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612acd91906137be565b925050819055508515612cac57806000015160026000828254612af09190613834565b92505081905550816000015160146000828254612b0d91906137be565b92505081905550612b1e8282612d86565b816020015160166000828254612b3491906137be565b925050819055508060200151600d6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb091906137be565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051612c3a91906133bc565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460a00151604051612ca391906133bc565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d0991906133bc565b60405180910390a3505050505050505050565b6000806000612d29613034565b612d31613034565b612d3b8787612e44565b80925081935050508160c0015187612d539190613834565b9450612d5d61236c565b87612d6891906137f2565b93508060c0015184612d7a9190613834565b92509295509295909350565b8060a00151600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd991906137be565b925050819055508160800151602e6004016000828254612df991906137be565b925050819055508160400151602e6002016000828254612e1991906137be565b925050819055508160600151602e6003016000828254612e3991906137be565b925050819055505050565b612e4c613034565b612e54613034565b821561302d576000612e6461236c565b9050606460286004015486612e7991906137f2565b612e83919061378d565b836000018181525050606460286000015486612e9f91906137f2565b612ea9919061378d565b836020018181525050606460286003015486612ec591906137f2565b612ecf919061378d565b836040018181525050606460286002015486612eeb91906137f2565b612ef5919061378d565b836060018181525050606460286001015486612f1191906137f2565b612f1b919061378d565b836080018181525050826080015183606001518460400151612f3d91906137be565b612f4791906137be565b8360a00181815250508260a0015183602001518460000151612f6991906137be565b612f7391906137be565b8360c0018181525050808360000151612f8c91906137f2565b826000018181525050808360200151612fa591906137f2565b826020018181525050808360400151612fbe91906137f2565b826040018181525050808360600151612fd791906137f2565b826060018181525050808360800151612ff091906137f2565b826080018181525050808360c0015161300991906137f2565b8260c0018181525050808360a0015161302291906137f2565b8260a0018181525050505b9250929050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309c82613071565b9050919050565b6130ac81613091565b82525050565b60006020820190506130c760008301846130a3565b92915050565b6000819050919050565b60006130f26130ed6130e884613071565b6130cd565b613071565b9050919050565b6000613104826130d7565b9050919050565b6000613116826130f9565b9050919050565b6131268161310b565b82525050565b6000602082019050613141600083018461311d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613181578082015181840152602081019050613166565b60008484015250505050565b6000601f19601f8301169050919050565b60006131a982613147565b6131b38185613152565b93506131c3818560208601613163565b6131cc8161318d565b840191505092915050565b600060208201905081810360008301526131f1818461319e565b905092915050565b600080fd5b61320781613091565b811461321257600080fd5b50565b600081359050613224816131fe565b92915050565b6000819050919050565b61323d8161322a565b811461324857600080fd5b50565b60008135905061325a81613234565b92915050565b60008060408385031215613277576132766131f9565b5b600061328585828601613215565b92505060206132968582860161324b565b9150509250929050565b60008115159050919050565b6132b5816132a0565b82525050565b60006020820190506132d060008301846132ac565b92915050565b60006132e182613071565b9050919050565b6132f1816132d6565b81146132fc57600080fd5b50565b60008135905061330e816132e8565b92915050565b60006020828403121561332a576133296131f9565b5b6000613338848285016132ff565b91505092915050565b61334a816132a0565b811461335557600080fd5b50565b60008135905061336781613341565b92915050565b60008060408385031215613384576133836131f9565b5b600061339285828601613215565b92505060206133a385828601613358565b9150509250929050565b6133b68161322a565b82525050565b60006020820190506133d160008301846133ad565b92915050565b6000806000606084860312156133f0576133ef6131f9565b5b60006133fe86828701613215565b935050602061340f86828701613215565b92505060406134208682870161324b565b9150509250925092565b6000602082840312156134405761343f6131f9565b5b600061344e8482850161324b565b91505092915050565b600060ff82169050919050565b61346d81613457565b82525050565b60006020820190506134886000830184613464565b92915050565b600080600080600060a086880312156134aa576134a96131f9565b5b60006134b88882890161324b565b95505060206134c98882890161324b565b94505060406134da8882890161324b565b93505060606134eb8882890161324b565b92505060806134fc88828901613358565b9150509295509295909350565b60006020828403121561351f5761351e6131f9565b5b600061352d84828501613215565b91505092915050565b600060c08201905061354b60008301896133ad565b61355860208301886133ad565b61356560408301876133ad565b61357260608301866133ad565b61357f60808301856133ad565b81810360a0830152613591818461319e565b9050979650505050505050565b6000602082840312156135b4576135b36131f9565b5b60006135c284828501613358565b91505092915050565b600080604083850312156135e2576135e16131f9565b5b60006135f085828601613215565b925050602061360185828601613215565b9150509250929050565b7f42455032303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613667602883613152565b91506136728261360b565b604082019050919050565b600060208201905081810360008301526136968161365a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006136f9602a83613152565b91506137048261369d565b604082019050919050565b60006020820190508181036000830152613728816136ec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137988261322a565b91506137a38361322a565b9250826137b3576137b261372f565b5b828204905092915050565b60006137c98261322a565b91506137d48361322a565b92508282019050808211156137ec576137eb61375e565b5b92915050565b60006137fd8261322a565b91506138088361322a565b92508282026138168161322a565b9150828204841483151761382d5761382c61375e565b5b5092915050565b600061383f8261322a565b915061384a8361322a565b92508282039050818111156138625761386161375e565b5b92915050565b6000819050919050565b600061388d61388861388384613868565b6130cd565b61322a565b9050919050565b61389d81613872565b82525050565b60006138ae826130f9565b9050919050565b6138be816138a3565b82525050565b600060c0820190506138d960008301896130a3565b6138e660208301886133ad565b6138f36040830187613894565b6139006060830186613894565b61390d60808301856138b5565b61391a60a08301846133ad565b979650505050505050565b60008151905061393481613234565b92915050565b600080600060608486031215613953576139526131f9565b5b600061396186828701613925565b935050602061397286828701613925565b925050604061398386828701613925565b9150509250925092565b60006040820190506139a260008301856133ad565b6139af60208301846133ad565b9392505050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000613a12603883613152565b9150613a1d826139b6565b604082019050919050565b60006020820190508181036000830152613a4181613a05565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613aa4602583613152565b9150613aaf82613a48565b604082019050919050565b60006020820190508181036000830152613ad381613a97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b2157607f821691505b602082108103613b3457613b33613ada565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b96602683613152565b9150613ba182613b3a565b604082019050919050565b60006020820190508181036000830152613bc581613b89565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c28602483613152565b9150613c3382613bcc565b604082019050919050565b60006020820190508181036000830152613c5781613c1b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cba602283613152565b9150613cc582613c5e565b604082019050919050565b60006020820190508181036000830152613ce981613cad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d26602083613152565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613db8602583613152565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613e4a602383613152565b9150613e5582613dee565b604082019050919050565b60006020820190508181036000830152613e7981613e3d565b9050919050565b7f45524332303a206164647265737320626c61636b6c69737465642028626f7429600082015250565b6000613eb6602083613152565b9150613ec182613e80565b602082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000613f48602983613152565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f596f752061726520747279696e6720746f207472616e73666572206d6f72652060008201527f7468616e20796f75722062616c616e6365000000000000000000000000000000602082015250565b6000613fda603183613152565b9150613fe582613f7e565b604082019050919050565b6000602082019050818103600083015261400981613fcd565b9050919050565b60008154905061401f81613b09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261407a565b6140c1868361407a565b95508019841693508086168417925050509392505050565b60006140f46140ef6140ea8461322a565b6130cd565b61322a565b9050919050565b6000819050919050565b61410e836140d9565b61412261411a826140fb565b848454614087565b825550505050565b600090565b61413761412a565b614142818484614105565b505050565b5b818110156141665761415b60008261412f565b600181019050614148565b5050565b601f8211156141ab5761417c81614055565b6141858461406a565b81016020851015614194578190505b6141a86141a08561406a565b830182614147565b50505b505050565b600082821c905092915050565b60006141ce600019846008026141b0565b1980831691505092915050565b60006141e783836141bd565b9150826002028217905092915050565b8181036142055750506142dd565b61420e82614010565b67ffffffffffffffff81111561422757614226614026565b5b6142318254613b09565b61423c82828561416a565b6000601f83116001811461426b5760008415614259578287015490505b61426385826141db565b8655506142d6565b601f19841661427987614055565b965061428486614055565b60005b828110156142ac57848901548255600182019150600185019450602081019050614287565b868310156142c957848901546142c5601f8916826141bd565b8355505b6001600288020188555050505b5050505050505b565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e74427579600082015250565b6000614315602083613152565b9150614320826142df565b602082019050919050565b6000602082019050818103600083015261434481614308565b9050919050565b7f616d6f756e74206d757374206265203c3d206d61785478416d6f756e7453656c60008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006143a7602183613152565b91506143b28261434b565b604082019050919050565b600060208201905081810360008301526143d68161439a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061441b816131fe565b92915050565b600060208284031215614437576144366131f9565b5b60006144458482850161440c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448381613091565b82525050565b6000614495838361447a565b60208301905092915050565b6000602082019050919050565b60006144b98261444e565b6144c38185614459565b93506144ce8361446a565b8060005b838110156144ff5781516144e68882614489565b97506144f1836144a1565b9250506001810190506144d2565b5085935050505092915050565b600060a08201905061452160008301886133ad565b61452e6020830187613894565b818103604083015261454081866144ae565b905061454f60608301856130a3565b61455c60808301846133ad565b9695505050505050565b7f526563697069656e742063616e6e6f7420686f6c64206d6f7265207468616e2060008201527f6d617857616c6c6574416d6f756e740000000000000000000000000000000000602082015250565b60006145c2602f83613152565b91506145cd82614566565b604082019050919050565b600060208201905081810360008301526145f1816145b5565b905091905056fea2646970667358221220a2a311a16ca9accf0654552ab46f7dedc51a420753a4338d0ddf25f6b83bbff164736f6c63430008110033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : swap (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


Deployed Bytecode Sourcemap

32476:22649:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32957:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32909:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42332:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42953:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41550:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44248:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42024:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40799:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43307:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54401:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42136:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37899:586;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45506:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42527:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34048:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44490:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38610:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39347:1390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42631:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13092:103;;;;;;;;;;;;;:::i;:::-;;42427:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33032:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12444:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42231:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41117:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44729:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45733:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43127:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35582:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;54858:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33952:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38495:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34078:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44126:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33073:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42798:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43945:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35187:189;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;13350:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35385:188;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;40959:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32957:33;;;;;;;;;;;;;:::o;32909:41::-;;;;;;;;;;;;;:::o;42332:87::-;42369:13;42407:4;;;;;;;;;;;;;;;;;42400:11;;42332:87;:::o;42953:166::-;43028:4;43050:39;43059:12;:10;:12::i;:::-;43073:7;43082:6;43050:8;:39::i;:::-;43107:4;43100:11;;42953:166;;;;:::o;41550:464::-;12330:13;:11;:13::i;:::-;41649:18:::1;41670:16;;;;;;;;;;;41649:37;;41728:16;41702:43;;41716:10;41702:43;;;;;;;;;;;;41756:56;41788:16;;;;;;;;;;;41806:5;41756:31;:56::i;:::-;41898:16;41879;;:35;;;;;;;;;;;;;;;;;;41925:55;41957:16;;;;;;;;;;;41975:4;41925:31;:55::i;:::-;41638:376;41550:464:::0;:::o;44248:234::-;12330:13;:11;:13::i;:::-;44401:10:::1;44357:26;:41;44384:13;44357:41;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;44463:10;44427:47;;;44448:13;44427:47;;;;;;:::i;:::-;;;;;;;;44248:234:::0;;:::o;42024:104::-;42077:7;42109:11;;42102:18;;42024:104;:::o;40799:152::-;12330:13;:11;:13::i;:::-;40933:10:::1;40903:22;:27;40926:3;40903:27;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;40799:152:::0;;:::o;43307:445::-;43405:4;43427:24;43454:30;43464:6;43471:12;:10;:12::i;:::-;43454:9;:30::i;:::-;43427:57;;43523:6;43503:16;:26;;43495:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;43585:36;43595:6;43603:9;43614:6;43585:9;:36::i;:::-;43656:57;43665:6;43673:12;:10;:12::i;:::-;43706:6;43687:16;:25;43656:8;:57::i;:::-;43740:4;43733:11;;;43307:445;;;;;:::o;54401:266::-;54480:7;54536:18;;54513:19;:41;;54505:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54640:19;:17;:19::i;:::-;54618;:41;;;;:::i;:::-;54611:48;;54401:266;;;:::o;42136:87::-;42177:5;32688:2;42200:15;;42136:87;:::o;37899:586::-;12330:13;:11;:13::i;:::-;38035:6:::1;38032:446;;;38091:9;38067:11;:21;;:33;;;;38142:6;38115:11;:24;;:33;;;;38192:6;38163:11;:26;;:35;;;;38240:5;38213:11;:24;;:32;;;;38032:446;;;38318:9;38296;:19;;:31;;;;38367:6;38342:9;:22;;:31;;;;38415:6;38388:9;:24;;:33;;;;38461:5;38436:9;:22;;:30;;;;38032:446;37899:586:::0;;;;;:::o;45506:219::-;45594:4;45616:79;45625:12;:10;:12::i;:::-;45639:7;45684:10;45648;:24;45659:12;:10;:12::i;:::-;45648:24;;;;;;;;;;;;;;;:33;45673:7;45648:33;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;45616:8;:79::i;:::-;45713:4;45706:11;;45506:219;;;;:::o;42527:96::-;42569:7;42601:14;;42594:21;;42527:96;:::o;34048:23::-;;;;:::o;44490:152::-;44564:4;44593:26;:41;44620:13;44593:41;;;;;;;;;;;;;;;;;;;;;;;;;44586:48;;44490:152;;;:::o;38610:108::-;12330:13;:11;:13::i;:::-;38701:9:::1;38687:11;:23;;;;38610:108:::0;:::o;39347:1390::-;39400:15;39453:3;39446;39419:24;39437:4;39419:9;:24::i;:::-;:30;;;;:::i;:::-;39418:38;;;;:::i;:::-;39400:56;;39482:1;39472:7;:11;39469:1261;;;39509:19;39561:3;39542:17;;39532:7;:27;;;;:::i;:::-;39531:33;;;;:::i;:::-;39509:55;;39579:26;39622:1;39608:11;:15;;;;:::i;:::-;39579:44;;39638:20;39671:18;39661:7;:28;;;;:::i;:::-;39638:51;;39706:30;39723:12;39706:16;:30::i;:::-;39751:23;39777:21;39751:47;;39815:16;39873:3;39853:18;;39835:15;:36;;;;:::i;:::-;39834:42;;;;:::i;:::-;39815:61;;39891:16;39955:3;39929:24;;39911:15;:42;;;;:::i;:::-;39910:48;;;;:::i;:::-;39891:67;;39975:10;;;;;;;;;;;:19;;:29;39995:8;39975:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40019:16;;;;;;;;;;;:25;;:35;40045:8;40019:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40071:11;40085:21;40071:35;;40123:15;;;;;;;;;;;:31;;;40162:21;40211:4;40235:18;40272:1;40319;40366:10;;;;;;;;;;;40395:15;40123:302;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;40489:1;40444:29;:42;;:46;;;;40544:1;40505:29;:36;;:40;;;;40605:1;40560:29;:42;;:46;;;;40639:18;40623:12;;:34;;;;;;;:::i;:::-;;;;;;;;40679:39;40694:18;40714:3;40679:39;;;;;;;:::i;:::-;;;;;;;;39494:1236;;;;;;;39469:1261;39389:1348;39347:1390;:::o;38726:102::-;12330:13;:11;:13::i;:::-;38813:7:::1;38800:10;:20;;;;38726:102:::0;:::o;42631:159::-;42697:7;42729:53;42749:23;:32;42773:7;42749:32;;;;;;;;;;;;;;;;42729:19;:53::i;:::-;42722:60;;42631:159;;;:::o;13092:103::-;12330:13;:11;:13::i;:::-;13157:30:::1;13184:1;13157:18;:30::i;:::-;13092:103::o:0;42427:90::-;42470:7;42502;:5;:7::i;:::-;42495:14;;42427:90;:::o;33032:34::-;;;;:::o;12444:87::-;12490:7;12517:6;;;;;;;;;;;12510:13;;12444:87;:::o;42231:91::-;42270:13;42308:6;;;;;;;;;;;;;;;;;42301:13;;42231:91;:::o;41117:425::-;12330:13;:11;:13::i;:::-;41207:18:::1;41228:10;;;;;;;;;;;41207:31;;41280:13;41254:40;;41268:10;41254:40;;;;;;;;;;;;41305:50;41337:10;;;;;;;;;;;41349:5;41305:31;:50::i;:::-;41435:13;41422:10;;:26;;;;;;;;;;;;;;;;;;41459:49;41491:10;;;;;;;;;;;41503:4;41459:31;:49::i;:::-;41196:346;41117:425:::0;:::o;44729:376::-;12330:13;:11;:13::i;:::-;44873:5:::1;44837:41;;:25;:32;44863:5;44837:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;::::0;44828:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44984:5;44949:25;:32;44975:5;44949:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;45000;45027:5;45034;45000:26;:40::i;:::-;45091:5;45056:41;;45084:5;45056:41;;;;;;;;;;;;44729:376:::0;;:::o;45733:410::-;45826:4;45848:24;45875:10;:24;45886:12;:10;:12::i;:::-;45875:24;;;;;;;;;;;;;;;:33;45900:7;45875:33;;;;;;;;;;;;;;;;45848:60;;45947:15;45927:16;:35;;45919:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46037:67;46046:12;:10;:12::i;:::-;46060:7;46088:15;46069:16;:34;46037:8;:67::i;:::-;46131:4;46124:11;;;45733:410;;;;:::o;43127:172::-;43205:4;43227:42;43237:12;:10;:12::i;:::-;43251:9;43262:6;43227:9;:42::i;:::-;43287:4;43280:11;;43127:172;;;;:::o;35582:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54858:166::-;12330:13;:11;:13::i;:::-;54954:8:::1;54940:11;;:22;;;;;;;;;;;;;;;;;;54978:38;55007:8;54978:38;;;;;;:::i;:::-;;;;;;;;54858:166:::0;:::o;33952:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;38495:107::-;12330:13;:11;:13::i;:::-;38584:10:::1;38574:7;:20;;;;38495:107:::0;:::o;34078:27::-;;;;:::o;44126:114::-;44184:4;44213;:19;44218:13;44213:19;;;;;;;;;;;;;;;;;;;;;;;;;44206:26;;44126:114;;;:::o;33073:31::-;;;;:::o;42798:147::-;42879:7;42911:10;:17;42922:5;42911:17;;;;;;;;;;;;;;;:26;42929:7;42911:26;;;;;;;;;;;;;;;;42904:33;;42798:147;;;;:::o;43945:173::-;12330:13;:11;:13::i;:::-;44052:5:::1;44030:4;:19;44035:13;44030:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;44104:5;44073:37;;;44089:13;44073:37;;;;;;:::i;:::-;;;;;;;;43945:173:::0;;:::o;35187:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13350:201::-;12330:13;:11;:13::i;:::-;13459:1:::1;13439:22;;:8;:22;;::::0;13431:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:28;13534:8;13515:18;:28::i;:::-;13350:201:::0;:::o;35385:188::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40959:150::-;41035:4;41064:22;:37;41087:13;41064:37;;;;;;;;;;;;;;;;;;;;;;;;;41057:44;;40959:150;;;:::o;11155:98::-;11208:7;11235:10;11228:17;;11155:98;:::o;45159:339::-;45274:1;45257:19;;:5;:19;;;45249:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45355:1;45336:21;;:7;:21;;;45328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45436:6;45407:10;:17;45418:5;45407:17;;;;;;;;;;;;;;;:26;45425:7;45407:26;;;;;;;;;;;;;;;:35;;;;45474:7;45458:32;;45467:5;45458:32;;;45483:6;45458:32;;;;;;:::i;:::-;;;;;;;;45159:339;;;:::o;12609:132::-;12684:12;:10;:12::i;:::-;12673:23;;:7;:5;:7::i;:::-;:23;;;12665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12609:132::o;46188:2158::-;46300:1;46277:19;;:24;:57;;;;;46305:25;:29;46331:2;46305:29;;;;;;;;;;;;;;;;;;;;;;;;;46277:57;46273:133;;;46382:12;46360:19;:34;;;;46273:133;46442:1;46426:18;;:4;:18;;;46418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46519:1;46505:16;;:2;:16;;;46497:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46581:11;46587:4;46581:5;:11::i;:::-;46580:12;46572:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46657:1;46648:6;:10;46640:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46733:15;46743:4;46733:9;:15::i;:::-;46723:6;:25;;46715:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46815:12;46833:29;46857:4;46833:23;:29::i;:::-;:60;;;;46866:27;46890:2;46866:23;:27::i;:::-;46833:60;46831:63;46815:79;;46911:7;46907:993;;;47001:25;:31;47027:4;47001:31;;;;;;;;;;;;;;;;;;;;;;;;;46997:892;;;47146:12;;47124:19;;:34;;;;:::i;:::-;47109:12;:49;47105:132;;;47200:17;47208:2;47212:4;47200:7;:17::i;:::-;47105:132;47414:11;47389:22;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;47462:10;;47452:6;:20;;47444:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46997:892;;;47779:9;47754:22;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;47825:11;;47815:6;:21;;47807:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46997:892;46907:993;48006:6;;;;;;;;;;;48005:7;:56;;;;;48030:25;:31;48056:4;48030:31;;;;;;;;;;;;;;;;;;;;;;;;;48029:32;48005:56;:84;;;;;48078:11;;;;;;;;;;;48005:84;:116;;;;;48114:7;:5;:7::i;:::-;48106:15;;:4;:15;;;;48005:116;:147;;;;;48145:7;:5;:7::i;:::-;48139:13;;:2;:13;;;;48005:147;:196;;;;;48185:15;;;;;;;;;;;48169:32;;:4;:32;;;;48005:196;47987:298;;;48257:16;:14;:16::i;:::-;47987:298;48297:41;48312:4;48318:2;48322:6;48330:7;48297:14;:41::i;:::-;46262:2084;46188:2158;;;:::o;54675:125::-;54726:7;54779:13;:11;:13::i;:::-;54758:18;;:34;;;;:::i;:::-;54751:41;;54675:125;:::o;38836:503::-;38951:21;38989:1;38975:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38951:40;;39020:4;39002;39007:1;39002:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;39046:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39036:4;39041:1;39036:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;39107:15;;;;;;;;;;;:66;;;39188:11;39214:1;39258:4;39285;39305:15;39107:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38896:443;38836:503;:::o;13711:191::-;13785:16;13804:6;;;;;;;;;;;13785:25;;13830:8;13821:6;;:17;;;;;;;;;;;;;;;;;;13885:8;13854:40;;13875:8;13854:40;;;;;;;;;;;;13774:128;13711:191;:::o;52935:1458::-;34331:4;34322:6;;:13;;;;;;;;;;;;;;;;;;53065:1:::1;53038:24;53056:4;53038:9;:24::i;:::-;:28;53035:1351;;;53092:20;53160:1;53115:29;:42;;;:46;;;;:::i;:::-;53092:69;;53176:26;53250:12;53205:29;:42;;;:57;;;;:::i;:::-;53176:86;;53279:114;53380:12;53335:29;:42;;;53296:29;:36;;;:81;;;;:::i;:::-;:96;;;;:::i;:::-;53279:16;:114::i;:::-;53410:23;53436:21;53410:47;;53472:16;53529:3;53509:18;;53492:15;:35;;;;:::i;:::-;53491:41;;;;:::i;:::-;53472:60;;53547:16;53611:3;53585:24;;53567:15;:42;;;;:::i;:::-;53566:48;;;;:::i;:::-;53547:67;;53631:10;;;;;;;;;;;:19;;:29;53651:8;53631:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53675:16;;;;;;;;;;;:25;;:35;53701:8;53675:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53727:11;53741:21;53727:35;;53779:15;;;;;;;;;;;:31;;;53818:21;53867:4;53891:18;53928:1;53975::::0;54022:10:::1;;;;;;;;;;;54051:15;53779:302;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;54143:1;54098:29;:42;;:46;;;;54198:1;54159:29;:36;;:40;;;;54259:1;54214:29;:42;;:46;;;;54293:18;54277:12;;:34;;;;;;;:::i;:::-;;;;;;;;54335:39;54350:18;54370:3;54335:39;;;;;;;:::i;:::-;;;;;;;;53077:1309;;;;;;53035:1351;34367:5:::0;34358:6;;:14;;;;;;;;;;;;;;;;;;52935:1458::o;48428:1664::-;48551:20;48582:34;48627:33;48671;48715:41;48760:57;48794:13;48809:7;48760:33;:57::i;:::-;48550:267;;;;;;;;;;48930:26;:37;48957:9;48930:37;;;;;;;;;;;;;;;;;;;;;;;;;:102;;;;49025:7;;49008:12;48985:20;48995:9;48985;:20::i;:::-;:35;;;;:::i;:::-;48984:48;;48930:102;48922:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;49291:26;49256:23;:31;49280:6;49256:31;;;;;;;;;;;;;;;;:61;;;;;;;:::i;:::-;;;;;;;;49366:25;49328:23;:34;49352:9;49328:34;;;;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;;;;;49408:7;49404:615;;;49465:18;:33;;;49443:18;;:55;;;;;;;:::i;:::-;;;;;;;;49525:10;:25;;;49513:8;;:37;;;;;;;:::i;:::-;;;;;;;;49567:45;49581:10;49593:18;49567:13;:45::i;:::-;49677:10;:18;;;49659:14;;:36;;;;;;;:::i;:::-;;;;;;;;49750:18;:26;;;49710:23;:36;49734:11;;;;;;;;;;;49710:36;;;;;;;;;;;;;;;;:66;;;;;;;:::i;:::-;;;;;;;;49895:11;;;;;;;;;;;49871:56;;49888:4;49871:56;;;49908:10;:18;;;49871:56;;;;;;:::i;:::-;;;;;;;;49972:4;49947:60;;49956:6;49947:60;;;49979:10;:27;;;49947:60;;;;;;:::i;:::-;;;;;;;;49404:615;50060:9;50043:41;;50052:6;50043:41;;;50071:12;50043:41;;;;;;:::i;:::-;;;;;;;;48537:1555;;;;;48428:1664;;;;:::o;50100:685::-;50220:20;50251:34;50296:33;50340;;:::i;:::-;50384:41;;:::i;:::-;50478:67;50513:13;50528:16;50478:34;:67::i;:::-;50443:102;;;;;;;;50587:10;:19;;;50571:13;:35;;;;:::i;:::-;50556:50;;50663:19;:17;:19::i;:::-;50647:13;:35;;;;:::i;:::-;50617:65;;50750:18;:27;;;50721:26;:56;;;;:::i;:::-;50693:84;;50100:685;;;;;;;;:::o;52487:436::-;52651:17;:34;;;52609:23;:38;52641:4;52609:38;;;;;;;;;;;;;;;;:76;;;;;;;:::i;:::-;;;;;;;;52744:8;:21;;;52698:29;:42;;;:67;;;;;;;:::i;:::-;;;;;;;;52818:8;:15;;;52778:29;:36;;;:55;;;;;;;:::i;:::-;;;;;;;;52892:8;:21;;;52846:29;:42;;;:67;;;;;;;:::i;:::-;;;;;;;;52487:436;;:::o;50795:1684::-;50898:31;;:::i;:::-;50931:40;;:::i;:::-;50993:7;50989:1483;;;51026:19;51048;:17;:19::i;:::-;51026:41;;51200:3;51164:22;:32;;;51148:13;:48;;;;:::i;:::-;51147:56;;;;:::i;:::-;51121:8;:23;;:82;;;;;51289:3;51255:22;:30;;;51239:13;:46;;;;:::i;:::-;51238:54;;;;:::i;:::-;51218:8;:16;;:74;;;;;51384:3;51343:22;:37;;;51327:13;:53;;;;:::i;:::-;51326:61;;;;:::i;:::-;51307:8;:15;;:80;;;;;51483:3;51444:22;:35;;;51428:13;:51;;;;:::i;:::-;51427:59;;;;:::i;:::-;51402:8;:21;;:84;;;;;51582:3;51543:22;:35;;;51527:13;:51;;;;:::i;:::-;51526:59;;;;:::i;:::-;51501:8;:21;;:84;;;;;51764:8;:21;;;51740:8;:21;;;51722:8;:15;;;:39;;;;:::i;:::-;:63;;;;:::i;:::-;51694:8;:25;;:91;;;;;51865:8;:25;;;51846:8;:16;;;51820:8;:23;;;:42;;;;:::i;:::-;:70;;;;:::i;:::-;51800:8;:17;;:90;;;;;51968:11;51942:8;:23;;;:37;;;;:::i;:::-;51907:17;:32;;:72;;;;;52042:11;52023:8;:16;;;:30;;;;:::i;:::-;51994:17;:25;;:59;;;;;52115:11;52097:8;:15;;;:29;;;;:::i;:::-;52068:17;:24;;:58;;;;;52198:11;52174:8;:21;;;:35;;;;:::i;:::-;52141:17;:30;;:68;;;;;52281:11;52257:8;:21;;;:35;;;;:::i;:::-;52224:17;:30;;:68;;;;;52358:11;52338:8;:17;;;:31;;;;:::i;:::-;52309:17;:26;;:60;;;;;52449:11;52421:8;:25;;;:39;;;;:::i;:::-;52384:17;:34;;:76;;;;;51011:1461;50989:1483;50795:1684;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:60::-;621:3;642:5;635:12;;593:60;;;:::o;659:142::-;709:9;742:53;760:34;769:24;787:5;769:24;:::i;:::-;760:34;:::i;:::-;742:53;:::i;:::-;729:66;;659:142;;;:::o;807:126::-;857:9;890:37;921:5;890:37;:::i;:::-;877:50;;807:126;;;:::o;939:153::-;1016:9;1049:37;1080:5;1049:37;:::i;:::-;1036:50;;939:153;;;:::o;1098:185::-;1212:64;1270:5;1212:64;:::i;:::-;1207:3;1200:77;1098:185;;:::o;1289:276::-;1409:4;1447:2;1436:9;1432:18;1424:26;;1460:98;1555:1;1544:9;1540:17;1531:6;1460:98;:::i;:::-;1289:276;;;;:::o;1571:99::-;1623:6;1657:5;1651:12;1641:22;;1571:99;;;:::o;1676:169::-;1760:11;1794:6;1789:3;1782:19;1834:4;1829:3;1825:14;1810:29;;1676:169;;;;:::o;1851:246::-;1932:1;1942:113;1956:6;1953:1;1950:13;1942:113;;;2041:1;2036:3;2032:11;2026:18;2022:1;2017:3;2013:11;2006:39;1978:2;1975:1;1971:10;1966:15;;1942:113;;;2089:1;2080:6;2075:3;2071:16;2064:27;1913:184;1851:246;;;:::o;2103:102::-;2144:6;2195:2;2191:7;2186:2;2179:5;2175:14;2171:28;2161:38;;2103:102;;;:::o;2211:377::-;2299:3;2327:39;2360:5;2327:39;:::i;:::-;2382:71;2446:6;2441:3;2382:71;:::i;:::-;2375:78;;2462:65;2520:6;2515:3;2508:4;2501:5;2497:16;2462:65;:::i;:::-;2552:29;2574:6;2552:29;:::i;:::-;2547:3;2543:39;2536:46;;2303:285;2211:377;;;;:::o;2594:313::-;2707:4;2745:2;2734:9;2730:18;2722:26;;2794:9;2788:4;2784:20;2780:1;2769:9;2765:17;2758:47;2822:78;2895:4;2886:6;2822:78;:::i;:::-;2814:86;;2594:313;;;;:::o;2994:117::-;3103:1;3100;3093:12;3240:122;3313:24;3331:5;3313:24;:::i;:::-;3306:5;3303:35;3293:63;;3352:1;3349;3342:12;3293:63;3240:122;:::o;3368:139::-;3414:5;3452:6;3439:20;3430:29;;3468:33;3495:5;3468:33;:::i;:::-;3368:139;;;;:::o;3513:77::-;3550:7;3579:5;3568:16;;3513:77;;;:::o;3596:122::-;3669:24;3687:5;3669:24;:::i;:::-;3662:5;3659:35;3649:63;;3708:1;3705;3698:12;3649:63;3596:122;:::o;3724:139::-;3770:5;3808:6;3795:20;3786:29;;3824:33;3851:5;3824:33;:::i;:::-;3724:139;;;;:::o;3869:474::-;3937:6;3945;3994:2;3982:9;3973:7;3969:23;3965:32;3962:119;;;4000:79;;:::i;:::-;3962:119;4120:1;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4091:117;4247:2;4273:53;4318:7;4309:6;4298:9;4294:22;4273:53;:::i;:::-;4263:63;;4218:118;3869:474;;;;;:::o;4349:90::-;4383:7;4426:5;4419:13;4412:21;4401:32;;4349:90;;;:::o;4445:109::-;4526:21;4541:5;4526:21;:::i;:::-;4521:3;4514:34;4445:109;;:::o;4560:210::-;4647:4;4685:2;4674:9;4670:18;4662:26;;4698:65;4760:1;4749:9;4745:17;4736:6;4698:65;:::i;:::-;4560:210;;;;:::o;4776:104::-;4821:7;4850:24;4868:5;4850:24;:::i;:::-;4839:35;;4776:104;;;:::o;4886:138::-;4967:32;4993:5;4967:32;:::i;:::-;4960:5;4957:43;4947:71;;5014:1;5011;5004:12;4947:71;4886:138;:::o;5030:155::-;5084:5;5122:6;5109:20;5100:29;;5138:41;5173:5;5138:41;:::i;:::-;5030:155;;;;:::o;5191:345::-;5258:6;5307:2;5295:9;5286:7;5282:23;5278:32;5275:119;;;5313:79;;:::i;:::-;5275:119;5433:1;5458:61;5511:7;5502:6;5491:9;5487:22;5458:61;:::i;:::-;5448:71;;5404:125;5191:345;;;;:::o;5542:116::-;5612:21;5627:5;5612:21;:::i;:::-;5605:5;5602:32;5592:60;;5648:1;5645;5638:12;5592:60;5542:116;:::o;5664:133::-;5707:5;5745:6;5732:20;5723:29;;5761:30;5785:5;5761:30;:::i;:::-;5664:133;;;;:::o;5803:468::-;5868:6;5876;5925:2;5913:9;5904:7;5900:23;5896:32;5893:119;;;5931:79;;:::i;:::-;5893:119;6051:1;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6022:117;6178:2;6204:50;6246:7;6237:6;6226:9;6222:22;6204:50;:::i;:::-;6194:60;;6149:115;5803:468;;;;;:::o;6277:118::-;6364:24;6382:5;6364:24;:::i;:::-;6359:3;6352:37;6277:118;;:::o;6401:222::-;6494:4;6532:2;6521:9;6517:18;6509:26;;6545:71;6613:1;6602:9;6598:17;6589:6;6545:71;:::i;:::-;6401:222;;;;:::o;6629:619::-;6706:6;6714;6722;6771:2;6759:9;6750:7;6746:23;6742:32;6739:119;;;6777:79;;:::i;:::-;6739:119;6897:1;6922:53;6967:7;6958:6;6947:9;6943:22;6922:53;:::i;:::-;6912:63;;6868:117;7024:2;7050:53;7095:7;7086:6;7075:9;7071:22;7050:53;:::i;:::-;7040:63;;6995:118;7152:2;7178:53;7223:7;7214:6;7203:9;7199:22;7178:53;:::i;:::-;7168:63;;7123:118;6629:619;;;;;:::o;7254:329::-;7313:6;7362:2;7350:9;7341:7;7337:23;7333:32;7330:119;;;7368:79;;:::i;:::-;7330:119;7488:1;7513:53;7558:7;7549:6;7538:9;7534:22;7513:53;:::i;:::-;7503:63;;7459:117;7254:329;;;;:::o;7589:86::-;7624:7;7664:4;7657:5;7653:16;7642:27;;7589:86;;;:::o;7681:112::-;7764:22;7780:5;7764:22;:::i;:::-;7759:3;7752:35;7681:112;;:::o;7799:214::-;7888:4;7926:2;7915:9;7911:18;7903:26;;7939:67;8003:1;7992:9;7988:17;7979:6;7939:67;:::i;:::-;7799:214;;;;:::o;8019:905::-;8111:6;8119;8127;8135;8143;8192:3;8180:9;8171:7;8167:23;8163:33;8160:120;;;8199:79;;:::i;:::-;8160:120;8319:1;8344:53;8389:7;8380:6;8369:9;8365:22;8344:53;:::i;:::-;8334:63;;8290:117;8446:2;8472:53;8517:7;8508:6;8497:9;8493:22;8472:53;:::i;:::-;8462:63;;8417:118;8574:2;8600:53;8645:7;8636:6;8625:9;8621:22;8600:53;:::i;:::-;8590:63;;8545:118;8702:2;8728:53;8773:7;8764:6;8753:9;8749:22;8728:53;:::i;:::-;8718:63;;8673:118;8830:3;8857:50;8899:7;8890:6;8879:9;8875:22;8857:50;:::i;:::-;8847:60;;8801:116;8019:905;;;;;;;;:::o;8930:329::-;8989:6;9038:2;9026:9;9017:7;9013:23;9009:32;9006:119;;;9044:79;;:::i;:::-;9006:119;9164:1;9189:53;9234:7;9225:6;9214:9;9210:22;9189:53;:::i;:::-;9179:63;;9135:117;8930:329;;;;:::o;9265:866::-;9518:4;9556:3;9545:9;9541:19;9533:27;;9570:71;9638:1;9627:9;9623:17;9614:6;9570:71;:::i;:::-;9651:72;9719:2;9708:9;9704:18;9695:6;9651:72;:::i;:::-;9733;9801:2;9790:9;9786:18;9777:6;9733:72;:::i;:::-;9815;9883:2;9872:9;9868:18;9859:6;9815:72;:::i;:::-;9897:73;9965:3;9954:9;9950:19;9941:6;9897:73;:::i;:::-;10018:9;10012:4;10008:20;10002:3;9991:9;9987:19;9980:49;10046:78;10119:4;10110:6;10046:78;:::i;:::-;10038:86;;9265:866;;;;;;;;;:::o;10137:323::-;10193:6;10242:2;10230:9;10221:7;10217:23;10213:32;10210:119;;;10248:79;;:::i;:::-;10210:119;10368:1;10393:50;10435:7;10426:6;10415:9;10411:22;10393:50;:::i;:::-;10383:60;;10339:114;10137:323;;;;:::o;10466:474::-;10534:6;10542;10591:2;10579:9;10570:7;10566:23;10562:32;10559:119;;;10597:79;;:::i;:::-;10559:119;10717:1;10742:53;10787:7;10778:6;10767:9;10763:22;10742:53;:::i;:::-;10732:63;;10688:117;10844:2;10870:53;10915:7;10906:6;10895:9;10891:22;10870:53;:::i;:::-;10860:63;;10815:118;10466:474;;;;;:::o;10946:227::-;11086:34;11082:1;11074:6;11070:14;11063:58;11155:10;11150:2;11142:6;11138:15;11131:35;10946:227;:::o;11179:366::-;11321:3;11342:67;11406:2;11401:3;11342:67;:::i;:::-;11335:74;;11418:93;11507:3;11418:93;:::i;:::-;11536:2;11531:3;11527:12;11520:19;;11179:366;;;:::o;11551:419::-;11717:4;11755:2;11744:9;11740:18;11732:26;;11804:9;11798:4;11794:20;11790:1;11779:9;11775:17;11768:47;11832:131;11958:4;11832:131;:::i;:::-;11824:139;;11551:419;;;:::o;11976:229::-;12116:34;12112:1;12104:6;12100:14;12093:58;12185:12;12180:2;12172:6;12168:15;12161:37;11976:229;:::o;12211:366::-;12353:3;12374:67;12438:2;12433:3;12374:67;:::i;:::-;12367:74;;12450:93;12539:3;12450:93;:::i;:::-;12568:2;12563:3;12559:12;12552:19;;12211:366;;;:::o;12583:419::-;12749:4;12787:2;12776:9;12772:18;12764:26;;12836:9;12830:4;12826:20;12822:1;12811:9;12807:17;12800:47;12864:131;12990:4;12864:131;:::i;:::-;12856:139;;12583:419;;;:::o;13008:180::-;13056:77;13053:1;13046:88;13153:4;13150:1;13143:15;13177:4;13174:1;13167:15;13194:180;13242:77;13239:1;13232:88;13339:4;13336:1;13329:15;13363:4;13360:1;13353:15;13380:185;13420:1;13437:20;13455:1;13437:20;:::i;:::-;13432:25;;13471:20;13489:1;13471:20;:::i;:::-;13466:25;;13510:1;13500:35;;13515:18;;:::i;:::-;13500:35;13557:1;13554;13550:9;13545:14;;13380:185;;;;:::o;13571:191::-;13611:3;13630:20;13648:1;13630:20;:::i;:::-;13625:25;;13664:20;13682:1;13664:20;:::i;:::-;13659:25;;13707:1;13704;13700:9;13693:16;;13728:3;13725:1;13722:10;13719:36;;;13735:18;;:::i;:::-;13719:36;13571:191;;;;:::o;13768:410::-;13808:7;13831:20;13849:1;13831:20;:::i;:::-;13826:25;;13865:20;13883:1;13865:20;:::i;:::-;13860:25;;13920:1;13917;13913:9;13942:30;13960:11;13942:30;:::i;:::-;13931:41;;14121:1;14112:7;14108:15;14105:1;14102:22;14082:1;14075:9;14055:83;14032:139;;14151:18;;:::i;:::-;14032:139;13816:362;13768:410;;;;:::o;14184:194::-;14224:4;14244:20;14262:1;14244:20;:::i;:::-;14239:25;;14278:20;14296:1;14278:20;:::i;:::-;14273:25;;14322:1;14319;14315:9;14307:17;;14346:1;14340:4;14337:11;14334:37;;;14351:18;;:::i;:::-;14334:37;14184:194;;;;:::o;14384:85::-;14429:7;14458:5;14447:16;;14384:85;;;:::o;14475:158::-;14533:9;14566:61;14584:42;14593:32;14619:5;14593:32;:::i;:::-;14584:42;:::i;:::-;14566:61;:::i;:::-;14553:74;;14475:158;;;:::o;14639:147::-;14734:45;14773:5;14734:45;:::i;:::-;14729:3;14722:58;14639:147;;:::o;14792:134::-;14850:9;14883:37;14914:5;14883:37;:::i;:::-;14870:50;;14792:134;;;:::o;14932:147::-;15027:45;15066:5;15027:45;:::i;:::-;15022:3;15015:58;14932:147;;:::o;15085:823::-;15342:4;15380:3;15369:9;15365:19;15357:27;;15394:71;15462:1;15451:9;15447:17;15438:6;15394:71;:::i;:::-;15475:72;15543:2;15532:9;15528:18;15519:6;15475:72;:::i;:::-;15557:80;15633:2;15622:9;15618:18;15609:6;15557:80;:::i;:::-;15647;15723:2;15712:9;15708:18;15699:6;15647:80;:::i;:::-;15737:81;15813:3;15802:9;15798:19;15789:6;15737:81;:::i;:::-;15828:73;15896:3;15885:9;15881:19;15872:6;15828:73;:::i;:::-;15085:823;;;;;;;;;:::o;15914:143::-;15971:5;16002:6;15996:13;15987:22;;16018:33;16045:5;16018:33;:::i;:::-;15914:143;;;;:::o;16063:663::-;16151:6;16159;16167;16216:2;16204:9;16195:7;16191:23;16187:32;16184:119;;;16222:79;;:::i;:::-;16184:119;16342:1;16367:64;16423:7;16414:6;16403:9;16399:22;16367:64;:::i;:::-;16357:74;;16313:128;16480:2;16506:64;16562:7;16553:6;16542:9;16538:22;16506:64;:::i;:::-;16496:74;;16451:129;16619:2;16645:64;16701:7;16692:6;16681:9;16677:22;16645:64;:::i;:::-;16635:74;;16590:129;16063:663;;;;;:::o;16732:332::-;16853:4;16891:2;16880:9;16876:18;16868:26;;16904:71;16972:1;16961:9;16957:17;16948:6;16904:71;:::i;:::-;16985:72;17053:2;17042:9;17038:18;17029:6;16985:72;:::i;:::-;16732:332;;;;;:::o;17070:243::-;17210:34;17206:1;17198:6;17194:14;17187:58;17279:26;17274:2;17266:6;17262:15;17255:51;17070:243;:::o;17319:366::-;17461:3;17482:67;17546:2;17541:3;17482:67;:::i;:::-;17475:74;;17558:93;17647:3;17558:93;:::i;:::-;17676:2;17671:3;17667:12;17660:19;;17319:366;;;:::o;17691:419::-;17857:4;17895:2;17884:9;17880:18;17872:26;;17944:9;17938:4;17934:20;17930:1;17919:9;17915:17;17908:47;17972:131;18098:4;17972:131;:::i;:::-;17964:139;;17691:419;;;:::o;18116:224::-;18256:34;18252:1;18244:6;18240:14;18233:58;18325:7;18320:2;18312:6;18308:15;18301:32;18116:224;:::o;18346:366::-;18488:3;18509:67;18573:2;18568:3;18509:67;:::i;:::-;18502:74;;18585:93;18674:3;18585:93;:::i;:::-;18703:2;18698:3;18694:12;18687:19;;18346:366;;;:::o;18718:419::-;18884:4;18922:2;18911:9;18907:18;18899:26;;18971:9;18965:4;18961:20;18957:1;18946:9;18942:17;18935:47;18999:131;19125:4;18999:131;:::i;:::-;18991:139;;18718:419;;;:::o;19143:180::-;19191:77;19188:1;19181:88;19288:4;19285:1;19278:15;19312:4;19309:1;19302:15;19329:320;19373:6;19410:1;19404:4;19400:12;19390:22;;19457:1;19451:4;19447:12;19478:18;19468:81;;19534:4;19526:6;19522:17;19512:27;;19468:81;19596:2;19588:6;19585:14;19565:18;19562:38;19559:84;;19615:18;;:::i;:::-;19559:84;19380:269;19329:320;;;:::o;19655:225::-;19795:34;19791:1;19783:6;19779:14;19772:58;19864:8;19859:2;19851:6;19847:15;19840:33;19655:225;:::o;19886:366::-;20028:3;20049:67;20113:2;20108:3;20049:67;:::i;:::-;20042:74;;20125:93;20214:3;20125:93;:::i;:::-;20243:2;20238:3;20234:12;20227:19;;19886:366;;;:::o;20258:419::-;20424:4;20462:2;20451:9;20447:18;20439:26;;20511:9;20505:4;20501:20;20497:1;20486:9;20482:17;20475:47;20539:131;20665:4;20539:131;:::i;:::-;20531:139;;20258:419;;;:::o;20683:223::-;20823:34;20819:1;20811:6;20807:14;20800:58;20892:6;20887:2;20879:6;20875:15;20868:31;20683:223;:::o;20912:366::-;21054:3;21075:67;21139:2;21134:3;21075:67;:::i;:::-;21068:74;;21151:93;21240:3;21151:93;:::i;:::-;21269:2;21264:3;21260:12;21253:19;;20912:366;;;:::o;21284:419::-;21450:4;21488:2;21477:9;21473:18;21465:26;;21537:9;21531:4;21527:20;21523:1;21512:9;21508:17;21501:47;21565:131;21691:4;21565:131;:::i;:::-;21557:139;;21284:419;;;:::o;21709:221::-;21849:34;21845:1;21837:6;21833:14;21826:58;21918:4;21913:2;21905:6;21901:15;21894:29;21709:221;:::o;21936:366::-;22078:3;22099:67;22163:2;22158:3;22099:67;:::i;:::-;22092:74;;22175:93;22264:3;22175:93;:::i;:::-;22293:2;22288:3;22284:12;22277:19;;21936:366;;;:::o;22308:419::-;22474:4;22512:2;22501:9;22497:18;22489:26;;22561:9;22555:4;22551:20;22547:1;22536:9;22532:17;22525:47;22589:131;22715:4;22589:131;:::i;:::-;22581:139;;22308:419;;;:::o;22733:182::-;22873:34;22869:1;22861:6;22857:14;22850:58;22733:182;:::o;22921:366::-;23063:3;23084:67;23148:2;23143:3;23084:67;:::i;:::-;23077:74;;23160:93;23249:3;23160:93;:::i;:::-;23278:2;23273:3;23269:12;23262:19;;22921:366;;;:::o;23293:419::-;23459:4;23497:2;23486:9;23482:18;23474:26;;23546:9;23540:4;23536:20;23532:1;23521:9;23517:17;23510:47;23574:131;23700:4;23574:131;:::i;:::-;23566:139;;23293:419;;;:::o;23718:224::-;23858:34;23854:1;23846:6;23842:14;23835:58;23927:7;23922:2;23914:6;23910:15;23903:32;23718:224;:::o;23948:366::-;24090:3;24111:67;24175:2;24170:3;24111:67;:::i;:::-;24104:74;;24187:93;24276:3;24187:93;:::i;:::-;24305:2;24300:3;24296:12;24289:19;;23948:366;;;:::o;24320:419::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:222::-;24885:34;24881:1;24873:6;24869:14;24862:58;24954:5;24949:2;24941:6;24937:15;24930:30;24745:222;:::o;24973:366::-;25115:3;25136:67;25200:2;25195:3;25136:67;:::i;:::-;25129:74;;25212:93;25301:3;25212:93;:::i;:::-;25330:2;25325:3;25321:12;25314:19;;24973:366;;;:::o;25345:419::-;25511:4;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25345:419;;;:::o;25770:182::-;25910:34;25906:1;25898:6;25894:14;25887:58;25770:182;:::o;25958:366::-;26100:3;26121:67;26185:2;26180:3;26121:67;:::i;:::-;26114:74;;26197:93;26286:3;26197:93;:::i;:::-;26315:2;26310:3;26306:12;26299:19;;25958:366;;;:::o;26330:419::-;26496:4;26534:2;26523:9;26519:18;26511:26;;26583:9;26577:4;26573:20;26569:1;26558:9;26554:17;26547:47;26611:131;26737:4;26611:131;:::i;:::-;26603:139;;26330:419;;;:::o;26755:228::-;26895:34;26891:1;26883:6;26879:14;26872:58;26964:11;26959:2;26951:6;26947:15;26940:36;26755:228;:::o;26989:366::-;27131:3;27152:67;27216:2;27211:3;27152:67;:::i;:::-;27145:74;;27228:93;27317:3;27228:93;:::i;:::-;27346:2;27341:3;27337:12;27330:19;;26989:366;;;:::o;27361:419::-;27527:4;27565:2;27554:9;27550:18;27542:26;;27614:9;27608:4;27604:20;27600:1;27589:9;27585:17;27578:47;27642:131;27768:4;27642:131;:::i;:::-;27634:139;;27361:419;;;:::o;27786:236::-;27926:34;27922:1;27914:6;27910:14;27903:58;27995:19;27990:2;27982:6;27978:15;27971:44;27786:236;:::o;28028:366::-;28170:3;28191:67;28255:2;28250:3;28191:67;:::i;:::-;28184:74;;28267:93;28356:3;28267:93;:::i;:::-;28385:2;28380:3;28376:12;28369:19;;28028:366;;;:::o;28400:419::-;28566:4;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:131;28807:4;28681:131;:::i;:::-;28673:139;;28400:419;;;:::o;28825:149::-;28874:6;28908:5;28902:12;28892:22;;28934:33;28960:6;28934:33;:::i;:::-;28924:43;;28825:149;;;:::o;28980:180::-;29028:77;29025:1;29018:88;29125:4;29122:1;29115:15;29149:4;29146:1;29139:15;29166:141;29215:4;29238:3;29230:11;;29261:3;29258:1;29251:14;29295:4;29292:1;29282:18;29274:26;;29166:141;;;:::o;29313:93::-;29350:6;29397:2;29392;29385:5;29381:14;29377:23;29367:33;;29313:93;;;:::o;29412:107::-;29456:8;29506:5;29500:4;29496:16;29475:37;;29412:107;;;;:::o;29525:393::-;29594:6;29644:1;29632:10;29628:18;29667:97;29697:66;29686:9;29667:97;:::i;:::-;29785:39;29815:8;29804:9;29785:39;:::i;:::-;29773:51;;29857:4;29853:9;29846:5;29842:21;29833:30;;29906:4;29896:8;29892:19;29885:5;29882:30;29872:40;;29601:317;;29525:393;;;;;:::o;29924:142::-;29974:9;30007:53;30025:34;30034:24;30052:5;30034:24;:::i;:::-;30025:34;:::i;:::-;30007:53;:::i;:::-;29994:66;;29924:142;;;:::o;30072:75::-;30115:3;30136:5;30129:12;;30072:75;;;:::o;30153:269::-;30263:39;30294:7;30263:39;:::i;:::-;30324:91;30373:41;30397:16;30373:41;:::i;:::-;30365:6;30358:4;30352:11;30324:91;:::i;:::-;30318:4;30311:105;30229:193;30153:269;;;:::o;30428:73::-;30473:3;30428:73;:::o;30507:189::-;30584:32;;:::i;:::-;30625:65;30683:6;30675;30669:4;30625:65;:::i;:::-;30560:136;30507:189;;:::o;30702:186::-;30762:120;30779:3;30772:5;30769:14;30762:120;;;30833:39;30870:1;30863:5;30833:39;:::i;:::-;30806:1;30799:5;30795:13;30786:22;;30762:120;;;30702:186;;:::o;30894:543::-;30995:2;30990:3;30987:11;30984:446;;;31029:38;31061:5;31029:38;:::i;:::-;31113:29;31131:10;31113:29;:::i;:::-;31103:8;31099:44;31296:2;31284:10;31281:18;31278:49;;;31317:8;31302:23;;31278:49;31340:80;31396:22;31414:3;31396:22;:::i;:::-;31386:8;31382:37;31369:11;31340:80;:::i;:::-;30999:431;;30984:446;30894:543;;;:::o;31443:117::-;31497:8;31547:5;31541:4;31537:16;31516:37;;31443:117;;;;:::o;31566:169::-;31610:6;31643:51;31691:1;31687:6;31679:5;31676:1;31672:13;31643:51;:::i;:::-;31639:56;31724:4;31718;31714:15;31704:25;;31617:118;31566:169;;;;:::o;31740:295::-;31816:4;31962:29;31987:3;31981:4;31962:29;:::i;:::-;31954:37;;32024:3;32021:1;32017:11;32011:4;32008:21;32000:29;;31740:295;;;;:::o;32040:1451::-;32151:3;32145:4;32142:13;32139:26;;32158:5;;;;32139:26;32189:34;32219:3;32189:34;:::i;:::-;32288:18;32280:6;32277:30;32274:56;;;32310:18;;:::i;:::-;32274:56;32354:38;32386:4;32380:11;32354:38;:::i;:::-;32439:67;32499:6;32491;32485:4;32439:67;:::i;:::-;32533:1;32562:2;32554:6;32551:14;32579:1;32574:672;;;;33290:1;33307:6;33304:77;;;33356:9;33351:3;33347:19;33341:26;33332:35;;33304:77;33407:67;33467:6;33460:5;33407:67;:::i;:::-;33401:4;33394:81;33263:222;32544:941;;32574:672;32626:4;32622:9;32614:6;32610:22;32652:36;32684:3;32652:36;:::i;:::-;32645:43;;32715:37;32747:4;32715:37;:::i;:::-;32774:1;32788:207;32802:7;32799:1;32796:14;32788:207;;;32881:9;32876:3;32872:19;32866:26;32858:6;32851:42;32932:1;32924:6;32920:14;32910:24;;32979:1;32968:9;32964:17;32951:30;;32825:4;32822:1;32818:12;32813:17;;32788:207;;;33023:6;33014:7;33011:19;33008:179;;;33081:9;33076:3;33072:19;33066:26;33124:48;33166:4;33158:6;33154:17;33143:9;33124:48;:::i;:::-;33116:6;33109:64;33031:156;33008:179;33233:1;33229;33221:6;33217:14;33213:22;33207:4;33200:36;32581:665;;;32544:941;;32129:1362;;;32040:1451;;;:::o;33497:182::-;33637:34;33633:1;33625:6;33621:14;33614:58;33497:182;:::o;33685:366::-;33827:3;33848:67;33912:2;33907:3;33848:67;:::i;:::-;33841:74;;33924:93;34013:3;33924:93;:::i;:::-;34042:2;34037:3;34033:12;34026:19;;33685:366;;;:::o;34057:419::-;34223:4;34261:2;34250:9;34246:18;34238:26;;34310:9;34304:4;34300:20;34296:1;34285:9;34281:17;34274:47;34338:131;34464:4;34338:131;:::i;:::-;34330:139;;34057:419;;;:::o;34482:220::-;34622:34;34618:1;34610:6;34606:14;34599:58;34691:3;34686:2;34678:6;34674:15;34667:28;34482:220;:::o;34708:366::-;34850:3;34871:67;34935:2;34930:3;34871:67;:::i;:::-;34864:74;;34947:93;35036:3;34947:93;:::i;:::-;35065:2;35060:3;35056:12;35049:19;;34708:366;;;:::o;35080:419::-;35246:4;35284:2;35273:9;35269:18;35261:26;;35333:9;35327:4;35323:20;35319:1;35308:9;35304:17;35297:47;35361:131;35487:4;35361:131;:::i;:::-;35353:139;;35080:419;;;:::o;35505:180::-;35553:77;35550:1;35543:88;35650:4;35647:1;35640:15;35674:4;35671:1;35664:15;35691:143;35748:5;35779:6;35773:13;35764:22;;35795:33;35822:5;35795:33;:::i;:::-;35691:143;;;;:::o;35840:351::-;35910:6;35959:2;35947:9;35938:7;35934:23;35930:32;35927:119;;;35965:79;;:::i;:::-;35927:119;36085:1;36110:64;36166:7;36157:6;36146:9;36142:22;36110:64;:::i;:::-;36100:74;;36056:128;35840:351;;;;:::o;36197:114::-;36264:6;36298:5;36292:12;36282:22;;36197:114;;;:::o;36317:184::-;36416:11;36450:6;36445:3;36438:19;36490:4;36485:3;36481:14;36466:29;;36317:184;;;;:::o;36507:132::-;36574:4;36597:3;36589:11;;36627:4;36622:3;36618:14;36610:22;;36507:132;;;:::o;36645:108::-;36722:24;36740:5;36722:24;:::i;:::-;36717:3;36710:37;36645:108;;:::o;36759:179::-;36828:10;36849:46;36891:3;36883:6;36849:46;:::i;:::-;36927:4;36922:3;36918:14;36904:28;;36759:179;;;;:::o;36944:113::-;37014:4;37046;37041:3;37037:14;37029:22;;36944:113;;;:::o;37093:732::-;37212:3;37241:54;37289:5;37241:54;:::i;:::-;37311:86;37390:6;37385:3;37311:86;:::i;:::-;37304:93;;37421:56;37471:5;37421:56;:::i;:::-;37500:7;37531:1;37516:284;37541:6;37538:1;37535:13;37516:284;;;37617:6;37611:13;37644:63;37703:3;37688:13;37644:63;:::i;:::-;37637:70;;37730:60;37783:6;37730:60;:::i;:::-;37720:70;;37576:224;37563:1;37560;37556:9;37551:14;;37516:284;;;37520:14;37816:3;37809:10;;37217:608;;;37093:732;;;;:::o;37831:831::-;38094:4;38132:3;38121:9;38117:19;38109:27;;38146:71;38214:1;38203:9;38199:17;38190:6;38146:71;:::i;:::-;38227:80;38303:2;38292:9;38288:18;38279:6;38227:80;:::i;:::-;38354:9;38348:4;38344:20;38339:2;38328:9;38324:18;38317:48;38382:108;38485:4;38476:6;38382:108;:::i;:::-;38374:116;;38500:72;38568:2;38557:9;38553:18;38544:6;38500:72;:::i;:::-;38582:73;38650:3;38639:9;38635:19;38626:6;38582:73;:::i;:::-;37831:831;;;;;;;;:::o;38668:234::-;38808:34;38804:1;38796:6;38792:14;38785:58;38877:17;38872:2;38864:6;38860:15;38853:42;38668:234;:::o;38908:366::-;39050:3;39071:67;39135:2;39130:3;39071:67;:::i;:::-;39064:74;;39147:93;39236:3;39147:93;:::i;:::-;39265:2;39260:3;39256:12;39249:19;;38908:366;;;:::o;39280:419::-;39446:4;39484:2;39473:9;39469:18;39461:26;;39533:9;39527:4;39523:20;39519:1;39508:9;39504:17;39497:47;39561:131;39687:4;39561:131;:::i;:::-;39553:139;;39280:419;;;:::o

Swarm Source

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