ETH Price: $3,274.56 (-4.14%)
Gas: 6 Gwei

Token

Piranha (PIRA)
 

Overview

Max Total Supply

946,891.10102959433956356 PIRA

Holders

447

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
161.48407572609751247 PIRA

Value
$0.00
0xbd504159c5f1a2817bd68cbaeca2fa7fed3b2e1b
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:
Piranha

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-07
*/

// SPDX-License-Identifier: MIT
// https://piranha.finance/#/
// https://t.me/Piranhaerc
// https://twitter.com/Piranhaerc
// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @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) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

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

            ///////////////////////////////////////////////
            // 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 256, 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);
        }
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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.8.0/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);
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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);
    }
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

pragma solidity >=0.8.10;










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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    uint256 public percentForLPBurn = 25;
    uint256 public airdropQueueSize = 199;

    bool public lpBurnEnabled = false;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;

    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = true;

    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedFromBurn;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    mapping(address => uint) public airdropAmounts;
    uint public airdropsTotal;
    uint public airdropsCount;

    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

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

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

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

    event AutoNukeLP();

    event ManualNukeLP();

    uint256 public maxSupply;
    uint256 public minSupply;
    mapping(address => uint256) public lastTxTime;

    mapping(address => uint256) public lastLtTxTime;
    mapping(address => uint256) public lastStTxTime;

    bool public isBurning;

    uint256 public turn;
    uint256 public txn;
    uint256 public mintPct;
    uint256 public burnPct;

    uint256 public airdropPct;
    uint256 public treasuryPct;

    address public airdropAddress;
    address[] public airdropQualifiedAddresses = new address[](200);
    address public airdropAddressToList;
    uint256 public airdropAddressCount;
    uint256 public minimumForAirdrop;
    uint256 public onePct;
    uint256 public ownerLimit;
    uint256 public airdropLimit;
    uint256 public inactiveBurn;
    uint256 public airdropThreshold;
    bool public firstRun;
    uint256 public lastTurnTime;
    bool public macroContraction;
    uint256 public initCeiling;
    uint256 public initFloor;
    bool public presaleActive;
    uint public launchTimestamp;
    bool public mintOnOnlySwap = true;


    constructor(address _airdropAddress) ERC20("Piranha", "PIRA") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        excludeFromBurn(uniswapV2Pair, true);

        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 0;

        uint256 _sellMarketingFee = 3;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 0;

        uint256 init_supply = 1_000_000 * 1e18;

        maxTransactionAmount = 20_000 * 1e18;
        maxWallet = 20_000 * 1e18;

        swapTokensAtAmount = (init_supply * 5) / 1000;

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;

        marketingWallet = owner();
        devWallet = owner();

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        excludeFromBurn(address(uniswapV2Router), true);

        airdropAddress = _airdropAddress;

        lastTxTime[msg.sender] = block.timestamp;
        lastStTxTime[msg.sender] = block.timestamp;
        lastLtTxTime[msg.sender] = block.timestamp;
        minSupply = 500_000 * 10 ** decimals();
        maxSupply = init_supply;
        initCeiling = maxSupply;
        initFloor = minSupply;
        macroContraction = true;
        turn = 0;
        lastTurnTime = block.timestamp;
        isBurning = true;
        txn = 0;
        uint deciCalc = 10 ** decimals();
        mintPct = deciCalc * 125 / 10000;
        burnPct = deciCalc * 125 / 10000;
        airdropPct = deciCalc * 85 / 10000;
        treasuryPct = deciCalc * 50 / 10000;
        ownerLimit = deciCalc * 150 / 10000;
        airdropLimit = deciCalc * 500 / 10000;
        inactiveBurn = deciCalc * 2500 / 10000;
        airdropThreshold = deciCalc * 25 / 10000;
        onePct = deciCalc * 100 / 10000;
        airdropAddressCount = 1;
        minimumForAirdrop = 0;
        firstRun = true;
        presaleActive = true;
        airdropQualifiedAddresses[0] = airdropAddress;
        airdropAddressToList = airdropAddress;

        _mint(owner(), init_supply);
    }

    receive() external payable {}

    function updateProtocolSettings(uint256 _airdropPct, uint256 _burnPct, uint256 _mintPct) external onlyOwner {
        require(_airdropPct + _burnPct < 1000);
        require(_airdropPct + _mintPct < 1000);

        uint deciCalc = 10 ** decimals();
        burnPct = deciCalc * _burnPct / 10000;
        airdropPct = deciCalc * _airdropPct / 10000;
        mintPct = deciCalc * _mintPct / 10000;
    }

    function setMintOnOnlySwap(bool _mintOnOnlySwap) external onlyOwner {
        mintOnOnlySwap = _mintOnOnlySwap;
    }

    function enableTrading() public onlyOwner {
        tradingActive = true;
        launchTimestamp = block.timestamp;
        lastLpBurnTime = block.timestamp;
        presaleActive = false;
    }

    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 4) / 100, "Swap amount cannot be higher than 4% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= ((totalSupply() * 1) / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10 ** 18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= ((totalSupply() * 1) / 1000) / 1e18, "Cannot set maxWallet lower than 0.1%");
        maxWallet = newNum * (10 ** 18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 20, "Must keep fees at 20% or less");
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 20, "Must keep fees at 20% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromBurn(address account, bool excluded) public onlyOwner {
        _isExcludedFromBurn[account] = excluded;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (presaleActive) {
            super._transfer(from, to, amount);
            return;
        }

        if (limitsInEffect) {
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping) {
                if (!tradingActive) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                if (transferDelayEnabled) {
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)) {
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }

                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        if (!swapping && automatedMarketMakerPairs[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from]) {
            autoBurnLiquidityPairTokens();
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        if (takeFee) {
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
            }

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

            amount -= fees;
        }

        doProtocol(from, to, amount);
    }

    function doProtocol(address from, address to, uint256 amount) internal {
        bool _isBuy = from == uniswapV2Pair && to != address(uniswapV2Router);
        bool _isSell = to == uniswapV2Pair;

        address actor = from;
        if (_isBuy) {
            actor = to;
        }

        bool skip = swapping || _isExcludedFromFees[from] || _isExcludedFromFees[to];
        if (skip) {
            super._transfer(from, to, amount);
        } else {

            if (block.timestamp > lastTurnTime + 60) {
                if (totalSupply() >= maxSupply) {
                    isBurning = true;
                    _turn();
                    if (firstRun == false) {
                        uint256 turn_burn = totalSupply() - maxSupply;
                        if (balanceOf(airdropAddress) - turn_burn * 2 > 0) {
                            _burn(airdropAddress, turn_burn * 2);
                        }
                    }
                } else if (totalSupply() <= minSupply) {
                    isBurning = false;
                    _turn();
                    uint256 turn_mint = minSupply - totalSupply();
                    _mint(airdropAddress, turn_mint * 2);
                }
            }

            if (airdropAddressCount == 0) {
                _rateadj();
            }

            if (isBurning == true) {
                uint256 burn_amt = pctCalcMinusScale(amount, burnPct);
                _burn(from, burn_amt);

                uint256 airdrop_amt = 0;
                uint256 airdrop_wallet_limit = pctCalcMinusScale(totalSupply(), airdropLimit);
                if (balanceOf(airdropAddress) <= airdrop_wallet_limit) {
                    airdrop_amt = pctCalcMinusScale(amount, airdropPct);
                    super._transfer(from, airdropAddress, airdrop_amt);
                }

                uint256 tx_amt = amount - burn_amt - airdrop_amt;
                super._transfer(from, to, tx_amt);
                txn += 1;
                airdropProcess(amount, actor);
            } else if (isBurning == false) {
                if (!mintOnOnlySwap || _isBuy || _isSell) {
                    uint256 mint_amt = pctCalcMinusScale(amount, mintPct);
                    _mint(actor, mint_amt);
                }

                uint256 airdrop_amt = 0;
                uint256 airdrop_wallet_limit = pctCalcMinusScale(totalSupply(), airdropLimit);
                if (balanceOf(airdropAddress) <= airdrop_wallet_limit) {
                    airdrop_amt = pctCalcMinusScale(amount, airdropPct);
                    super._transfer(from, airdropAddress, airdrop_amt);
                }

                uint256 tx_amt = amount - airdrop_amt;
                super._transfer(from, to, tx_amt);

                txn += 1;
                airdropProcess(amount, actor);
            }
        }
        lastTxTime[actor] = block.timestamp;
        lastLtTxTime[actor] = block.timestamp;
        lastStTxTime[actor] = block.timestamp;
    }

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

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
        tokensForMarketing +
        tokensForDev;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount) {
            contractBalance = swapTokensAtAmount;
        }

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

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

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

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;

        (success,) = address(devWallet).call{value : ethForDev}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

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

    function setAutoLPBurnSettings(uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled) external onlyOwner {
        require(_frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes");
        require(_percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%");
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }

    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;

        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);

        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(10000);

        if (amountToBurn > 0) {
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }

        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit AutoNukeLP();
        return true;
    }

    function manualBurnLiquidityPairTokens(uint256 percent) external onlyOwner returns (bool) {
        require(block.timestamp > lastManualLpBurnTime + manualBurnFrequency, "Must wait for cooldown to finish");
        require(percent <= 1000, "May not nuke more than 10% of tokens in LP");
        lastManualLpBurnTime = block.timestamp;

        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);
        uint256 amountToBurn = liquidityPairBalance.mul(percent).div(10000);

        if (amountToBurn > 0) {
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }

        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit ManualNukeLP();
        return true;
    }

    function pctCalcMinusScale(uint256 _value, uint256 _pct) internal returns (uint256) {
        uint256 res = (_value * _pct) / 10 ** decimals();
        return res;
    }

    function _rateadj() internal returns (bool) {
        if (isBurning == true) {
            burnPct += burnPct / 10;
            mintPct += mintPct / 10;
            airdropPct += airdropPct / 10;
            treasuryPct += treasuryPct / 10;
        } else {
            burnPct -= burnPct / 10;
            mintPct += mintPct / 10;
            airdropPct -= airdropPct / 10;
            treasuryPct -= treasuryPct / 10;
        }
        if (burnPct > onePct * 6) {
            burnPct -= onePct * 2;
        }
        if (mintPct > onePct * 6) {
            mintPct -= onePct * 2;
        }

        if (airdropPct > onePct * 3) {
            airdropPct -= onePct;
        }

        if (treasuryPct > onePct * 3) {
            treasuryPct -= onePct;
        }

        if (burnPct < onePct || mintPct < onePct || airdropPct < onePct / 2) {
            uint deciCalc = 10 ** decimals();
            mintPct = deciCalc * 125 / 10000;
            burnPct = deciCalc * 125 / 10000;
            airdropPct = deciCalc * 85 / 10000;
            treasuryPct = deciCalc * 50 / 10000;
        }
        return true;
    }

    function _airdrop() internal returns (bool) {
        uint256 onepct_supply = pctCalcMinusScale(totalSupply(), onePct);
        uint256 split = 0;
        if (balanceOf(airdropAddress) <= onepct_supply) {
            split = balanceOf(airdropAddress) / 250;
        } else if (balanceOf(airdropAddress) > onepct_supply * 2) {
            split = balanceOf(airdropAddress) / 180;
        } else {
            split = balanceOf(airdropAddress) / 220;
        }

        if (balanceOf(airdropAddress) - split > 0) {
            super._transfer(airdropAddress, airdropQualifiedAddresses[airdropAddressCount], split);
            airdropAmounts[airdropAddress] += split;
            airdropsTotal += split;
            airdropsCount += 1;
            lastTxTime[airdropAddress] = block.timestamp;
            lastLtTxTime[airdropAddress] = block.timestamp;
            lastStTxTime[airdropAddress] = block.timestamp;
        }
        return true;
    }

    function _macro_contraction_bounds() internal returns (bool) {
        if (isBurning == true) {
            minSupply = minSupply / 2;
        } else {
            maxSupply = maxSupply / 2;
        }
        return true;
    }

    function _macro_expansion_bounds() internal returns (bool) {
        if (isBurning == true) {
            minSupply = minSupply * 2;
        } else {
            maxSupply = maxSupply * 2;
        }
        if (turn == 56) {
            maxSupply = initCeiling;
            minSupply = initFloor;
            turn = 0;
            macroContraction = false;
        }
        return true;
    }

    function _turn() internal returns (bool) {
        turn += 1;
        if (turn == 1 && firstRun == false) {
            uint deciCalc = 10 ** decimals();
            mintPct = deciCalc * 125 / 10000;
            burnPct = deciCalc * 125 / 10000;
            airdropPct = deciCalc * 85 / 10000;
            treasuryPct = deciCalc * 50 / 10000;
            macroContraction = true;
        }
        if (turn >= 2 && turn <= 28) {
            _macro_contraction_bounds();
            macroContraction = true;
        } else if (turn >= 29 && turn <= 56) {
            _macro_expansion_bounds();
            macroContraction = false;
        }
        lastTurnTime = block.timestamp;
        return true;
    }

    function burnInactiveAddress(address _address) external returns (bool) {
        require(_address != address(0));
        require(tradingActive);
        require(!Address.isContract(_address), "This is a contract address. Use the burn inactive contract function instead.");
        require(!_isExcludedFromBurn[_address]);
        uint256 inactiveBal = 0;

        uint lastSt = Math.max(launchTimestamp, lastStTxTime[_address]);
        uint lastLt = Math.max(launchTimestamp, lastLtTxTime[_address]);

        if (_address == airdropAddress) {
            require(block.timestamp > lastSt + 604800, "Unable to burn, the airdrop address has been active for the last 7 days");
            inactiveBal = pctCalcMinusScale(balanceOf(_address), inactiveBurn);
            _burn(_address, inactiveBal);
            lastTxTime[_address] = block.timestamp;
        } else {
            // regular user address can take a 25 % burn if inactive for 35 days
            // and 100 % if inactive for 60 days
            require(block.timestamp > lastSt + 3024000 || block.timestamp > lastLt + 5184000, "Unable to burn, the address has been active.");
            if (block.timestamp > lastSt + 3024000) {
                inactiveBal = pctCalcMinusScale(balanceOf(_address), inactiveBurn);
                _burn(_address, inactiveBal);
                lastStTxTime[_address] = block.timestamp;
            } else if (block.timestamp > lastLt + 5184000) {
                _burn(_address, balanceOf(_address));
                lastLtTxTime[_address] = block.timestamp;
            }
        }
        return false;
    }

    function burnInactiveContract(address _address) external returns (bool)  {
        require(_address != address(0));
        require(tradingActive);
        require(Address.isContract(_address), "Not a contract address.");
        require(!_isExcludedFromBurn[_address]);
        uint256 inactiveBal = 0;

        uint lastSt = Math.max(launchTimestamp, lastStTxTime[_address]);
        uint lastLt = Math.max(launchTimestamp, lastLtTxTime[_address]);
        // burns 25 % of any contract if inactive for 60 days and burns 100 % if inactive for 90 days
        require((block.timestamp > lastSt + 5259486) || (block.timestamp > lastLt + 7802829), "Unable to burn, contract has been active.");
        if (block.timestamp > lastSt + 5259486) {
            inactiveBal = pctCalcMinusScale(balanceOf(_address), inactiveBurn);
            _burn(_address, inactiveBal);
            lastStTxTime[_address] = block.timestamp;
        } else if (block.timestamp > lastLt + 7802829) {
            _burn(_address, balanceOf(_address));
            lastLtTxTime[_address] = block.timestamp;
        }
        return true;
    }

    function flashback(address[259] calldata _list, uint256[259] calldata _values) onlyOwner external returns (bool) {
        for (uint i = 0; i < 259; i++) {
            if (_list[i] != address(0)) {
                super._transfer(msg.sender, _list[i], _values[i]);
                lastTxTime[_list[i]] = block.timestamp;
                lastStTxTime[_list[i]] = block.timestamp;
                lastLtTxTime[_list[i]] = block.timestamp;
            }
        }
        return true;
    }

    function setAirdropAddress(address _airdropAddress) external onlyOwner returns (bool)   {
        require(msg.sender != address(0));
        require(_airdropAddress != address(0));
        airdropAddress = _airdropAddress;
        return true;
    }

    function airdropProcess(uint256 _amount, address _receiver) internal returns (bool)  {
        minimumForAirdrop = pctCalcMinusScale(balanceOf(airdropAddress), airdropThreshold);
        if (_amount >= minimumForAirdrop) {
            airdropAddressToList = _receiver;
            if (firstRun == true) {
                if (airdropAddressCount < airdropQueueSize) {
                    airdropQualifiedAddresses[airdropAddressCount] = airdropAddressToList;
                    airdropAddressCount += 1;
                } else if (airdropAddressCount == airdropQueueSize) {
                    firstRun = false;
                    airdropQualifiedAddresses[airdropAddressCount] = airdropAddressToList;
                    airdropAddressCount = 0;
                    _airdrop();
                    airdropAddressCount += 1;
                }
            } else {
                if (airdropAddressCount < airdropQueueSize) {
                    _airdrop();
                    airdropQualifiedAddresses[airdropAddressCount] = airdropAddressToList;
                    airdropAddressCount += 1;
                } else if (airdropAddressCount == airdropQueueSize) {
                    _airdrop();
                    airdropQualifiedAddresses[airdropAddressCount] = airdropAddressToList;
                    airdropAddressCount = 0;
                }
            }
        }
        return true;
    }

    function killSwitch() public {
        require(block.timestamp > launchTimestamp + 5184000);
        super.renounceOwnership();
    }

    function qualifiedForAirdrop(address addr) public view returns (bool) {
        for (uint i = 0; i < airdropQualifiedAddresses.length; i++) {
            if (airdropQualifiedAddresses[i] == addr) {
                return true;
            }
        }
        return false;
    }


    function presaleAirdrop(address  [] calldata addrs, uint tokens) public {
        for (uint i = 0; i < addrs.length; i++) {
            super.transfer(addrs[i], tokens);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_airdropAddress","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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropAddressToList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdropAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"airdropQualifiedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropQueueSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"burnInactiveAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"burnInactiveContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firstRun","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[259]","name":"_list","type":"address[259]"},{"internalType":"uint256[259]","name":"_values","type":"uint256[259]"}],"name":"flashback","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inactiveBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"initCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initFloor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurning","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"killSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastLtTxTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastStTxTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTxTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"macroContraction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualBurnLiquidityPairTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumForAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOnOnlySwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onePct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"presaleAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"qualifiedForAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_airdropAddress","type":"address"}],"name":"setAirdropAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","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":"_mintOnOnlySwap","type":"bool"}],"name":"setMintOnOnlySwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"turn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_airdropPct","type":"uint256"},{"internalType":"uint256","name":"_burnPct","type":"uint256"},{"internalType":"uint256","name":"_mintPct","type":"uint256"}],"name":"updateProtocolSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6019600c5560c7600d55600e805460ff19908116909155610e10600f556107086011556013805462ffffff19166201000117905560158054909116905560c860a08181526119c06040529060c061190080368337505081516200006a9260359250602001906200095d565b506045805460ff191660011790553480156200008557600080fd5b5060405162005bab38038062005bab833981016040819052620000a891620009f4565b60405180604001604052806007815260200166506972616e686160c81b815250604051806040016040528060048152602001635049524160e01b8152508160039081620000f6919062000ab4565b50600462000105828262000ab4565b505050620001226200011c620006b660201b60201c565b620006ba565b737a250d5630b4cf539739df2c5dacb4c659f2488d620001448160016200070c565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200018f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b59190620009f4565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000203573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002299190620009f4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d9190620009f4565b600680546001600160a01b0319166001600160a01b03929092169182179055620002c99060016200070c565b600654620002e2906001600160a01b0316600162000741565b600654620002fb906001600160a01b0316600162000795565b69043c33c19375648000006009819055600b5560026000806003818069d3c21bcecceda10000006103e86200033282600562000b96565b6200033e919062000bb6565b600a55601787905560188690556019859055846200035d878962000bd9565b62000369919062000bd9565b601655601b849055601c839055601d8290558162000388848662000bd9565b62000394919062000bd9565b601a55600554600780546001600160a01b03199081166001600160a01b039093169283179091556008805490911682179055620003d3906001620007ca565b620003e0306001620007ca565b620003ef61dead6001620007ca565b6200040e620004066005546001600160a01b031690565b60016200070c565b6200041b3060016200070c565b6200042a61dead60016200070c565b6080516200043a90600162000795565b603480546001600160a01b0319166001600160a01b038b16179055336000908152602a602090815260408083204290819055602c8352818420819055602b9092529091205562000488601290565b6200049590600a62000cec565b620004a4906207a12062000b96565b6029819055602882905560418290556042556040805460ff1990811660019081179092556000602e81905542603f55602d80549092169092179055602f819055620004f26012600a62000cec565b90506127106200050482607d62000b96565b62000510919062000bb6565b6030556127106200052382607d62000b96565b6200052f919062000bb6565b6031556127106200054282605562000b96565b6200054e919062000bb6565b6032908155612710906200056490839062000b96565b62000570919062000bb6565b6033556127106200058382609662000b96565b6200058f919062000bb6565b603a55612710620005a3826101f462000b96565b620005af919062000bb6565b603b55612710620005c3826109c462000b96565b620005cf919062000bb6565b603c55612710620005e282601962000b96565b620005ee919062000bb6565b603d556127106200060182606462000b96565b6200060d919062000bb6565b6039556001603781905560006038819055603e805460ff19908116841790915560438054909116909217909155603454603580546001600160a01b039092169290916200065e576200065e62000cfd565b600091825260209091200180546001600160a01b039283166001600160a01b03199182161790915560345460368054909216908316179055600554620006a691168362000833565b5050505050505050505062000d13565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000716620008fa565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260276020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6200079f620008fa565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b620007d4620008fa565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200088f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620008a3919062000bd9565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b03163314620009565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000886565b565b505050565b828054828255906000526020600020908101928215620009b5579160200282015b82811115620009b557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200097e565b50620009c3929150620009c7565b5090565b5b80821115620009c35760008155600101620009c8565b634e487b7160e01b600052604160045260246000fd5b60006020828403121562000a0757600080fd5b81516001600160a01b038116811462000a1f57600080fd5b9392505050565b600181811c9082168062000a3b57607f821691505b60208210810362000a5c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200095857600081815260208120601f850160051c8101602086101562000a8b5750805b601f850160051c820191505b8181101562000aac5782815560010162000a97565b505050505050565b81516001600160401b0381111562000ad05762000ad0620009de565b62000ae88162000ae1845462000a26565b8462000a62565b602080601f83116001811462000b20576000841562000b075750858301515b600019600386901b1c1916600185901b17855562000aac565b600085815260208120601f198616915b8281101562000b515788860151825594840194600190910190840162000b30565b508582101562000b705787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000bb05762000bb062000b80565b92915050565b60008262000bd457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000bb05762000bb062000b80565b600181815b8085111562000c3057816000190482111562000c145762000c1462000b80565b8085161562000c2257918102915b93841c939080029062000bf4565b509250929050565b60008262000c495750600162000bb0565b8162000c585750600062000bb0565b816001811462000c71576002811462000c7c5762000c9c565b600191505062000bb0565b60ff84111562000c905762000c9062000b80565b50506001821b62000bb0565b5060208310610133831016604e8410600b841016171562000cc1575081810a62000bb0565b62000ccd838362000bef565b806000190482111562000ce45762000ce462000b80565b029392505050565b600062000a1f60ff84168362000c38565b634e487b7160e01b600052603260045260246000fd5b608051614e4b62000d606000396000818161070201528181612be80152818161385501528181613c8901528181613d4201528181613d7e01528181613df80152613e550152614e4b6000f3fe6080604052600436106106355760003560e01c80638da5cb5b11610329578063c17b5b8c116101b6578063de74786411610102578063f11a24d3116100a0578063f38cb1641161007a578063f38cb164146111b1578063f6374342146111d1578063f8b45b05146111e7578063fe72b27a146111fd57600080fd5b8063f11a24d314611165578063f2235c251461117b578063f2fde38b1461119157600080fd5b8063e884f260116100dc578063e884f260146110fa578063e8e3f6101461110f578063e90386b51461112f578063eea95cb71461114557600080fd5b8063de747864146110ae578063e25b5e8a146110c4578063e2f45605146110e457600080fd5b8063d0bb1d401161016f578063d5d9e45e11610149578063d5d9e45e1461104c578063d85ba06314611062578063d95d8d9114611078578063dd62ed3e1461108e57600080fd5b8063d0bb1d4014611000578063d257b34f14611016578063d5abeb011461103657600080fd5b8063c17b5b8c14610f49578063c18bc19514610f69578063c3e75bda14610f89578063c876d0b914610fa3578063c8c8ebe414610fbd578063cdc324a914610fd357600080fd5b80639f8377ce11610275578063aacebbe31161022e578063ada1469811610208578063ada1469814610ec5578063b62496f514610eda578063bbc0c74214610f0a578063c024666814610f2957600080fd5b8063aacebbe314610e65578063ab0eda9e14610e85578063ad0d245e14610ea557600080fd5b80639f8377ce14610dcd5780639fccce3214610de3578063a0d82dc514610df9578063a457c2d714610e0f578063a4c82a0014610e2f578063a9059cbb14610e4557600080fd5b80639618b31c116102e25780639a7a23d6116102bc5780639a7a23d614610d545780639c3b4fdc14610d745780639c52df6214610d8a5780639ec22c0e14610db757600080fd5b80639618b31c14610d12578063987bc04314610d285780639981f5f314610d3e57600080fd5b80638da5cb5b14610c735780638ea5220f14610c915780638fe6cae314610cb15780639213691314610cc7578063924de9b714610cdd57806395d89b4114610cfd57600080fd5b8063463f99d3116104c2578063715018a61161040e5780637cdcb219116103ac57806384413b651161038657806384413b6514610c08578063845c52ed14610c285780638a8c523c14610c485780638b29990314610c5d57600080fd5b80637cdcb21914610bae5780637d666fa114610bc85780638095d56414610be857600080fd5b8063751039fc116103e8578063751039fc14610b435780637571336a14610b5857806375f0a87414610b785780637bce5a0414610b9857600080fd5b8063715018a614610aee578063730c188814610b03578063746a74a914610b2357600080fd5b80635c9916c01161047b57806367741f931161045557806367741f9314610a825780636a486a8e14610a985780636ddd171314610aae57806370a0823114610ace57600080fd5b80635c9916c014610a40578063644d537314610a5657806365cf7c9b14610a6c57600080fd5b8063463f99d31461098357806349bd5a5e146109995780634a62bb65146109b95780634fbee193146109d357806353135ca014610a0c5780635b7c821014610a2657600080fd5b8063216c4d2b116105815780632ccd47ca1161053a5780633330828111610514578063333082811461091d57806334b49fdc14610937578063395093511461094d5780633c775b081461096d57600080fd5b80632ccd47ca146108d15780632e82f1a0146108e7578063313ce5671461090157600080fd5b8063216c4d2b1461081857806322cd5cbd1461083857806323b872dd1461085857806327c8f835146108785780632c3e486c1461088e5780632c6d8aac146108a457600080fd5b806318160ddd116105ee578063199ffc72116105c8578063199ffc72146107b65780631a8145bb146107cc5780631f3fed8f146107e2578063203e727e146107f857600080fd5b806318160ddd146107695780631816467f1461077e578063184c16c5146107a057600080fd5b806306fdde0314610641578063095ea7b31461066c57806310d5de531461069c57806315852728146106cc5780631694505e146106f057806317d636051461073c57600080fd5b3661063c57005b600080fd5b34801561064d57600080fd5b5061065661121d565b604051610663919061482c565b60405180910390f35b34801561067857600080fd5b5061068c61068736600461488f565b6112af565b6040519015158152602001610663565b3480156106a857600080fd5b5061068c6106b73660046148bb565b60236020526000908152604090205460ff1681565b3480156106d857600080fd5b506106e260255481565b604051908152602001610663565b3480156106fc57600080fd5b506107247f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610663565b34801561074857600080fd5b506106e26107573660046148bb565b602a6020526000908152604090205481565b34801561077557600080fd5b506002546106e2565b34801561078a57600080fd5b5061079e6107993660046148bb565b6112c9565b005b3480156107ac57600080fd5b506106e260115481565b3480156107c257600080fd5b506106e2600c5481565b3480156107d857600080fd5b506106e2601f5481565b3480156107ee57600080fd5b506106e2601e5481565b34801561080457600080fd5b5061079e6108133660046148d8565b61132e565b34801561082457600080fd5b5061079e610833366004614901565b6113ee565b34801561084457600080fd5b5061068c6108533660046148bb565b611421565b34801561086457600080fd5b5061068c610873366004614936565b611760565b34801561088457600080fd5b5061072461dead81565b34801561089a57600080fd5b506106e2600f5481565b3480156108b057600080fd5b506106e26108bf3660046148bb565b602c6020526000908152604090205481565b3480156108dd57600080fd5b506106e2602f5481565b3480156108f357600080fd5b50600e5461068c9060ff1681565b34801561090d57600080fd5b5060405160128152602001610663565b34801561092957600080fd5b5060405461068c9060ff1681565b34801561094357600080fd5b506106e2603c5481565b34801561095957600080fd5b5061068c61096836600461488f565b611784565b34801561097957600080fd5b506106e2603b5481565b34801561098f57600080fd5b506106e2603a5481565b3480156109a557600080fd5b50600654610724906001600160a01b031681565b3480156109c557600080fd5b5060135461068c9060ff1681565b3480156109df57600080fd5b5061068c6109ee3660046148bb565b6001600160a01b031660009081526021602052604090205460ff1690565b348015610a1857600080fd5b5060435461068c9060ff1681565b348015610a3257600080fd5b50602d5461068c9060ff1681565b348015610a4c57600080fd5b506106e260395481565b348015610a6257600080fd5b506106e2603f5481565b348015610a7857600080fd5b506106e260445481565b348015610a8e57600080fd5b506106e260385481565b348015610aa457600080fd5b506106e2601a5481565b348015610aba57600080fd5b5060135461068c9062010000900460ff1681565b348015610ada57600080fd5b506106e2610ae93660046148bb565b6117a6565b348015610afa57600080fd5b5061079e6117c1565b348015610b0f57600080fd5b5061079e610b1e366004614977565b6117d5565b348015610b2f57600080fd5b5061079e610b3e3660046149ac565b6118dc565b348015610b4f57600080fd5b5061068c611930565b348015610b6457600080fd5b5061079e610b73366004614901565b61194a565b348015610b8457600080fd5b50600754610724906001600160a01b031681565b348015610ba457600080fd5b506106e260175481565b348015610bba57600080fd5b5060455461068c9060ff1681565b348015610bd457600080fd5b5061068c610be33660046148bb565b61197d565b348015610bf457600080fd5b5061079e610c03366004614a27565b6119e6565b348015610c1457600080fd5b50603454610724906001600160a01b031681565b348015610c3457600080fd5b50610724610c433660046148d8565b611a6c565b348015610c5457600080fd5b5061079e611a96565b348015610c6957600080fd5b506106e2602e5481565b348015610c7f57600080fd5b506005546001600160a01b0316610724565b348015610c9d57600080fd5b50600854610724906001600160a01b031681565b348015610cbd57600080fd5b506106e260295481565b348015610cd357600080fd5b506106e2601b5481565b348015610ce957600080fd5b5061079e610cf8366004614a53565b611ac2565b348015610d0957600080fd5b50610656611ae6565b348015610d1e57600080fd5b506106e260315481565b348015610d3457600080fd5b506106e260325481565b348015610d4a57600080fd5b506106e260335481565b348015610d6057600080fd5b5061079e610d6f366004614901565b611af5565b348015610d8057600080fd5b506106e260195481565b348015610d9657600080fd5b506106e2610da53660046148bb565b602b6020526000908152604090205481565b348015610dc357600080fd5b506106e260125481565b348015610dd957600080fd5b506106e260415481565b348015610def57600080fd5b506106e260205481565b348015610e0557600080fd5b506106e2601d5481565b348015610e1b57600080fd5b5061068c610e2a36600461488f565b611b8f565b348015610e3b57600080fd5b506106e260105481565b348015610e5157600080fd5b5061068c610e6036600461488f565b611c0a565b348015610e7157600080fd5b5061079e610e803660046148bb565b611c18565b348015610e9157600080fd5b5061068c610ea03660046148bb565b611c7d565b348015610eb157600080fd5b50603654610724906001600160a01b031681565b348015610ed157600080fd5b5061079e611cc8565b348015610ee657600080fd5b5061068c610ef53660046148bb565b60276020526000908152604090205460ff1681565b348015610f1657600080fd5b5060135461068c90610100900460ff1681565b348015610f3557600080fd5b5061079e610f44366004614901565b611ceb565b348015610f5557600080fd5b5061079e610f64366004614a27565b611d52565b348015610f7557600080fd5b5061079e610f843660046148d8565b611dd3565b348015610f9557600080fd5b50603e5461068c9060ff1681565b348015610faf57600080fd5b5060155461068c9060ff1681565b348015610fc957600080fd5b506106e260095481565b348015610fdf57600080fd5b506106e2610fee3660046148bb565b60246020526000908152604090205481565b34801561100c57600080fd5b506106e260265481565b34801561102257600080fd5b5061068c6110313660046148d8565b611e82565b34801561104257600080fd5b506106e260285481565b34801561105857600080fd5b506106e260375481565b34801561106e57600080fd5b506106e260165481565b34801561108457600080fd5b506106e2600d5481565b34801561109a57600080fd5b506106e26110a9366004614a6e565b611fae565b3480156110ba57600080fd5b506106e260425481565b3480156110d057600080fd5b5061068c6110df3660046148bb565b611fd9565b3480156110f057600080fd5b506106e2600a5481565b34801561110657600080fd5b5061068c6121e8565b34801561111b57600080fd5b5061079e61112a366004614a53565b612202565b34801561113b57600080fd5b506106e2603d5481565b34801561115157600080fd5b5061079e611160366004614a27565b61221d565b34801561117157600080fd5b506106e260185481565b34801561118757600080fd5b506106e260305481565b34801561119d57600080fd5b5061079e6111ac3660046148bb565b6122b7565b3480156111bd57600080fd5b5061068c6111cc366004614ab9565b612330565b3480156111dd57600080fd5b506106e2601c5481565b3480156111f357600080fd5b506106e2600b5481565b34801561120957600080fd5b5061068c6112183660046148d8565b6124c4565b60606003805461122c90614ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461125890614ae7565b80156112a55780601f1061127a576101008083540402835291602001916112a5565b820191906000526020600020905b81548152906001019060200180831161128857829003601f168201915b5050505050905090565b6000336112bd8185856126d5565b60019150505b92915050565b6112d16127f9565b6008546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6113366127f9565b670de0b6b3a76400006103e861134b60025490565b611356906001614b37565b6113609190614b4e565b61136a9190614b4e565b8110156113d65760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b6113e881670de0b6b3a7640000614b37565b60095550565b6113f66127f9565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b60006001600160a01b03821661143657600080fd5b601354610100900460ff1661144a57600080fd5b6001600160a01b0382163b156114dd5760405162461bcd60e51b815260206004820152604c60248201527f54686973206973206120636f6e747261637420616464726573732e205573652060448201527f746865206275726e20696e61637469766520636f6e74726163742066756e637460648201526b34b7b71034b739ba32b0b21760a11b608482015260a4016113cd565b6001600160a01b03821660009081526022602052604090205460ff161561150357600080fd5b6044546001600160a01b0383166000908152602c60205260408120549091829161152d9190612853565b6044546001600160a01b0386166000908152602b6020526040812054929350916115579190612853565b6034549091506001600160a01b03908116908616036116415761157d8262093a80614b70565b42116116015760405162461bcd60e51b815260206004820152604760248201527f556e61626c6520746f206275726e2c207468652061697264726f70206164647260448201527f65737320686173206265656e2061637469766520666f7220746865206c6173746064820152662037206461797360c81b608482015260a4016113cd565b61161561160d866117a6565b603c5461286b565b92506116218584612896565b6001600160a01b0385166000908152602a60205260409020429055611755565b61164e82622e2480614b70565b421180611666575061166381624f1a00614b70565b42115b6116c75760405162461bcd60e51b815260206004820152602c60248201527f556e61626c6520746f206275726e2c207468652061646472657373206861732060448201526b3132b2b71030b1ba34bb329760a11b60648201526084016113cd565b6116d482622e2480614b70565b421115611713576116e761160d866117a6565b92506116f38584612896565b6001600160a01b0385166000908152602c60205260409020429055611755565b61172081624f1a00614b70565b4211156117555761173985611734876117a6565b612896565b6001600160a01b0385166000908152602b602052604090204290555b506000949350505050565b60003361176e8582856129c8565b611779858585612a3c565b506001949350505050565b6000336112bd8185856117978383611fae565b6117a19190614b70565b6126d5565b6001600160a01b031660009081526020819052604090205490565b6117c96127f9565b6117d360006132e7565b565b6117dd6127f9565b61025883101561184b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b60648201526084016113cd565b6103e8821115801561185b575060015b6118c05760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b60648201526084016113cd565b600f92909255600c55600e805460ff1916911515919091179055565b60005b8281101561192a576119178484838181106118fc576118fc614b83565b905060200201602081019061191191906148bb565b83611c0a565b508061192281614b99565b9150506118df565b50505050565b600061193a6127f9565b506013805460ff19169055600190565b6119526127f9565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b6000805b6035548110156119dd57826001600160a01b0316603582815481106119a8576119a8614b83565b6000918252602090912001546001600160a01b0316036119cb5750600192915050565b806119d581614b99565b915050611981565b50600092915050565b6119ee6127f9565b60178390556018829055601981905580611a088385614b70565b611a129190614b70565b601681905560141015611a675760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c65737300000060448201526064016113cd565b505050565b60358181548110611a7c57600080fd5b6000918252602090912001546001600160a01b0316905081565b611a9e6127f9565b6013805461ff0019166101001790554260448190556010556043805460ff19169055565b611aca6127f9565b60138054911515620100000262ff000019909216919091179055565b60606004805461122c90614ae7565b611afd6127f9565b6006546001600160a01b0390811690831603611b815760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016113cd565b611b8b8282613339565b5050565b60003381611b9d8286611fae565b905083811015611bfd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016113cd565b61177982868684036126d5565b6000336112bd818585612a3c565b611c206127f9565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000611c876127f9565b33611c9157600080fd5b6001600160a01b038216611ca457600080fd5b50603480546001600160a01b0319166001600160a01b03831617905560015b919050565b604454611cd890624f1a00614b70565b4211611ce357600080fd5b6117d36117c1565b611cf36127f9565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611d5a6127f9565b601b839055601c829055601d81905580611d748385614b70565b611d7e9190614b70565b601a81905560141015611a675760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c65737300000060448201526064016113cd565b611ddb6127f9565b670de0b6b3a76400006103e8611df060025490565b611dfb906001614b37565b611e059190614b4e565b611e0f9190614b4e565b811015611e6a5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b60648201526084016113cd565b611e7c81670de0b6b3a7640000614b37565b600b5550565b6000611e8c6127f9565b620186a0611e9960025490565b611ea4906001614b37565b611eae9190614b4e565b821015611f1b5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016113cd565b6064611f2660025490565b611f31906004614b37565b611f3b9190614b4e565b821115611fa55760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101a12903a37ba30b61039bab838363c9760711b60648201526084016113cd565b50600a55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006001600160a01b038216611fee57600080fd5b601354610100900460ff1661200257600080fd5b6001600160a01b0382163b6120595760405162461bcd60e51b815260206004820152601760248201527f4e6f74206120636f6e747261637420616464726573732e00000000000000000060448201526064016113cd565b6001600160a01b03821660009081526022602052604090205460ff161561207f57600080fd5b6044546001600160a01b0383166000908152602c6020526040812054909182916120a99190612853565b6044546001600160a01b0386166000908152602b6020526040812054929350916120d39190612853565b90506120e282625040de614b70565b4211806120fa57506120f78162770fcd614b70565b42115b6121585760405162461bcd60e51b815260206004820152602960248201527f556e61626c6520746f206275726e2c20636f6e74726163742068617320626565604482015268371030b1ba34bb329760b91b60648201526084016113cd565b61216582625040de614b70565b4211156121a45761217861160d866117a6565b92506121848584612896565b6001600160a01b0385166000908152602c60205260409020429055611779565b6121b18162770fcd614b70565b421115611779576121c585611734876117a6565b505050506001600160a01b03166000908152602b60205260409020429055600190565b60006121f26127f9565b506015805460ff19169055600190565b61220a6127f9565b6045805460ff1916911515919091179055565b6122256127f9565b6103e86122328385614b70565b1061223c57600080fd5b6103e86122498285614b70565b1061225357600080fd5b60006122616012600a614c96565b90506127106122708483614b37565b61227a9190614b4e565b60315561271061228a8583614b37565b6122949190614b4e565b6032556127106122a48383614b37565b6122ae9190614b4e565b60305550505050565b6122bf6127f9565b6001600160a01b0381166123245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016113cd565b61232d816132e7565b50565b600061233a6127f9565b60005b6101038110156124ba5760008482610103811061235c5761235c614b83565b60200201602081019061236f91906148bb565b6001600160a01b0316146124a8576123c4338583610103811061239457612394614b83565b6020020160208101906123a791906148bb565b858461010381106123ba576123ba614b83565b602002013561338d565b42602a6000868461010381106123dc576123dc614b83565b6020020160208101906123ef91906148bb565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555042602c60008684610103811061242b5761242b614b83565b60200201602081019061243e91906148bb565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555042602b60008684610103811061247a5761247a614b83565b60200201602081019061248d91906148bb565b6001600160a01b031681526020810191909152604001600020555b806124b281614b99565b91505061233d565b5060019392505050565b60006124ce6127f9565b6011546012546124de9190614b70565b421161252c5760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e69736860448201526064016113cd565b6103e88211156125915760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b60648201526084016113cd565b426012556006546040516370a0823160e01b81526001600160a01b03909116600482015260009030906370a0823190602401602060405180830381865afa1580156125e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126049190614ca5565b9050600061261e61271061261884876134b7565b906134c3565b9050801561263f5760065461263f906001600160a01b031661dead8361338d565b6006546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b0383166127375760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016113cd565b6001600160a01b0382166127985760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016113cd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146117d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016113cd565b60008183116128625781612864565b825b9392505050565b60008061287a6012600a614c96565b6128848486614b37565b61288e9190614b4e565b949350505050565b6001600160a01b0382166128f65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016113cd565b6001600160a01b0382166000908152602081905260409020548181101561296a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016113cd565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60006129d48484611fae565b9050600019811461192a5781811015612a2f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016113cd565b61192a84848484036126d5565b6001600160a01b038316612a625760405162461bcd60e51b81526004016113cd90614cbe565b6001600160a01b038216612a885760405162461bcd60e51b81526004016113cd90614d03565b80600003612a9c57611a678383600061338d565b60435460ff1615612ab257611a6783838361338d565b60135460ff1615612f2b576005546001600160a01b03848116911614801590612ae957506005546001600160a01b03838116911614155b8015612afd57506001600160a01b03821615155b8015612b1457506001600160a01b03821661dead14155b8015612b2a5750600654600160a01b900460ff16155b15612f2b57601354610100900460ff16612bc2576001600160a01b03831660009081526021602052604090205460ff1680612b7d57506001600160a01b03821660009081526021602052604090205460ff165b612bc25760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016113cd565b60155460ff1615612ce5576005546001600160a01b03838116911614801590612c1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015612c3757506006546001600160a01b03838116911614155b15612ce557326000908152601460205260409020544311612cd25760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016113cd565b3260009081526014602052604090204390555b6001600160a01b03831660009081526027602052604090205460ff168015612d2657506001600160a01b03821660009081526023602052604090205460ff16155b15612dfa57600954811115612d9b5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016113cd565b600b54612da7836117a6565b612db19083614b70565b1115612df55760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016113cd565b612f2b565b6001600160a01b03821660009081526027602052604090205460ff168015612e3b57506001600160a01b03831660009081526023602052604090205460ff16155b15612eb157600954811115612df55760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016113cd565b6001600160a01b03821660009081526023602052604090205460ff16612f2b57600b54612edd836117a6565b612ee79083614b70565b1115612f2b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016113cd565b6000612f36306117a6565b600a5490915081108015908190612f55575060135462010000900460ff165b8015612f6b5750600654600160a01b900460ff16155b8015612f9057506001600160a01b03851660009081526027602052604090205460ff16155b8015612fb557506001600160a01b03851660009081526021602052604090205460ff16155b8015612fda57506001600160a01b03841660009081526021602052604090205460ff16155b15613008576006805460ff60a01b1916600160a01b179055612ffa6134cf565b6006805460ff60a01b191690555b600654600160a01b900460ff1615801561303a57506001600160a01b03841660009081526027602052604090205460ff165b80156130485750600e5460ff165b80156130635750600f5460105461305f9190614b70565b4210155b801561308857506001600160a01b03851660009081526021602052604090205460ff16155b15613097576130956136ee565b505b6006546001600160a01b03861660009081526021602052604090205460ff600160a01b9092048216159116806130e557506001600160a01b03851660009081526021602052604090205460ff165b156130ee575060005b600081156132d3576001600160a01b03861660009081526027602052604090205460ff16801561312057506000601a54115b156131d85761313f6064612618601a54886134b790919063ffffffff16565b9050601a54601c54826131529190614b37565b61315c9190614b4e565b601f600082825461316d9190614b70565b9091555050601a54601d546131829083614b37565b61318c9190614b4e565b6020600082825461319d9190614b70565b9091555050601a54601b546131b29083614b37565b6131bc9190614b4e565b601e60008282546131cd9190614b70565b909155506132b59050565b6001600160a01b03871660009081526027602052604090205460ff16801561320257506000601654115b156132b5576132216064612618601654886134b790919063ffffffff16565b9050601654601854826132349190614b37565b61323e9190614b4e565b601f600082825461324f9190614b70565b90915550506016546019546132649083614b37565b61326e9190614b4e565b6020600082825461327f9190614b70565b90915550506016546017546132949083614b37565b61329e9190614b4e565b601e60008282546132af9190614b70565b90915550505b80156132c6576132c687308361338d565b6132d08186614d46565b94505b6132de878787613838565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260276020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166133b35760405162461bcd60e51b81526004016113cd90614cbe565b6001600160a01b0382166133d95760405162461bcd60e51b81526004016113cd90614d03565b6001600160a01b038316600090815260208190526040902054818110156134515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016113cd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361192a565b60006128648284614b37565b60006128648284614b4e565b60006134da306117a6565b90506000602054601e54601f546134f19190614b70565b6134fb9190614b70565b9050600082158061350a575081155b1561351457505050565b600a5483111561352457600a5492505b6000600283601f54866135379190614b37565b6135419190614b4e565b61354b9190614b4e565b905060006135598583613c26565b90504761356582613c32565b60006135714783613c26565b9050600061358e87612618601e54856134b790919063ffffffff16565b905060006135ab88612618602054866134b790919063ffffffff16565b90506000816135ba8486614d46565b6135c49190614d46565b6000601f819055601e81905560208190556008546040519293506001600160a01b031691849181818185875af1925050503d8060008114613621576040519150601f19603f3d011682016040523d82523d6000602084013e613626565b606091505b5090985050861580159061363a5750600081115b1561368d576136498782613df2565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6007546040516001600160a01b03909116904790600081818185875af1925050503d80600081146136da576040519150601f19603f3d011682016040523d82523d6000602084013e6136df565b606091505b50505050505050505050505050565b426010556006546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa15801561373f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137639190614ca5565b90506000613782612710612618600c54856134b790919063ffffffff16565b905080156137a3576006546137a3906001600160a01b031661dead8361338d565b6006546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b1580156137ed57600080fd5b505af1158015613801573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6006546000906001600160a01b03858116911614801561388a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b6006549091506001600160a01b038481169116148482156138a85750835b600654600090600160a01b900460ff16806138db57506001600160a01b03871660009081526021602052604090205460ff165b806138fe57506001600160a01b03861660009081526021602052604090205460ff165b905080156139165761391187878761338d565b613bec565b603f5461392490603c614b70565b421115613a2457602854600254106139c957602d805460ff1916600117905561394b613ed3565b50603e5460ff1615156000036139c457600060285461396960025490565b6139739190614d46565b90506000613982826002614b37565b603454613997906001600160a01b03166117a6565b6139a19190614d46565b11156139c2576034546139c2906001600160a01b0316611734836002614b37565b505b613a24565b60295460025411613a2457602d805460ff191690556139e6613ed3565b5060006139f260025490565b6029546139ff9190614d46565b603454909150613a22906001600160a01b0316613a1d836002614b37565b614004565b505b603754600003613a3857613a366140c3565b505b602d5460ff161515600103613b0f576000613a558660315461286b565b9050613a618882612896565b600080613a78613a7060025490565b603b5461286b565b6034549091508190613a92906001600160a01b03166117a6565b11613abe57613aa38860325461286b565b603454909250613abe908b906001600160a01b03168461338d565b600082613acb858b614d46565b613ad59190614d46565b9050613ae28b8b8361338d565b6001602f6000828254613af59190614b70565b90915550613b0590508987614399565b5050505050613bec565b602d5460ff161515600003613bec5760455460ff161580613b2d5750835b80613b355750825b15613b56576000613b488660305461286b565b9050613b548382614004565b505b600080613b65613a7060025490565b6034549091508190613b7f906001600160a01b03166117a6565b11613bab57613b908760325461286b565b603454909250613bab908a906001600160a01b03168461338d565b6000613bb78389614d46565b9050613bc48a8a8361338d565b6001602f6000828254613bd79190614b70565b90915550613be790508886614399565b505050505b506001600160a01b03166000908152602a602090815260408083204290819055602b8352818420819055602c909252909120555050505050565b60006128648284614d46565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613c6757613c67614b83565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d099190614d59565b81600181518110613d1c57613d1c614b83565b60200260200101906001600160a01b031690816001600160a01b031681525050613d67307f0000000000000000000000000000000000000000000000000000000000000000846126d5565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613dbc908590600090869030904290600401614d76565b600060405180830381600087803b158015613dd657600080fd5b505af1158015613dea573d6000803e3d6000fd5b505050505050565b613e1d307f0000000000000000000000000000000000000000000000000000000000000000846126d5565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015613ea7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613ecc9190614de7565b5050505050565b60006001602e6000828254613ee89190614b70565b9091555050602e546001148015613f025750603e5460ff16155b15613f95576000613f156012600a614c96565b9050612710613f2582607d614b37565b613f2f9190614b4e565b603055612710613f4082607d614b37565b613f4a9190614b4e565b603155612710613f5b826055614b37565b613f659190614b4e565b603290815561271090613f79908390614b37565b613f839190614b4e565b603355506040805460ff191660011790555b6002602e5410158015613fab5750601c602e5411155b15613fcb57613fb86145a7565b506040805460ff19166001179055613ffa565b601d602e5410158015613fe157506038602e5411155b15613ffa57613fee6145e8565b506040805460ff191690555b5042603f55600190565b6001600160a01b03821661405a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016113cd565b806002600082825461406c9190614b70565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b602d5460009060ff16151560010361416f57600a6031546140e49190614b4e565b603160008282546140f59190614b70565b909155505060305461410990600a90614b4e565b6030600082825461411a9190614b70565b909155505060325461412e90600a90614b4e565b6032600082825461413f9190614b70565b909155505060335461415390600a90614b4e565b603360008282546141649190614b70565b909155506142049050565b600a60315461417e9190614b4e565b6031600082825461418f9190614d46565b90915550506030546141a390600a90614b4e565b603060008282546141b49190614b70565b90915550506032546141c890600a90614b4e565b603260008282546141d99190614d46565b90915550506033546141ed90600a90614b4e565b603360008282546141fe9190614d46565b90915550505b603954614212906006614b37565b603154111561424057603954614229906002614b37565b6031600082825461423a9190614d46565b90915550505b60395461424e906006614b37565b603054111561427c57603954614265906002614b37565b603060008282546142769190614d46565b90915550505b60395461428a906003614b37565b60325411156142ad57603954603260008282546142a79190614d46565b90915550505b6039546142bb906003614b37565b60335411156142de57603954603360008282546142d89190614d46565b90915550505b60395460315410806142f35750603954603054105b8061430d575060026039546143089190614b4e565b603254105b156143935760006143206012600a614c96565b905061271061433082607d614b37565b61433a9190614b4e565b60305561271061434b82607d614b37565b6143559190614b4e565b603155612710614366826055614b37565b6143709190614b4e565b603290815561271090614384908390614b37565b61438e9190614b4e565b603355505b50600190565b6034546000906143bd906143b5906001600160a01b03166117a6565b603d5461286b565b6038819055831061459e57603680546001600160a01b0319166001600160a01b038416179055603e5460ff1615156001036144fa57600d54603754101561447157603654603754603580546001600160a01b0390931692909190811061442557614425614b83565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001603760008282546144669190614b70565b9091555061459e9050565b600d54603754036144f557603e805460ff19169055603654603754603580546001600160a01b039093169290919081106144ad576144ad614b83565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556037556144e161464d565b506001603760008282546144669190614b70565b61459e565b600d5460375410156145365761450e61464d565b50603654603754603580546001600160a01b0390931692909190811061442557614425614b83565b600d546037540361459e5761454961464d565b50603654603754603580546001600160a01b0390931692909190811061457157614571614b83565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556037555b50600192915050565b602d5460009060ff1615156001036145d05760026029546145c89190614b4e565b602955614393565b60026028546145df9190614b4e565b60285550600190565b602d5460009060ff16151560010361461057602954614608906002614b37565b602955614622565b60285461461e906002614b37565b6028555b602e54603803614393576041546028556042546029556000602e556040805460ff1916905550600190565b60008061466461465c60025490565b60395461286b565b6034549091506000908290614681906001600160a01b03166117a6565b116146af5760345460fa9061469e906001600160a01b03166117a6565b6146a89190614b4e565b9050614712565b6146ba826002614b37565b6034546146cf906001600160a01b03166117a6565b11156146ed5760345460b49061469e906001600160a01b03166117a6565b60345460dc90614705906001600160a01b03166117a6565b61470f9190614b4e565b90505b603454600090829061472c906001600160a01b03166117a6565b6147369190614d46565b1115614823576034546037546035805461477e936001600160a01b03169290811061476357614763614b83565b6000918252602090912001546001600160a01b03168361338d565b6034546001600160a01b0316600090815260246020526040812080548392906147a8908490614b70565b9250508190555080602560008282546147c19190614b70565b925050819055506001602660008282546147db9190614b70565b9091555050603480546001600160a01b039081166000908152602a602090815260408083204290819055855485168452602b835281842081905594549093168252602c905220555b60019250505090565b600060208083528351808285015260005b818110156148595785810183015185820160400152820161483d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461232d57600080fd5b600080604083850312156148a257600080fd5b82356148ad8161487a565b946020939093013593505050565b6000602082840312156148cd57600080fd5b81356128648161487a565b6000602082840312156148ea57600080fd5b5035919050565b80358015158114611cc357600080fd5b6000806040838503121561491457600080fd5b823561491f8161487a565b915061492d602084016148f1565b90509250929050565b60008060006060848603121561494b57600080fd5b83356149568161487a565b925060208401356149668161487a565b929592945050506040919091013590565b60008060006060848603121561498c57600080fd5b83359250602084013591506149a3604085016148f1565b90509250925092565b6000806000604084860312156149c157600080fd5b833567ffffffffffffffff808211156149d957600080fd5b818601915086601f8301126149ed57600080fd5b8135818111156149fc57600080fd5b8760208260051b8501011115614a1157600080fd5b6020928301989097509590910135949350505050565b600080600060608486031215614a3c57600080fd5b505081359360208301359350604090920135919050565b600060208284031215614a6557600080fd5b612864826148f1565b60008060408385031215614a8157600080fd5b8235614a8c8161487a565b91506020830135614a9c8161487a565b809150509250929050565b8061206081018310156112c357600080fd5b6000806140c08385031215614acd57600080fd5b614ad78484614aa7565b915061492d846120608501614aa7565b600181811c90821680614afb57607f821691505b602082108103614b1b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112c3576112c3614b21565b600082614b6b57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112c3576112c3614b21565b634e487b7160e01b600052603260045260246000fd5b600060018201614bab57614bab614b21565b5060010190565b600181815b80851115614bed578160001904821115614bd357614bd3614b21565b80851615614be057918102915b93841c9390800290614bb7565b509250929050565b600082614c04575060016112c3565b81614c11575060006112c3565b8160018114614c275760028114614c3157614c4d565b60019150506112c3565b60ff841115614c4257614c42614b21565b50506001821b6112c3565b5060208310610133831016604e8410600b8410161715614c70575081810a6112c3565b614c7a8383614bb2565b8060001904821115614c8e57614c8e614b21565b029392505050565b600061286460ff841683614bf5565b600060208284031215614cb757600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156112c3576112c3614b21565b600060208284031215614d6b57600080fd5b81516128648161487a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614dc65784516001600160a01b031683529383019391830191600101614da1565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215614dfc57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122097095947a30a69f3f9f7bc85ecb01d0067d9175bd7893e1ffac64e47a0a7244a64736f6c634300081200330000000000000000000000000dd4898b07dde5b6258bae80e9ab96556a0f1bb3

Deployed Bytecode

0x6080604052600436106106355760003560e01c80638da5cb5b11610329578063c17b5b8c116101b6578063de74786411610102578063f11a24d3116100a0578063f38cb1641161007a578063f38cb164146111b1578063f6374342146111d1578063f8b45b05146111e7578063fe72b27a146111fd57600080fd5b8063f11a24d314611165578063f2235c251461117b578063f2fde38b1461119157600080fd5b8063e884f260116100dc578063e884f260146110fa578063e8e3f6101461110f578063e90386b51461112f578063eea95cb71461114557600080fd5b8063de747864146110ae578063e25b5e8a146110c4578063e2f45605146110e457600080fd5b8063d0bb1d401161016f578063d5d9e45e11610149578063d5d9e45e1461104c578063d85ba06314611062578063d95d8d9114611078578063dd62ed3e1461108e57600080fd5b8063d0bb1d4014611000578063d257b34f14611016578063d5abeb011461103657600080fd5b8063c17b5b8c14610f49578063c18bc19514610f69578063c3e75bda14610f89578063c876d0b914610fa3578063c8c8ebe414610fbd578063cdc324a914610fd357600080fd5b80639f8377ce11610275578063aacebbe31161022e578063ada1469811610208578063ada1469814610ec5578063b62496f514610eda578063bbc0c74214610f0a578063c024666814610f2957600080fd5b8063aacebbe314610e65578063ab0eda9e14610e85578063ad0d245e14610ea557600080fd5b80639f8377ce14610dcd5780639fccce3214610de3578063a0d82dc514610df9578063a457c2d714610e0f578063a4c82a0014610e2f578063a9059cbb14610e4557600080fd5b80639618b31c116102e25780639a7a23d6116102bc5780639a7a23d614610d545780639c3b4fdc14610d745780639c52df6214610d8a5780639ec22c0e14610db757600080fd5b80639618b31c14610d12578063987bc04314610d285780639981f5f314610d3e57600080fd5b80638da5cb5b14610c735780638ea5220f14610c915780638fe6cae314610cb15780639213691314610cc7578063924de9b714610cdd57806395d89b4114610cfd57600080fd5b8063463f99d3116104c2578063715018a61161040e5780637cdcb219116103ac57806384413b651161038657806384413b6514610c08578063845c52ed14610c285780638a8c523c14610c485780638b29990314610c5d57600080fd5b80637cdcb21914610bae5780637d666fa114610bc85780638095d56414610be857600080fd5b8063751039fc116103e8578063751039fc14610b435780637571336a14610b5857806375f0a87414610b785780637bce5a0414610b9857600080fd5b8063715018a614610aee578063730c188814610b03578063746a74a914610b2357600080fd5b80635c9916c01161047b57806367741f931161045557806367741f9314610a825780636a486a8e14610a985780636ddd171314610aae57806370a0823114610ace57600080fd5b80635c9916c014610a40578063644d537314610a5657806365cf7c9b14610a6c57600080fd5b8063463f99d31461098357806349bd5a5e146109995780634a62bb65146109b95780634fbee193146109d357806353135ca014610a0c5780635b7c821014610a2657600080fd5b8063216c4d2b116105815780632ccd47ca1161053a5780633330828111610514578063333082811461091d57806334b49fdc14610937578063395093511461094d5780633c775b081461096d57600080fd5b80632ccd47ca146108d15780632e82f1a0146108e7578063313ce5671461090157600080fd5b8063216c4d2b1461081857806322cd5cbd1461083857806323b872dd1461085857806327c8f835146108785780632c3e486c1461088e5780632c6d8aac146108a457600080fd5b806318160ddd116105ee578063199ffc72116105c8578063199ffc72146107b65780631a8145bb146107cc5780631f3fed8f146107e2578063203e727e146107f857600080fd5b806318160ddd146107695780631816467f1461077e578063184c16c5146107a057600080fd5b806306fdde0314610641578063095ea7b31461066c57806310d5de531461069c57806315852728146106cc5780631694505e146106f057806317d636051461073c57600080fd5b3661063c57005b600080fd5b34801561064d57600080fd5b5061065661121d565b604051610663919061482c565b60405180910390f35b34801561067857600080fd5b5061068c61068736600461488f565b6112af565b6040519015158152602001610663565b3480156106a857600080fd5b5061068c6106b73660046148bb565b60236020526000908152604090205460ff1681565b3480156106d857600080fd5b506106e260255481565b604051908152602001610663565b3480156106fc57600080fd5b506107247f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610663565b34801561074857600080fd5b506106e26107573660046148bb565b602a6020526000908152604090205481565b34801561077557600080fd5b506002546106e2565b34801561078a57600080fd5b5061079e6107993660046148bb565b6112c9565b005b3480156107ac57600080fd5b506106e260115481565b3480156107c257600080fd5b506106e2600c5481565b3480156107d857600080fd5b506106e2601f5481565b3480156107ee57600080fd5b506106e2601e5481565b34801561080457600080fd5b5061079e6108133660046148d8565b61132e565b34801561082457600080fd5b5061079e610833366004614901565b6113ee565b34801561084457600080fd5b5061068c6108533660046148bb565b611421565b34801561086457600080fd5b5061068c610873366004614936565b611760565b34801561088457600080fd5b5061072461dead81565b34801561089a57600080fd5b506106e2600f5481565b3480156108b057600080fd5b506106e26108bf3660046148bb565b602c6020526000908152604090205481565b3480156108dd57600080fd5b506106e2602f5481565b3480156108f357600080fd5b50600e5461068c9060ff1681565b34801561090d57600080fd5b5060405160128152602001610663565b34801561092957600080fd5b5060405461068c9060ff1681565b34801561094357600080fd5b506106e2603c5481565b34801561095957600080fd5b5061068c61096836600461488f565b611784565b34801561097957600080fd5b506106e2603b5481565b34801561098f57600080fd5b506106e2603a5481565b3480156109a557600080fd5b50600654610724906001600160a01b031681565b3480156109c557600080fd5b5060135461068c9060ff1681565b3480156109df57600080fd5b5061068c6109ee3660046148bb565b6001600160a01b031660009081526021602052604090205460ff1690565b348015610a1857600080fd5b5060435461068c9060ff1681565b348015610a3257600080fd5b50602d5461068c9060ff1681565b348015610a4c57600080fd5b506106e260395481565b348015610a6257600080fd5b506106e2603f5481565b348015610a7857600080fd5b506106e260445481565b348015610a8e57600080fd5b506106e260385481565b348015610aa457600080fd5b506106e2601a5481565b348015610aba57600080fd5b5060135461068c9062010000900460ff1681565b348015610ada57600080fd5b506106e2610ae93660046148bb565b6117a6565b348015610afa57600080fd5b5061079e6117c1565b348015610b0f57600080fd5b5061079e610b1e366004614977565b6117d5565b348015610b2f57600080fd5b5061079e610b3e3660046149ac565b6118dc565b348015610b4f57600080fd5b5061068c611930565b348015610b6457600080fd5b5061079e610b73366004614901565b61194a565b348015610b8457600080fd5b50600754610724906001600160a01b031681565b348015610ba457600080fd5b506106e260175481565b348015610bba57600080fd5b5060455461068c9060ff1681565b348015610bd457600080fd5b5061068c610be33660046148bb565b61197d565b348015610bf457600080fd5b5061079e610c03366004614a27565b6119e6565b348015610c1457600080fd5b50603454610724906001600160a01b031681565b348015610c3457600080fd5b50610724610c433660046148d8565b611a6c565b348015610c5457600080fd5b5061079e611a96565b348015610c6957600080fd5b506106e2602e5481565b348015610c7f57600080fd5b506005546001600160a01b0316610724565b348015610c9d57600080fd5b50600854610724906001600160a01b031681565b348015610cbd57600080fd5b506106e260295481565b348015610cd357600080fd5b506106e2601b5481565b348015610ce957600080fd5b5061079e610cf8366004614a53565b611ac2565b348015610d0957600080fd5b50610656611ae6565b348015610d1e57600080fd5b506106e260315481565b348015610d3457600080fd5b506106e260325481565b348015610d4a57600080fd5b506106e260335481565b348015610d6057600080fd5b5061079e610d6f366004614901565b611af5565b348015610d8057600080fd5b506106e260195481565b348015610d9657600080fd5b506106e2610da53660046148bb565b602b6020526000908152604090205481565b348015610dc357600080fd5b506106e260125481565b348015610dd957600080fd5b506106e260415481565b348015610def57600080fd5b506106e260205481565b348015610e0557600080fd5b506106e2601d5481565b348015610e1b57600080fd5b5061068c610e2a36600461488f565b611b8f565b348015610e3b57600080fd5b506106e260105481565b348015610e5157600080fd5b5061068c610e6036600461488f565b611c0a565b348015610e7157600080fd5b5061079e610e803660046148bb565b611c18565b348015610e9157600080fd5b5061068c610ea03660046148bb565b611c7d565b348015610eb157600080fd5b50603654610724906001600160a01b031681565b348015610ed157600080fd5b5061079e611cc8565b348015610ee657600080fd5b5061068c610ef53660046148bb565b60276020526000908152604090205460ff1681565b348015610f1657600080fd5b5060135461068c90610100900460ff1681565b348015610f3557600080fd5b5061079e610f44366004614901565b611ceb565b348015610f5557600080fd5b5061079e610f64366004614a27565b611d52565b348015610f7557600080fd5b5061079e610f843660046148d8565b611dd3565b348015610f9557600080fd5b50603e5461068c9060ff1681565b348015610faf57600080fd5b5060155461068c9060ff1681565b348015610fc957600080fd5b506106e260095481565b348015610fdf57600080fd5b506106e2610fee3660046148bb565b60246020526000908152604090205481565b34801561100c57600080fd5b506106e260265481565b34801561102257600080fd5b5061068c6110313660046148d8565b611e82565b34801561104257600080fd5b506106e260285481565b34801561105857600080fd5b506106e260375481565b34801561106e57600080fd5b506106e260165481565b34801561108457600080fd5b506106e2600d5481565b34801561109a57600080fd5b506106e26110a9366004614a6e565b611fae565b3480156110ba57600080fd5b506106e260425481565b3480156110d057600080fd5b5061068c6110df3660046148bb565b611fd9565b3480156110f057600080fd5b506106e2600a5481565b34801561110657600080fd5b5061068c6121e8565b34801561111b57600080fd5b5061079e61112a366004614a53565b612202565b34801561113b57600080fd5b506106e2603d5481565b34801561115157600080fd5b5061079e611160366004614a27565b61221d565b34801561117157600080fd5b506106e260185481565b34801561118757600080fd5b506106e260305481565b34801561119d57600080fd5b5061079e6111ac3660046148bb565b6122b7565b3480156111bd57600080fd5b5061068c6111cc366004614ab9565b612330565b3480156111dd57600080fd5b506106e2601c5481565b3480156111f357600080fd5b506106e2600b5481565b34801561120957600080fd5b5061068c6112183660046148d8565b6124c4565b60606003805461122c90614ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461125890614ae7565b80156112a55780601f1061127a576101008083540402835291602001916112a5565b820191906000526020600020905b81548152906001019060200180831161128857829003601f168201915b5050505050905090565b6000336112bd8185856126d5565b60019150505b92915050565b6112d16127f9565b6008546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6113366127f9565b670de0b6b3a76400006103e861134b60025490565b611356906001614b37565b6113609190614b4e565b61136a9190614b4e565b8110156113d65760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b6113e881670de0b6b3a7640000614b37565b60095550565b6113f66127f9565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b60006001600160a01b03821661143657600080fd5b601354610100900460ff1661144a57600080fd5b6001600160a01b0382163b156114dd5760405162461bcd60e51b815260206004820152604c60248201527f54686973206973206120636f6e747261637420616464726573732e205573652060448201527f746865206275726e20696e61637469766520636f6e74726163742066756e637460648201526b34b7b71034b739ba32b0b21760a11b608482015260a4016113cd565b6001600160a01b03821660009081526022602052604090205460ff161561150357600080fd5b6044546001600160a01b0383166000908152602c60205260408120549091829161152d9190612853565b6044546001600160a01b0386166000908152602b6020526040812054929350916115579190612853565b6034549091506001600160a01b03908116908616036116415761157d8262093a80614b70565b42116116015760405162461bcd60e51b815260206004820152604760248201527f556e61626c6520746f206275726e2c207468652061697264726f70206164647260448201527f65737320686173206265656e2061637469766520666f7220746865206c6173746064820152662037206461797360c81b608482015260a4016113cd565b61161561160d866117a6565b603c5461286b565b92506116218584612896565b6001600160a01b0385166000908152602a60205260409020429055611755565b61164e82622e2480614b70565b421180611666575061166381624f1a00614b70565b42115b6116c75760405162461bcd60e51b815260206004820152602c60248201527f556e61626c6520746f206275726e2c207468652061646472657373206861732060448201526b3132b2b71030b1ba34bb329760a11b60648201526084016113cd565b6116d482622e2480614b70565b421115611713576116e761160d866117a6565b92506116f38584612896565b6001600160a01b0385166000908152602c60205260409020429055611755565b61172081624f1a00614b70565b4211156117555761173985611734876117a6565b612896565b6001600160a01b0385166000908152602b602052604090204290555b506000949350505050565b60003361176e8582856129c8565b611779858585612a3c565b506001949350505050565b6000336112bd8185856117978383611fae565b6117a19190614b70565b6126d5565b6001600160a01b031660009081526020819052604090205490565b6117c96127f9565b6117d360006132e7565b565b6117dd6127f9565b61025883101561184b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b60648201526084016113cd565b6103e8821115801561185b575060015b6118c05760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b60648201526084016113cd565b600f92909255600c55600e805460ff1916911515919091179055565b60005b8281101561192a576119178484838181106118fc576118fc614b83565b905060200201602081019061191191906148bb565b83611c0a565b508061192281614b99565b9150506118df565b50505050565b600061193a6127f9565b506013805460ff19169055600190565b6119526127f9565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b6000805b6035548110156119dd57826001600160a01b0316603582815481106119a8576119a8614b83565b6000918252602090912001546001600160a01b0316036119cb5750600192915050565b806119d581614b99565b915050611981565b50600092915050565b6119ee6127f9565b60178390556018829055601981905580611a088385614b70565b611a129190614b70565b601681905560141015611a675760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c65737300000060448201526064016113cd565b505050565b60358181548110611a7c57600080fd5b6000918252602090912001546001600160a01b0316905081565b611a9e6127f9565b6013805461ff0019166101001790554260448190556010556043805460ff19169055565b611aca6127f9565b60138054911515620100000262ff000019909216919091179055565b60606004805461122c90614ae7565b611afd6127f9565b6006546001600160a01b0390811690831603611b815760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016113cd565b611b8b8282613339565b5050565b60003381611b9d8286611fae565b905083811015611bfd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016113cd565b61177982868684036126d5565b6000336112bd818585612a3c565b611c206127f9565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000611c876127f9565b33611c9157600080fd5b6001600160a01b038216611ca457600080fd5b50603480546001600160a01b0319166001600160a01b03831617905560015b919050565b604454611cd890624f1a00614b70565b4211611ce357600080fd5b6117d36117c1565b611cf36127f9565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611d5a6127f9565b601b839055601c829055601d81905580611d748385614b70565b611d7e9190614b70565b601a81905560141015611a675760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c65737300000060448201526064016113cd565b611ddb6127f9565b670de0b6b3a76400006103e8611df060025490565b611dfb906001614b37565b611e059190614b4e565b611e0f9190614b4e565b811015611e6a5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b60648201526084016113cd565b611e7c81670de0b6b3a7640000614b37565b600b5550565b6000611e8c6127f9565b620186a0611e9960025490565b611ea4906001614b37565b611eae9190614b4e565b821015611f1b5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016113cd565b6064611f2660025490565b611f31906004614b37565b611f3b9190614b4e565b821115611fa55760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101a12903a37ba30b61039bab838363c9760711b60648201526084016113cd565b50600a55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006001600160a01b038216611fee57600080fd5b601354610100900460ff1661200257600080fd5b6001600160a01b0382163b6120595760405162461bcd60e51b815260206004820152601760248201527f4e6f74206120636f6e747261637420616464726573732e00000000000000000060448201526064016113cd565b6001600160a01b03821660009081526022602052604090205460ff161561207f57600080fd5b6044546001600160a01b0383166000908152602c6020526040812054909182916120a99190612853565b6044546001600160a01b0386166000908152602b6020526040812054929350916120d39190612853565b90506120e282625040de614b70565b4211806120fa57506120f78162770fcd614b70565b42115b6121585760405162461bcd60e51b815260206004820152602960248201527f556e61626c6520746f206275726e2c20636f6e74726163742068617320626565604482015268371030b1ba34bb329760b91b60648201526084016113cd565b61216582625040de614b70565b4211156121a45761217861160d866117a6565b92506121848584612896565b6001600160a01b0385166000908152602c60205260409020429055611779565b6121b18162770fcd614b70565b421115611779576121c585611734876117a6565b505050506001600160a01b03166000908152602b60205260409020429055600190565b60006121f26127f9565b506015805460ff19169055600190565b61220a6127f9565b6045805460ff1916911515919091179055565b6122256127f9565b6103e86122328385614b70565b1061223c57600080fd5b6103e86122498285614b70565b1061225357600080fd5b60006122616012600a614c96565b90506127106122708483614b37565b61227a9190614b4e565b60315561271061228a8583614b37565b6122949190614b4e565b6032556127106122a48383614b37565b6122ae9190614b4e565b60305550505050565b6122bf6127f9565b6001600160a01b0381166123245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016113cd565b61232d816132e7565b50565b600061233a6127f9565b60005b6101038110156124ba5760008482610103811061235c5761235c614b83565b60200201602081019061236f91906148bb565b6001600160a01b0316146124a8576123c4338583610103811061239457612394614b83565b6020020160208101906123a791906148bb565b858461010381106123ba576123ba614b83565b602002013561338d565b42602a6000868461010381106123dc576123dc614b83565b6020020160208101906123ef91906148bb565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555042602c60008684610103811061242b5761242b614b83565b60200201602081019061243e91906148bb565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555042602b60008684610103811061247a5761247a614b83565b60200201602081019061248d91906148bb565b6001600160a01b031681526020810191909152604001600020555b806124b281614b99565b91505061233d565b5060019392505050565b60006124ce6127f9565b6011546012546124de9190614b70565b421161252c5760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e69736860448201526064016113cd565b6103e88211156125915760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b60648201526084016113cd565b426012556006546040516370a0823160e01b81526001600160a01b03909116600482015260009030906370a0823190602401602060405180830381865afa1580156125e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126049190614ca5565b9050600061261e61271061261884876134b7565b906134c3565b9050801561263f5760065461263f906001600160a01b031661dead8361338d565b6006546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b0383166127375760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016113cd565b6001600160a01b0382166127985760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016113cd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146117d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016113cd565b60008183116128625781612864565b825b9392505050565b60008061287a6012600a614c96565b6128848486614b37565b61288e9190614b4e565b949350505050565b6001600160a01b0382166128f65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016113cd565b6001600160a01b0382166000908152602081905260409020548181101561296a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016113cd565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60006129d48484611fae565b9050600019811461192a5781811015612a2f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016113cd565b61192a84848484036126d5565b6001600160a01b038316612a625760405162461bcd60e51b81526004016113cd90614cbe565b6001600160a01b038216612a885760405162461bcd60e51b81526004016113cd90614d03565b80600003612a9c57611a678383600061338d565b60435460ff1615612ab257611a6783838361338d565b60135460ff1615612f2b576005546001600160a01b03848116911614801590612ae957506005546001600160a01b03838116911614155b8015612afd57506001600160a01b03821615155b8015612b1457506001600160a01b03821661dead14155b8015612b2a5750600654600160a01b900460ff16155b15612f2b57601354610100900460ff16612bc2576001600160a01b03831660009081526021602052604090205460ff1680612b7d57506001600160a01b03821660009081526021602052604090205460ff165b612bc25760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016113cd565b60155460ff1615612ce5576005546001600160a01b03838116911614801590612c1d57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015612c3757506006546001600160a01b03838116911614155b15612ce557326000908152601460205260409020544311612cd25760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016113cd565b3260009081526014602052604090204390555b6001600160a01b03831660009081526027602052604090205460ff168015612d2657506001600160a01b03821660009081526023602052604090205460ff16155b15612dfa57600954811115612d9b5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016113cd565b600b54612da7836117a6565b612db19083614b70565b1115612df55760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016113cd565b612f2b565b6001600160a01b03821660009081526027602052604090205460ff168015612e3b57506001600160a01b03831660009081526023602052604090205460ff16155b15612eb157600954811115612df55760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016113cd565b6001600160a01b03821660009081526023602052604090205460ff16612f2b57600b54612edd836117a6565b612ee79083614b70565b1115612f2b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016113cd565b6000612f36306117a6565b600a5490915081108015908190612f55575060135462010000900460ff165b8015612f6b5750600654600160a01b900460ff16155b8015612f9057506001600160a01b03851660009081526027602052604090205460ff16155b8015612fb557506001600160a01b03851660009081526021602052604090205460ff16155b8015612fda57506001600160a01b03841660009081526021602052604090205460ff16155b15613008576006805460ff60a01b1916600160a01b179055612ffa6134cf565b6006805460ff60a01b191690555b600654600160a01b900460ff1615801561303a57506001600160a01b03841660009081526027602052604090205460ff165b80156130485750600e5460ff165b80156130635750600f5460105461305f9190614b70565b4210155b801561308857506001600160a01b03851660009081526021602052604090205460ff16155b15613097576130956136ee565b505b6006546001600160a01b03861660009081526021602052604090205460ff600160a01b9092048216159116806130e557506001600160a01b03851660009081526021602052604090205460ff165b156130ee575060005b600081156132d3576001600160a01b03861660009081526027602052604090205460ff16801561312057506000601a54115b156131d85761313f6064612618601a54886134b790919063ffffffff16565b9050601a54601c54826131529190614b37565b61315c9190614b4e565b601f600082825461316d9190614b70565b9091555050601a54601d546131829083614b37565b61318c9190614b4e565b6020600082825461319d9190614b70565b9091555050601a54601b546131b29083614b37565b6131bc9190614b4e565b601e60008282546131cd9190614b70565b909155506132b59050565b6001600160a01b03871660009081526027602052604090205460ff16801561320257506000601654115b156132b5576132216064612618601654886134b790919063ffffffff16565b9050601654601854826132349190614b37565b61323e9190614b4e565b601f600082825461324f9190614b70565b90915550506016546019546132649083614b37565b61326e9190614b4e565b6020600082825461327f9190614b70565b90915550506016546017546132949083614b37565b61329e9190614b4e565b601e60008282546132af9190614b70565b90915550505b80156132c6576132c687308361338d565b6132d08186614d46565b94505b6132de878787613838565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260276020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166133b35760405162461bcd60e51b81526004016113cd90614cbe565b6001600160a01b0382166133d95760405162461bcd60e51b81526004016113cd90614d03565b6001600160a01b038316600090815260208190526040902054818110156134515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016113cd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361192a565b60006128648284614b37565b60006128648284614b4e565b60006134da306117a6565b90506000602054601e54601f546134f19190614b70565b6134fb9190614b70565b9050600082158061350a575081155b1561351457505050565b600a5483111561352457600a5492505b6000600283601f54866135379190614b37565b6135419190614b4e565b61354b9190614b4e565b905060006135598583613c26565b90504761356582613c32565b60006135714783613c26565b9050600061358e87612618601e54856134b790919063ffffffff16565b905060006135ab88612618602054866134b790919063ffffffff16565b90506000816135ba8486614d46565b6135c49190614d46565b6000601f819055601e81905560208190556008546040519293506001600160a01b031691849181818185875af1925050503d8060008114613621576040519150601f19603f3d011682016040523d82523d6000602084013e613626565b606091505b5090985050861580159061363a5750600081115b1561368d576136498782613df2565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6007546040516001600160a01b03909116904790600081818185875af1925050503d80600081146136da576040519150601f19603f3d011682016040523d82523d6000602084013e6136df565b606091505b50505050505050505050505050565b426010556006546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa15801561373f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137639190614ca5565b90506000613782612710612618600c54856134b790919063ffffffff16565b905080156137a3576006546137a3906001600160a01b031661dead8361338d565b6006546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b1580156137ed57600080fd5b505af1158015613801573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6006546000906001600160a01b03858116911614801561388a57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614155b6006549091506001600160a01b038481169116148482156138a85750835b600654600090600160a01b900460ff16806138db57506001600160a01b03871660009081526021602052604090205460ff165b806138fe57506001600160a01b03861660009081526021602052604090205460ff165b905080156139165761391187878761338d565b613bec565b603f5461392490603c614b70565b421115613a2457602854600254106139c957602d805460ff1916600117905561394b613ed3565b50603e5460ff1615156000036139c457600060285461396960025490565b6139739190614d46565b90506000613982826002614b37565b603454613997906001600160a01b03166117a6565b6139a19190614d46565b11156139c2576034546139c2906001600160a01b0316611734836002614b37565b505b613a24565b60295460025411613a2457602d805460ff191690556139e6613ed3565b5060006139f260025490565b6029546139ff9190614d46565b603454909150613a22906001600160a01b0316613a1d836002614b37565b614004565b505b603754600003613a3857613a366140c3565b505b602d5460ff161515600103613b0f576000613a558660315461286b565b9050613a618882612896565b600080613a78613a7060025490565b603b5461286b565b6034549091508190613a92906001600160a01b03166117a6565b11613abe57613aa38860325461286b565b603454909250613abe908b906001600160a01b03168461338d565b600082613acb858b614d46565b613ad59190614d46565b9050613ae28b8b8361338d565b6001602f6000828254613af59190614b70565b90915550613b0590508987614399565b5050505050613bec565b602d5460ff161515600003613bec5760455460ff161580613b2d5750835b80613b355750825b15613b56576000613b488660305461286b565b9050613b548382614004565b505b600080613b65613a7060025490565b6034549091508190613b7f906001600160a01b03166117a6565b11613bab57613b908760325461286b565b603454909250613bab908a906001600160a01b03168461338d565b6000613bb78389614d46565b9050613bc48a8a8361338d565b6001602f6000828254613bd79190614b70565b90915550613be790508886614399565b505050505b506001600160a01b03166000908152602a602090815260408083204290819055602b8352818420819055602c909252909120555050505050565b60006128648284614d46565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613c6757613c67614b83565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d099190614d59565b81600181518110613d1c57613d1c614b83565b60200260200101906001600160a01b031690816001600160a01b031681525050613d67307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126d5565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613dbc908590600090869030904290600401614d76565b600060405180830381600087803b158015613dd657600080fd5b505af1158015613dea573d6000803e3d6000fd5b505050505050565b613e1d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126d5565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015613ea7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613ecc9190614de7565b5050505050565b60006001602e6000828254613ee89190614b70565b9091555050602e546001148015613f025750603e5460ff16155b15613f95576000613f156012600a614c96565b9050612710613f2582607d614b37565b613f2f9190614b4e565b603055612710613f4082607d614b37565b613f4a9190614b4e565b603155612710613f5b826055614b37565b613f659190614b4e565b603290815561271090613f79908390614b37565b613f839190614b4e565b603355506040805460ff191660011790555b6002602e5410158015613fab5750601c602e5411155b15613fcb57613fb86145a7565b506040805460ff19166001179055613ffa565b601d602e5410158015613fe157506038602e5411155b15613ffa57613fee6145e8565b506040805460ff191690555b5042603f55600190565b6001600160a01b03821661405a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016113cd565b806002600082825461406c9190614b70565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b602d5460009060ff16151560010361416f57600a6031546140e49190614b4e565b603160008282546140f59190614b70565b909155505060305461410990600a90614b4e565b6030600082825461411a9190614b70565b909155505060325461412e90600a90614b4e565b6032600082825461413f9190614b70565b909155505060335461415390600a90614b4e565b603360008282546141649190614b70565b909155506142049050565b600a60315461417e9190614b4e565b6031600082825461418f9190614d46565b90915550506030546141a390600a90614b4e565b603060008282546141b49190614b70565b90915550506032546141c890600a90614b4e565b603260008282546141d99190614d46565b90915550506033546141ed90600a90614b4e565b603360008282546141fe9190614d46565b90915550505b603954614212906006614b37565b603154111561424057603954614229906002614b37565b6031600082825461423a9190614d46565b90915550505b60395461424e906006614b37565b603054111561427c57603954614265906002614b37565b603060008282546142769190614d46565b90915550505b60395461428a906003614b37565b60325411156142ad57603954603260008282546142a79190614d46565b90915550505b6039546142bb906003614b37565b60335411156142de57603954603360008282546142d89190614d46565b90915550505b60395460315410806142f35750603954603054105b8061430d575060026039546143089190614b4e565b603254105b156143935760006143206012600a614c96565b905061271061433082607d614b37565b61433a9190614b4e565b60305561271061434b82607d614b37565b6143559190614b4e565b603155612710614366826055614b37565b6143709190614b4e565b603290815561271090614384908390614b37565b61438e9190614b4e565b603355505b50600190565b6034546000906143bd906143b5906001600160a01b03166117a6565b603d5461286b565b6038819055831061459e57603680546001600160a01b0319166001600160a01b038416179055603e5460ff1615156001036144fa57600d54603754101561447157603654603754603580546001600160a01b0390931692909190811061442557614425614b83565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001603760008282546144669190614b70565b9091555061459e9050565b600d54603754036144f557603e805460ff19169055603654603754603580546001600160a01b039093169290919081106144ad576144ad614b83565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556037556144e161464d565b506001603760008282546144669190614b70565b61459e565b600d5460375410156145365761450e61464d565b50603654603754603580546001600160a01b0390931692909190811061442557614425614b83565b600d546037540361459e5761454961464d565b50603654603754603580546001600160a01b0390931692909190811061457157614571614b83565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556037555b50600192915050565b602d5460009060ff1615156001036145d05760026029546145c89190614b4e565b602955614393565b60026028546145df9190614b4e565b60285550600190565b602d5460009060ff16151560010361461057602954614608906002614b37565b602955614622565b60285461461e906002614b37565b6028555b602e54603803614393576041546028556042546029556000602e556040805460ff1916905550600190565b60008061466461465c60025490565b60395461286b565b6034549091506000908290614681906001600160a01b03166117a6565b116146af5760345460fa9061469e906001600160a01b03166117a6565b6146a89190614b4e565b9050614712565b6146ba826002614b37565b6034546146cf906001600160a01b03166117a6565b11156146ed5760345460b49061469e906001600160a01b03166117a6565b60345460dc90614705906001600160a01b03166117a6565b61470f9190614b4e565b90505b603454600090829061472c906001600160a01b03166117a6565b6147369190614d46565b1115614823576034546037546035805461477e936001600160a01b03169290811061476357614763614b83565b6000918252602090912001546001600160a01b03168361338d565b6034546001600160a01b0316600090815260246020526040812080548392906147a8908490614b70565b9250508190555080602560008282546147c19190614b70565b925050819055506001602660008282546147db9190614b70565b9091555050603480546001600160a01b039081166000908152602a602090815260408083204290819055855485168452602b835281842081905594549093168252602c905220555b60019250505090565b600060208083528351808285015260005b818110156148595785810183015185820160400152820161483d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461232d57600080fd5b600080604083850312156148a257600080fd5b82356148ad8161487a565b946020939093013593505050565b6000602082840312156148cd57600080fd5b81356128648161487a565b6000602082840312156148ea57600080fd5b5035919050565b80358015158114611cc357600080fd5b6000806040838503121561491457600080fd5b823561491f8161487a565b915061492d602084016148f1565b90509250929050565b60008060006060848603121561494b57600080fd5b83356149568161487a565b925060208401356149668161487a565b929592945050506040919091013590565b60008060006060848603121561498c57600080fd5b83359250602084013591506149a3604085016148f1565b90509250925092565b6000806000604084860312156149c157600080fd5b833567ffffffffffffffff808211156149d957600080fd5b818601915086601f8301126149ed57600080fd5b8135818111156149fc57600080fd5b8760208260051b8501011115614a1157600080fd5b6020928301989097509590910135949350505050565b600080600060608486031215614a3c57600080fd5b505081359360208301359350604090920135919050565b600060208284031215614a6557600080fd5b612864826148f1565b60008060408385031215614a8157600080fd5b8235614a8c8161487a565b91506020830135614a9c8161487a565b809150509250929050565b8061206081018310156112c357600080fd5b6000806140c08385031215614acd57600080fd5b614ad78484614aa7565b915061492d846120608501614aa7565b600181811c90821680614afb57607f821691505b602082108103614b1b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112c3576112c3614b21565b600082614b6b57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112c3576112c3614b21565b634e487b7160e01b600052603260045260246000fd5b600060018201614bab57614bab614b21565b5060010190565b600181815b80851115614bed578160001904821115614bd357614bd3614b21565b80851615614be057918102915b93841c9390800290614bb7565b509250929050565b600082614c04575060016112c3565b81614c11575060006112c3565b8160018114614c275760028114614c3157614c4d565b60019150506112c3565b60ff841115614c4257614c42614b21565b50506001821b6112c3565b5060208310610133831016604e8410600b8410161715614c70575081810a6112c3565b614c7a8383614bb2565b8060001904821115614c8e57614c8e614b21565b029392505050565b600061286460ff841683614bf5565b600060208284031215614cb757600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156112c3576112c3614b21565b600060208284031215614d6b57600080fd5b81516128648161487a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614dc65784516001600160a01b031683529383019391830191600101614da1565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215614dfc57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122097095947a30a69f3f9f7bc85ecb01d0067d9175bd7893e1ffac64e47a0a7244a64736f6c63430008120033

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

0000000000000000000000000dd4898b07dde5b6258bae80e9ab96556a0f1bb3

-----Decoded View---------------
Arg [0] : _airdropAddress (address): 0x0dd4898b07DDe5b6258bAE80E9ab96556A0f1Bb3

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000dd4898b07dde5b6258bae80e9ab96556a0f1bb3


Deployed Bytecode Sourcemap

58578:31480:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41524:201;;;;;;;;;;-1:-1:-1;41524:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;41524:201:0;1023:187:1;60101:63:0;;;;;;;;;;-1:-1:-1;60101:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;60224:25;;;;;;;;;;;;;;;;;;;1613::1;;;1601:2;1586:18;60224:25:0;1467:177:1;58655:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1840:32:1;;;1822:51;;1810:2;1795:18;58655:51:0;1649:230:1;61109:45:0;;;;;;;;;;-1:-1:-1;61109:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;40293:108;;;;;;;;;;-1:-1:-1;40381:12:0;;40293:108;;69255:157;;;;;;;;;;-1:-1:-1;69255:157:0;;;;;:::i;:::-;;:::i;:::-;;59244:47;;;;;;;;;;;;;;;;59025:36;;;;;;;;;;;;;;;;59907:33;;;;;;;;;;;;;;;;59867;;;;;;;;;;;;;;;;66697:240;;;;;;;;;;-1:-1:-1;66697:240:0;;;;;:::i;:::-;;:::i;68705:132::-;;;;;;;;;;-1:-1:-1;68705:132:0;;;;;:::i;:::-;;:::i;84434:1636::-;;;;;;;;;;-1:-1:-1;84434:1636:0;;;;;:::i;:::-;;:::i;42305:261::-;;;;;;;;;;-1:-1:-1;42305:261:0;;;;;:::i;:::-;;:::i;58748:53::-;;;;;;;;;;;;58794:6;58748:53;;59154:45;;;;;;;;;;;;;;;;61217:47;;;;;;;;;;-1:-1:-1;61217:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;61329:18;;;;;;;;;;;;;;;;59114:33;;;;;;;;;;-1:-1:-1;59114:33:0;;;;;;;;40135:93;;;;;;;;;;-1:-1:-1;40135:93:0;;40218:2;3365:36:1;;3353:2;3338:18;40135:93:0;3223:184:1;61936:28:0;;;;;;;;;;-1:-1:-1;61936:28:0;;;;;;;;61803:27;;;;;;;;;;;;;;;;42975:238;;;;;;;;;;-1:-1:-1;42975:238:0;;;;;:::i;:::-;;:::i;61769:27::-;;;;;;;;;;;;;;;;61737:25;;;;;;;;;;;;;;;;58713:28;;;;;;;;;;-1:-1:-1;58713:28:0;;;;-1:-1:-1;;;;;58713:28:0;;;59342:33;;;;;;;;;;-1:-1:-1;59342:33:0;;;;;;;;69420:126;;;;;;;;;;-1:-1:-1;69420:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;69510:28:0;69486:4;69510:28;;;:19;:28;;;;;;;;;69420:126;62035:25;;;;;;;;;;-1:-1:-1;62035:25:0;;;;;;;;61273:21;;;;;;;;;;-1:-1:-1;61273:21:0;;;;;;;;61709;;;;;;;;;;;;;;;;61902:27;;;;;;;;;;;;;;;;62067;;;;;;;;;;;;;;;;61670:32;;;;;;;;;;;;;;;;59722:28;;;;;;;;;;;;;;;;59422:30;;;;;;;;;;-1:-1:-1;59422:30:0;;;;;;;;;;;40464:127;;;;;;;;;;-1:-1:-1;40464:127:0;;;;;:::i;:::-;;:::i;32619:103::-;;;;;;;;;;;;;:::i;78971:447::-;;;;;;;;;;-1:-1:-1;78971:447:0;;;;;:::i;:::-;;:::i;89866:189::-;;;;;;;;;;-1:-1:-1;89866:189:0;;;;;:::i;:::-;;:::i;66030:121::-;;;;;;;;;;;;;:::i;67174:144::-;;;;;;;;;;-1:-1:-1;67174:144:0;;;;;:::i;:::-;;:::i;58840:30::-;;;;;;;;;;-1:-1:-1;58840:30:0;;;;-1:-1:-1;;;;;58840:30:0;;;59615;;;;;;;;;;;;;;;;62101:33;;;;;;;;;;-1:-1:-1;62101:33:0;;;;;;;;89571:285;;;;;;;;;;-1:-1:-1;89571:285:0;;;;;:::i;:::-;;:::i;67434:403::-;;;;;;;;;;-1:-1:-1;67434:403:0;;;;;:::i;:::-;;:::i;61481:29::-;;;;;;;;;;-1:-1:-1;61481:29:0;;;;-1:-1:-1;;;;;61481:29:0;;;61517:63;;;;;;;;;;-1:-1:-1;61517:63:0;;;;;:::i;:::-;;:::i;65822:200::-;;;;;;;;;;;;;:::i;61303:19::-;;;;;;;;;;;;;;;;31978:87;;;;;;;;;;-1:-1:-1;32051:6:0;;-1:-1:-1;;;;;32051:6:0;31978:87;;58877:24;;;;;;;;;;-1:-1:-1;58877:24:0;;;;-1:-1:-1;;;;;58877:24:0;;;61078;;;;;;;;;;;;;;;;59757:31;;;;;;;;;;;;;;;;67326:100;;;;;;;;;;-1:-1:-1;67326:100:0;;;;;:::i;:::-;;:::i;39383:104::-;;;;;;;;;;;;;:::i;61383:22::-;;;;;;;;;;;;;;;;61414:25;;;;;;;;;;;;;;;;61446:26;;;;;;;;;;;;;;;;68455:242;;;;;;;;;;-1:-1:-1;68455:242:0;;;;;:::i;:::-;;:::i;59689:24::-;;;;;;;;;;;;;;;;61163:47;;;;;;;;;;-1:-1:-1;61163:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;59298:35;;;;;;;;;;;;;;;;61971:26;;;;;;;;;;;;;;;;59947:27;;;;;;;;;;;;;;;;59833:25;;;;;;;;;;;;;;;;43716:436;;;;;;;;;;-1:-1:-1;43716:436:0;;;;;:::i;:::-;;:::i;59206:29::-;;;;;;;;;;;;;;;;40797:193;;;;;;;;;;-1:-1:-1;40797:193:0;;;;;:::i;:::-;;:::i;69039:208::-;;;;;;;;;;-1:-1:-1;69039:208:0;;;;;:::i;:::-;;:::i;87727:254::-;;;;;;;;;;-1:-1:-1;87727:254:0;;;;;:::i;:::-;;:::i;61587:35::-;;;;;;;;;;-1:-1:-1;61587:35:0;;;;-1:-1:-1;;;;;61587:35:0;;;89427:136;;;;;;;;;;;;;:::i;60290:57::-;;;;;;;;;;-1:-1:-1;60290:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59382:33;;;;;;;;;;-1:-1:-1;59382:33:0;;;;;;;;;;;68265:182;;;;;;;;;;-1:-1:-1;68265:182:0;;;;;:::i;:::-;;:::i;67845:412::-;;;;;;;;;;-1:-1:-1;67845:412:0;;;;;:::i;:::-;;:::i;66945:221::-;;;;;;;;;;-1:-1:-1;66945:221:0;;;;;:::i;:::-;;:::i;61875:20::-;;;;;;;;;;-1:-1:-1;61875:20:0;;;;;;;;59532:40;;;;;;;;;;-1:-1:-1;59532:40:0;;;;;;;;58910:35;;;;;;;;;;;;;;;;60171:46;;;;;;;;;;-1:-1:-1;60171:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;60256:25;;;;;;;;;;;;;;;;66302:387;;;;;;;;;;-1:-1:-1;66302:387:0;;;;;:::i;:::-;;:::i;61047:24::-;;;;;;;;;;;;;;;;61629:34;;;;;;;;;;;;;;;;59581:27;;;;;;;;;;;;;;;;59068:37;;;;;;;;;;;;;;;;41053:151;;;;;;;;;;-1:-1:-1;41053:151:0;;;;;:::i;:::-;;:::i;62004:24::-;;;;;;;;;;;;;;;;86078:1136;;;;;;;;;;-1:-1:-1;86078:1136:0;;;;;:::i;:::-;;:::i;58952:33::-;;;;;;;;;;;;;;;;66159:135;;;;;;;;;;;;;:::i;65695:119::-;;;;;;;;;;-1:-1:-1;65695:119:0;;;;;:::i;:::-;;:::i;61837:31::-;;;;;;;;;;;;;;;;65278:409;;;;;;;;;;-1:-1:-1;65278:409:0;;;;;:::i;:::-;;:::i;59652:30::-;;;;;;;;;;;;;;;;61354:22;;;;;;;;;;;;;;;;32877:201;;;;;;;;;;-1:-1:-1;32877:201:0;;;;;:::i;:::-;;:::i;87222:497::-;;;;;;;;;;-1:-1:-1;87222:497:0;;;;;:::i;:::-;;:::i;59795:31::-;;;;;;;;;;;;;;;;58992:24;;;;;;;;;;;;;;;;79968:755;;;;;;;;;;-1:-1:-1;79968:755:0;;;;;:::i;:::-;;:::i;39164:100::-;39218:13;39251:5;39244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:100;:::o;41524:201::-;41607:4;30609:10;41663:32;30609:10;41679:7;41688:6;41663:8;:32::i;:::-;41713:4;41706:11;;;41524:201;;;;;:::o;69255:157::-;31864:13;:11;:13::i;:::-;69362:9:::1;::::0;69334:38:::1;::::0;-1:-1:-1;;;;;69362:9:0;;::::1;::::0;69334:38;::::1;::::0;::::1;::::0;69362:9:::1;::::0;69334:38:::1;69383:9;:21:::0;;-1:-1:-1;;;;;;69383:21:0::1;-1:-1:-1::0;;;;;69383:21:0;;;::::1;::::0;;;::::1;::::0;;69255:157::o;66697:240::-;31864:13;:11;:13::i;:::-;66820:4:::1;66812;66791:13;40381:12:::0;;;40293:108;66791:13:::1;:17;::::0;66807:1:::1;66791:17;:::i;:::-;66790:26;;;;:::i;:::-;66789:35;;;;:::i;:::-;66779:6;:45;;66771:105;;;::::0;-1:-1:-1;;;66771:105:0;;6978:2:1;66771:105:0::1;::::0;::::1;6960:21:1::0;7017:2;6997:18;;;6990:30;7056:34;7036:18;;;7029:62;-1:-1:-1;;;7107:18:1;;;7100:45;7162:19;;66771:105:0::1;;;;;;;;;66910:19;:6:::0;66920:8:::1;66910:19;:::i;:::-;66887:20;:42:::0;-1:-1:-1;66697:240:0:o;68705:132::-;31864:13;:11;:13::i;:::-;-1:-1:-1;;;;;68790:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;68790:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68705:132::o;84434:1636::-;84499:4;-1:-1:-1;;;;;84524:22:0;;84516:31;;;;;;84566:13;;;;;;;84558:22;;;;;;-1:-1:-1;;;;;15047:19:0;;;:23;84591:118;;;;-1:-1:-1;;;84591:118:0;;7394:2:1;84591:118:0;;;7376:21:1;7433:2;7413:18;;;7406:30;7472:34;7452:18;;;7445:62;7543:34;7523:18;;;7516:62;-1:-1:-1;;;7594:19:1;;;7587:43;7647:19;;84591:118:0;7192:480:1;84591:118:0;-1:-1:-1;;;;;84729:29:0;;;;;;:19;:29;;;;;;;;84728:30;84720:39;;;;;;84829:15;;-1:-1:-1;;;;;84846:22:0;;84770:19;84846:22;;;:12;:22;;;;;;84770:19;;;;84820:49;;84829:15;84820:8;:49::i;:::-;84903:15;;-1:-1:-1;;;;;84920:22:0;;84880:11;84920:22;;;:12;:22;;;;;;84806:63;;-1:-1:-1;84880:11:0;84894:49;;84903:15;84894:8;:49::i;:::-;84972:14;;84880:63;;-1:-1:-1;;;;;;84972:14:0;;;84960:26;;;;84956:1084;;85029:15;:6;85038;85029:15;:::i;:::-;85011;:33;85003:117;;;;-1:-1:-1;;;85003:117:0;;8009:2:1;85003:117:0;;;7991:21:1;8048:2;8028:18;;;8021:30;8087:34;8067:18;;;8060:62;8158:34;8138:18;;;8131:62;-1:-1:-1;;;8209:19:1;;;8202:38;8257:19;;85003:117:0;7807:475:1;85003:117:0;85149:52;85167:19;85177:8;85167:9;:19::i;:::-;85188:12;;85149:17;:52::i;:::-;85135:66;;85216:28;85222:8;85232:11;85216:5;:28::i;:::-;-1:-1:-1;;;;;85259:20:0;;;;;;:10;:20;;;;;85282:15;85259:38;;84956:1084;;;85488:16;:6;85497:7;85488:16;:::i;:::-;85470:15;:34;:72;;;-1:-1:-1;85526:16:0;:6;85535:7;85526:16;:::i;:::-;85508:15;:34;85470:72;85462:129;;;;-1:-1:-1;;;85462:129:0;;8489:2:1;85462:129:0;;;8471:21:1;8528:2;8508:18;;;8501:30;8567:34;8547:18;;;8540:62;-1:-1:-1;;;8618:18:1;;;8611:42;8670:19;;85462:129:0;8287:408:1;85462:129:0;85628:16;:6;85637:7;85628:16;:::i;:::-;85610:15;:34;85606:423;;;85679:52;85697:19;85707:8;85697:9;:19::i;85679:52::-;85665:66;;85750:28;85756:8;85766:11;85750:5;:28::i;:::-;-1:-1:-1;;;;;85797:22:0;;;;;;:12;:22;;;;;85822:15;85797:40;;85606:423;;;85881:16;:6;85890:7;85881:16;:::i;:::-;85863:15;:34;85859:170;;;85918:36;85924:8;85934:19;85944:8;85934:9;:19::i;:::-;85918:5;:36::i;:::-;-1:-1:-1;;;;;85973:22:0;;;;;;:12;:22;;;;;85998:15;85973:40;;85859:170;-1:-1:-1;86057:5:0;;84434:1636;-1:-1:-1;;;;84434:1636:0:o;42305:261::-;42402:4;30609:10;42460:38;42476:4;30609:10;42491:6;42460:15;:38::i;:::-;42509:27;42519:4;42525:2;42529:6;42509:9;:27::i;:::-;-1:-1:-1;42554:4:0;;42305:261;-1:-1:-1;;;;42305:261:0:o;42975:238::-;43063:4;30609:10;43119:64;30609:10;43135:7;43172:10;43144:25;30609:10;43135:7;43144:9;:25::i;:::-;:38;;;;:::i;:::-;43119:8;:64::i;40464:127::-;-1:-1:-1;;;;;40565:18:0;40538:7;40565:18;;;;;;;;;;;;40464:127::o;32619:103::-;31864:13;:11;:13::i;:::-;32684:30:::1;32711:1;32684:18;:30::i;:::-;32619:103::o:0;78971:447::-;31864:13;:11;:13::i;:::-;79125:3:::1;79102:19;:26;;79094:90;;;::::0;-1:-1:-1;;;79094:90:0;;8902:2:1;79094:90:0::1;::::0;::::1;8884:21:1::0;8941:2;8921:18;;;8914:30;8980:34;8960:18;;;8953:62;-1:-1:-1;;;9031:18:1;;;9024:49;9090:19;;79094:90:0::1;8700:415:1::0;79094:90:0::1;79215:4;79203:8;:16;;:33;;;;-1:-1:-1::0;79223:13:0;79203:33:::1;79195:94;;;::::0;-1:-1:-1;;;79195:94:0;;9322:2:1;79195:94:0::1;::::0;::::1;9304:21:1::0;9361:2;9341:18;;;9334:30;9400:34;9380:18;;;9373:62;-1:-1:-1;;;9451:18:1;;;9444:46;9507:19;;79195:94:0::1;9120:412:1::0;79195:94:0::1;79300:15;:37:::0;;;;79348:16:::1;:27:::0;79386:13:::1;:24:::0;;-1:-1:-1;;79386:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78971:447::o;89866:189::-;89954:6;89949:99;89966:16;;;89949:99;;;90004:32;90019:5;;90025:1;90019:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;90029:6;90004:14;:32::i;:::-;-1:-1:-1;89984:3:0;;;;:::i;:::-;;;;89949:99;;;;89866:189;;;:::o;66030:121::-;66082:4;31864:13;:11;:13::i;:::-;-1:-1:-1;66099:14:0::1;:22:::0;;-1:-1:-1;;66099:22:0::1;::::0;;;66030:121;:::o;67174:144::-;31864:13;:11;:13::i;:::-;-1:-1:-1;;;;;67264:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;67264:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67174:144::o;89571:285::-;89635:4;;89652:174;89673:25;:32;89669:36;;89652:174;;;89763:4;-1:-1:-1;;;;;89731:36:0;:25;89757:1;89731:28;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;89731:28:0;:36;89727:88;;-1:-1:-1;89795:4:0;;89571:285;-1:-1:-1;;89571:285:0:o;89727:88::-;89707:3;;;;:::i;:::-;;;;89652:174;;;-1:-1:-1;89843:5:0;;89571:285;-1:-1:-1;;89571:285:0:o;67434:403::-;31864:13;:11;:13::i;:::-;67584:15:::1;:31:::0;;;67626:15:::1;:31:::0;;;67668:9:::1;:19:::0;;;67680:7;67713:33:::1;67644:13:::0;67602;67713:33:::1;:::i;:::-;:45;;;;:::i;:::-;67698:12;:60:::0;;;67793:2:::1;-1:-1:-1::0;67777:18:0::1;67769:60;;;::::0;-1:-1:-1;;;67769:60:0;;10011:2:1;67769:60:0::1;::::0;::::1;9993:21:1::0;10050:2;10030:18;;;10023:30;10089:31;10069:18;;;10062:59;10138:18;;67769:60:0::1;9809:353:1::0;67769:60:0::1;67434:403:::0;;;:::o;61517:63::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61517:63:0;;-1:-1:-1;61517:63:0;:::o;65822:200::-;31864:13;:11;:13::i;:::-;65875::::1;:20:::0;;-1:-1:-1;;65875:20:0::1;;;::::0;;65924:15:::1;65906;:33:::0;;;65950:14:::1;:32:::0;65993:13:::1;:21:::0;;-1:-1:-1;;65993:21:0::1;::::0;;65822:200::o;67326:100::-;31864:13;:11;:13::i;:::-;67397:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;67397:21:0;;::::1;::::0;;;::::1;::::0;;67326:100::o;39383:104::-;39439:13;39472:7;39465:14;;;;;:::i;68455:242::-;31864:13;:11;:13::i;:::-;68562::::1;::::0;-1:-1:-1;;;;;68562:13:0;;::::1;68554:21:::0;;::::1;::::0;68546:91:::1;;;::::0;-1:-1:-1;;;68546:91:0;;10369:2:1;68546:91:0::1;::::0;::::1;10351:21:1::0;10408:2;10388:18;;;10381:30;10447:34;10427:18;;;10420:62;10518:27;10498:18;;;10491:55;10563:19;;68546:91:0::1;10167:421:1::0;68546:91:0::1;68648:41;68677:4;68683:5;68648:28;:41::i;:::-;68455:242:::0;;:::o;43716:436::-;43809:4;30609:10;43809:4;43892:25;30609:10;43909:7;43892:9;:25::i;:::-;43865:52;;43956:15;43936:16;:35;;43928:85;;;;-1:-1:-1;;;43928:85:0;;10795:2:1;43928:85:0;;;10777:21:1;10834:2;10814:18;;;10807:30;10873:34;10853:18;;;10846:62;-1:-1:-1;;;10924:18:1;;;10917:35;10969:19;;43928:85:0;10593:401:1;43928:85:0;44049:60;44058:5;44065:7;44093:15;44074:16;:34;44049:8;:60::i;40797:193::-;40876:4;30609:10;40932:28;30609:10;40949:2;40953:6;40932:9;:28::i;69039:208::-;31864:13;:11;:13::i;:::-;69176:15:::1;::::0;69133:59:::1;::::0;-1:-1:-1;;;;;69176:15:0;;::::1;::::0;69133:59;::::1;::::0;::::1;::::0;69176:15:::1;::::0;69133:59:::1;69203:15;:36:::0;;-1:-1:-1;;;;;;69203:36:0::1;-1:-1:-1::0;;;;;69203:36:0;;;::::1;::::0;;;::::1;::::0;;69039:208::o;87727:254::-;87807:4;31864:13;:11;:13::i;:::-;87834:10:::1;87826:33;;;::::0;::::1;;-1:-1:-1::0;;;;;87878:29:0;::::1;87870:38;;;::::0;::::1;;-1:-1:-1::0;87919:14:0::1;:32:::0;;-1:-1:-1;;;;;;87919:32:0::1;-1:-1:-1::0;;;;;87919:32:0;::::1;;::::0;;-1:-1:-1;31888:1:0::1;87727:254:::0;;;:::o;89427:136::-;89493:15;;:25;;89511:7;89493:25;:::i;:::-;89475:15;:43;89467:52;;;;;;89530:25;:23;:25::i;68265:182::-;31864:13;:11;:13::i;:::-;-1:-1:-1;;;;;68350:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;68350:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;68405:34;;1163:41:1;;;68405:34:0::1;::::0;1136:18:1;68405:34:0::1;;;;;;;68265:182:::0;;:::o;67845:412::-;31864:13;:11;:13::i;:::-;67996:16:::1;:32:::0;;;68039:16:::1;:32:::0;;;68082:10:::1;:20:::0;;;68095:7;68129:35:::1;68058:13:::0;68015;68129:35:::1;:::i;:::-;:48;;;;:::i;:::-;68113:13;:64:::0;;;68213:2:::1;-1:-1:-1::0;68196:19:0::1;68188:61;;;::::0;-1:-1:-1;;;68188:61:0;;10011:2:1;68188:61:0::1;::::0;::::1;9993:21:1::0;10050:2;10030:18;;;10023:30;10089:31;10069:18;;;10062:59;10138:18;;68188:61:0::1;9809:353:1::0;66945:221:0;31864:13;:11;:13::i;:::-;67071:4:::1;67063;67042:13;40381:12:::0;;;40293:108;67042:13:::1;:17;::::0;67058:1:::1;67042:17;:::i;:::-;67041:26;;;;:::i;:::-;67040:35;;;;:::i;:::-;67030:6;:45;;67022:94;;;::::0;-1:-1:-1;;;67022:94:0;;11201:2:1;67022:94:0::1;::::0;::::1;11183:21:1::0;11240:2;11220:18;;;11213:30;11279:34;11259:18;;;11252:62;-1:-1:-1;;;11330:18:1;;;11323:34;11374:19;;67022:94:0::1;10999:400:1::0;67022:94:0::1;67139:19;:6:::0;67149:8:::1;67139:19;:::i;:::-;67127:9;:31:::0;-1:-1:-1;66945:221:0:o;66302:387::-;66383:4;31864:13;:11;:13::i;:::-;66442:6:::1;66421:13;40381:12:::0;;;40293:108;66421:13:::1;:17;::::0;66437:1:::1;66421:17;:::i;:::-;66420:28;;;;:::i;:::-;66407:9;:41;;66399:107;;;::::0;-1:-1:-1;;;66399:107:0;;11606:2:1;66399:107:0::1;::::0;::::1;11588:21:1::0;11645:2;11625:18;;;11618:30;11684:34;11664:18;;;11657:62;-1:-1:-1;;;11735:18:1;;;11728:51;11796:19;;66399:107:0::1;11404:417:1::0;66399:107:0::1;66560:3;66539:13;40381:12:::0;;;40293:108;66539:13:::1;:17;::::0;66555:1:::1;66539:17;:::i;:::-;66538:25;;;;:::i;:::-;66525:9;:38;;66517:101;;;::::0;-1:-1:-1;;;66517:101:0;;12028:2:1;66517:101:0::1;::::0;::::1;12010:21:1::0;12067:2;12047:18;;;12040:30;12106:34;12086:18;;;12079:62;-1:-1:-1;;;12157:18:1;;;12150:48;12215:19;;66517:101:0::1;11826:414:1::0;66517:101:0::1;-1:-1:-1::0;66629:18:0::1;:30:::0;66677:4:::1;::::0;66302:387::o;41053:151::-;-1:-1:-1;;;;;41169:18:0;;;41142:7;41169:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;41053:151::o;86078:1136::-;86144:4;-1:-1:-1;;;;;86170:22:0;;86162:31;;;;;;86212:13;;;;;;;86204:22;;;;;;-1:-1:-1;;;;;15047:19:0;;;86237:64;;;;-1:-1:-1;;;86237:64:0;;12447:2:1;86237:64:0;;;12429:21:1;12486:2;12466:18;;;12459:30;12525:25;12505:18;;;12498:53;12568:18;;86237:64:0;12245:347:1;86237:64:0;-1:-1:-1;;;;;86321:29:0;;;;;;:19;:29;;;;;;;;86320:30;86312:39;;;;;;86421:15;;-1:-1:-1;;;;;86438:22:0;;86362:19;86438:22;;;:12;:22;;;;;;86362:19;;;;86412:49;;86421:15;86412:8;:49::i;:::-;86495:15;;-1:-1:-1;;;;;86512:22:0;;86472:11;86512:22;;;:12;:22;;;;;;86398:63;;-1:-1:-1;86472:11:0;86486:49;;86495:15;86486:8;:49::i;:::-;86472:63;-1:-1:-1;86676:16:0;:6;86685:7;86676:16;:::i;:::-;86658:15;:34;86657:76;;;-1:-1:-1;86716:16:0;:6;86725:7;86716:16;:::i;:::-;86698:15;:34;86657:76;86649:130;;;;-1:-1:-1;;;86649:130:0;;12799:2:1;86649:130:0;;;12781:21:1;12838:2;12818:18;;;12811:30;12877:34;12857:18;;;12850:62;-1:-1:-1;;;12928:18:1;;;12921:39;12977:19;;86649:130:0;12597:405:1;86649:130:0;86812:16;:6;86821:7;86812:16;:::i;:::-;86794:15;:34;86790:395;;;86859:52;86877:19;86887:8;86877:9;:19::i;86859:52::-;86845:66;;86926:28;86932:8;86942:11;86926:5;:28::i;:::-;-1:-1:-1;;;;;86969:22:0;;;;;;:12;:22;;;;;86994:15;86969:40;;86790:395;;;87049:16;:6;87058:7;87049:16;:::i;:::-;87031:15;:34;87027:158;;;87082:36;87088:8;87098:19;87108:8;87098:9;:19::i;87082:36::-;-1:-1:-1;;;;;;;;;87133:22:0;;;;;:12;:22;;;;;87158:15;87133:40;;87202:4;;86078:1136::o;66159:135::-;66219:4;31864:13;:11;:13::i;:::-;-1:-1:-1;66236:20:0::1;:28:::0;;-1:-1:-1;;66236:28:0::1;::::0;;;66159:135;:::o;65695:119::-;31864:13;:11;:13::i;:::-;65774:14:::1;:32:::0;;-1:-1:-1;;65774:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65695:119::o;65278:409::-;31864:13;:11;:13::i;:::-;65430:4:::1;65405:22;65419:8:::0;65405:11;:22:::1;:::i;:::-;:29;65397:38;;;::::0;::::1;;65479:4;65454:22;65468:8:::0;65454:11;:22:::1;:::i;:::-;:29;65446:38;;;::::0;::::1;;65497:13;65513:16;40218:2:::0;65513::::1;:16;:::i;:::-;65497:32:::0;-1:-1:-1;65572:5:0::1;65550:19;65561:8:::0;65497:32;65550:19:::1;:::i;:::-;:27;;;;:::i;:::-;65540:7;:37:::0;65626:5:::1;65601:22;65612:11:::0;65601:8;:22:::1;:::i;:::-;:30;;;;:::i;:::-;65588:10;:43:::0;65674:5:::1;65652:19;65663:8:::0;65652;:19:::1;:::i;:::-;:27;;;;:::i;:::-;65642:7;:37:::0;-1:-1:-1;;;;65278:409:0:o;32877:201::-;31864:13;:11;:13::i;:::-;-1:-1:-1;;;;;32966:22:0;::::1;32958:73;;;::::0;-1:-1:-1;;;32958:73:0;;14592:2:1;32958:73:0::1;::::0;::::1;14574:21:1::0;14631:2;14611:18;;;14604:30;14670:34;14650:18;;;14643:62;-1:-1:-1;;;14721:18:1;;;14714:36;14767:19;;32958:73:0::1;14390:402:1::0;32958:73:0::1;33042:28;33061:8;33042:18;:28::i;:::-;32877:201:::0;:::o;87222:497::-;87329:4;31864:13;:11;:13::i;:::-;87351:6:::1;87346:344;87367:3;87363:1;:7;87346:344;;;87416:1;87396:5:::0;87402:1;87396:8:::1;::::0;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;87396:22:0::1;;87392:287;;87439:49;87455:10;87467:5;87473:1;87467:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;87477:7;87485:1;87477:10;;;;;;;:::i;:::-;;;;;87439:15;:49::i;:::-;87530:15;87507:10;:20;87518:5;87524:1;87518:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;87507:20:0::1;-1:-1:-1::0;;;;;87507:20:0::1;;;;;;;;;;;;:38;;;;87589:15;87564:12;:22;87577:5;87583:1;87577:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;87564:22:0::1;-1:-1:-1::0;;;;;87564:22:0::1;;;;;;;;;;;;:40;;;;87648:15;87623:12;:22;87636:5;87642:1;87636:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;87623:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;87623:22:0;:40;87392:287:::1;87372:3:::0;::::1;::::0;::::1;:::i;:::-;;;;87346:344;;;-1:-1:-1::0;87707:4:0::1;::::0;87222:497;-1:-1:-1;;;87222:497:0:o;79968:755::-;80052:4;31864:13;:11;:13::i;:::-;80118:19:::1;;80095:20;;:42;;;;:::i;:::-;80077:15;:60;80069:105;;;::::0;-1:-1:-1;;;80069:105:0;;14999:2:1;80069:105:0::1;::::0;::::1;14981:21:1::0;;;15018:18;;;15011:30;15077:34;15057:18;;;15050:62;15129:18;;80069:105:0::1;14797:356:1::0;80069:105:0::1;80204:4;80193:7;:15;;80185:70;;;::::0;-1:-1:-1;;;80185:70:0;;15360:2:1;80185:70:0::1;::::0;::::1;15342:21:1::0;15399:2;15379:18;;;15372:30;15438:34;15418:18;;;15411:62;-1:-1:-1;;;15489:18:1;;;15482:40;15539:19;;80185:70:0::1;15158:406:1::0;80185:70:0::1;80289:15;80266:20;:38:::0;80363:13:::1;::::0;80348:29:::1;::::0;-1:-1:-1;;;80348:29:0;;-1:-1:-1;;;;;80363:13:0;;::::1;80348:29;::::0;::::1;1822:51:1::0;80317:28:0::1;::::0;80348:4:::1;::::0;:14:::1;::::0;1795:18:1;;80348:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80317:60:::0;-1:-1:-1;80388:20:0::1;80411:44;80449:5;80411:33;80317:60:::0;80436:7;80411:24:::1;:33::i;:::-;:37:::0;::::1;:44::i;:::-;80388:67:::0;-1:-1:-1;80472:16:0;;80468:110:::1;;80521:13;::::0;80505:61:::1;::::0;-1:-1:-1;;;;;80521:13:0::1;80544:6;80553:12:::0;80505:15:::1;:61::i;:::-;80627:13;::::0;80652:11:::1;::::0;;-1:-1:-1;;;;;;80652:11:0;;;;-1:-1:-1;;;;;80627:13:0;;::::1;::::0;;;80652:9:::1;::::0;:11:::1;::::0;;::::1;::::0;80590:19:::1;::::0;80652:11;;;;;;;80590:19;80627:13;80652:11;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;80679:14:0::1;::::0;::::1;::::0;-1:-1:-1;80679:14:0;;-1:-1:-1;80679:14:0::1;-1:-1:-1::0;80711:4:0::1;::::0;79968:755;-1:-1:-1;;;;79968:755:0:o;47709:346::-;-1:-1:-1;;;;;47811:19:0;;47803:68;;;;-1:-1:-1;;;47803:68:0;;15960:2:1;47803:68:0;;;15942:21:1;15999:2;15979:18;;;15972:30;16038:34;16018:18;;;16011:62;-1:-1:-1;;;16089:18:1;;;16082:34;16133:19;;47803:68:0;15758:400:1;47803:68:0;-1:-1:-1;;;;;47890:21:0;;47882:68;;;;-1:-1:-1;;;47882:68:0;;16365:2:1;47882:68:0;;;16347:21:1;16404:2;16384:18;;;16377:30;16443:34;16423:18;;;16416:62;-1:-1:-1;;;16494:18:1;;;16487:32;16536:19;;47882:68:0;16163:398:1;47882:68:0;-1:-1:-1;;;;;47963:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;48015:32;;1613:25:1;;;48015:32:0;;1586:18:1;48015:32:0;;;;;;;47709:346;;;:::o;32143:132::-;32051:6;;-1:-1:-1;;;;;32051:6:0;30609:10;32207:23;32199:68;;;;-1:-1:-1;;;32199:68:0;;16768:2:1;32199:68:0;;;16750:21:1;;;16787:18;;;16780:30;16846:34;16826:18;;;16819:62;16898:18;;32199:68:0;16566:356:1;583:106:0;641:7;672:1;668;:5;:13;;680:1;668:13;;;676:1;668:13;661:20;583:106;-1:-1:-1;;;583:106:0:o;80731:172::-;80806:7;;80858:16;40218:2;80858;:16;:::i;:::-;80841:13;80850:4;80841:6;:13;:::i;:::-;80840:34;;;;:::i;:::-;80826:48;80731:172;-1:-1:-1;;;;80731:172:0:o;46596:675::-;-1:-1:-1;;;;;46680:21:0;;46672:67;;;;-1:-1:-1;;;46672:67:0;;17129:2:1;46672:67:0;;;17111:21:1;17168:2;17148:18;;;17141:30;17207:34;17187:18;;;17180:62;-1:-1:-1;;;17258:18:1;;;17251:31;17299:19;;46672:67:0;16927:397:1;46672:67:0;-1:-1:-1;;;;;46839:18:0;;46814:22;46839:18;;;;;;;;;;;46876:24;;;;46868:71;;;;-1:-1:-1;;;46868:71:0;;17531:2:1;46868:71:0;;;17513:21:1;17570:2;17550:18;;;17543:30;17609:34;17589:18;;;17582:62;-1:-1:-1;;;17660:18:1;;;17653:32;17702:19;;46868:71:0;17329:398:1;46868:71:0;-1:-1:-1;;;;;46975:18:0;;:9;:18;;;;;;;;;;;46996:23;;;46975:44;;47114:12;:22;;;;;;;47165:37;1613:25:1;;;46975:9:0;;:18;47165:37;;1586:18:1;47165:37:0;;;;;;;67434:403;;;:::o;48346:419::-;48447:24;48474:25;48484:5;48491:7;48474:9;:25::i;:::-;48447:52;;-1:-1:-1;;48514:16:0;:37;48510:248;;48596:6;48576:16;:26;;48568:68;;;;-1:-1:-1;;;48568:68:0;;17934:2:1;48568:68:0;;;17916:21:1;17973:2;17953:18;;;17946:30;18012:31;17992:18;;;17985:59;18061:18;;48568:68:0;17732:353:1;48568:68:0;48680:51;48689:5;48696:7;48724:6;48705:16;:25;48680:8;:51::i;69604:3755::-;-1:-1:-1;;;;;69738:18:0;;69730:68;;;;-1:-1:-1;;;69730:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69817:16:0;;69809:64;;;;-1:-1:-1;;;69809:64:0;;;;;;;:::i;:::-;69890:6;69900:1;69890:11;69886:93;;69918:28;69934:4;69940:2;69944:1;69918:15;:28::i;69886:93::-;69995:13;;;;69991:100;;;70025:33;70041:4;70047:2;70051:6;70025:15;:33::i;69991:100::-;70107:14;;;;70103:1497;;;32051:6;;-1:-1:-1;;;;;70142:15:0;;;32051:6;;70142:15;;;;:32;;-1:-1:-1;32051:6:0;;-1:-1:-1;;;;;70161:13:0;;;32051:6;;70161:13;;70142:32;:52;;;;-1:-1:-1;;;;;;70178:16:0;;;;70142:52;:77;;;;-1:-1:-1;;;;;;70198:21:0;;70212:6;70198:21;;70142:77;:90;;;;-1:-1:-1;70224:8:0;;-1:-1:-1;;;70224:8:0;;;;70223:9;70142:90;70138:1451;;;70258:13;;;;;;;70253:150;;-1:-1:-1;;;;;70304:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;70333:23:0;;;;;;:19;:23;;;;;;;;70304:52;70296:87;;;;-1:-1:-1;;;70296:87:0;;19102:2:1;70296:87:0;;;19084:21:1;19141:2;19121:18;;;19114:30;-1:-1:-1;;;19160:18:1;;;19153:52;19222:18;;70296:87:0;18900:346:1;70296:87:0;70427:20;;;;70423:425;;;32051:6;;-1:-1:-1;;;;;70476:13:0;;;32051:6;;70476:13;;;;:47;;;70507:15;-1:-1:-1;;;;;70493:30:0;:2;-1:-1:-1;;;;;70493:30:0;;;70476:47;:79;;;;-1:-1:-1;70541:13:0;;-1:-1:-1;;;;;70527:28:0;;;70541:13;;70527:28;;70476:79;70472:357;;;70621:9;70592:39;;;;:28;:39;;;;;;70634:12;-1:-1:-1;70584:140:0;;;;-1:-1:-1;;;70584:140:0;;19453:2:1;70584:140:0;;;19435:21:1;19492:2;19472:18;;;19465:30;19531:34;19511:18;;;19504:62;19602:34;19582:18;;;19575:62;-1:-1:-1;;;19653:19:1;;;19646:40;19703:19;;70584:140:0;19251:477:1;70584:140:0;70780:9;70751:39;;;;:28;:39;;;;;70793:12;70751:54;;70472:357;-1:-1:-1;;;;;70872:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;70908:35:0;;;;;;:31;:35;;;;;;;;70907:36;70872:71;70868:706;;;70986:20;;70976:6;:30;;70968:96;;;;-1:-1:-1;;;70968:96:0;;19935:2:1;70968:96:0;;;19917:21:1;19974:2;19954:18;;;19947:30;20013:34;19993:18;;;19986:62;-1:-1:-1;;;20064:18:1;;;20057:51;20125:19;;70968:96:0;19733:417:1;70968:96:0;71121:9;;71104:13;71114:2;71104:9;:13::i;:::-;71095:22;;:6;:22;:::i;:::-;:35;;71087:67;;;;-1:-1:-1;;;71087:67:0;;20357:2:1;71087:67:0;;;20339:21:1;20396:2;20376:18;;;20369:30;-1:-1:-1;;;20415:18:1;;;20408:49;20474:18;;71087:67:0;20155:343:1;71087:67:0;70868:706;;;-1:-1:-1;;;;;71203:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;71237:37:0;;;;;;:31;:37;;;;;;;;71236:38;71203:71;71199:375;;;71317:20;;71307:6;:30;;71299:97;;;;-1:-1:-1;;;71299:97:0;;20705:2:1;71299:97:0;;;20687:21:1;20744:2;20724:18;;;20717:30;20783:34;20763:18;;;20756:62;-1:-1:-1;;;20834:18:1;;;20827:52;20896:19;;71299:97:0;20503:418:1;71199:375:0;-1:-1:-1;;;;;71427:35:0;;;;;;:31;:35;;;;;;;;71422:152;;71521:9;;71504:13;71514:2;71504:9;:13::i;:::-;71495:22;;:6;:22;:::i;:::-;:35;;71487:67;;;;-1:-1:-1;;;71487:67:0;;20357:2:1;71487:67:0;;;20339:21:1;20396:2;20376:18;;;20369:30;-1:-1:-1;;;20415:18:1;;;20408:49;20474:18;;71487:67:0;20155:343:1;71487:67:0;71612:28;71643:24;71661:4;71643:9;:24::i;:::-;71719:18;;71612:55;;-1:-1:-1;71695:42:0;;;;;;;71754:22;;-1:-1:-1;71765:11:0;;;;;;;71754:22;:35;;;;-1:-1:-1;71781:8:0;;-1:-1:-1;;;71781:8:0;;;;71780:9;71754:35;:71;;;;-1:-1:-1;;;;;;71794:31:0;;;;;;:25;:31;;;;;;;;71793:32;71754:71;:101;;;;-1:-1:-1;;;;;;71830:25:0;;;;;;:19;:25;;;;;;;;71829:26;71754:101;:129;;;;-1:-1:-1;;;;;;71860:23:0;;;;;;:19;:23;;;;;;;;71859:24;71754:129;71750:233;;;71900:8;:15;;-1:-1:-1;;;;71900:15:0;-1:-1:-1;;;71900:15:0;;;71930:10;:8;:10::i;:::-;71955:8;:16;;-1:-1:-1;;;;71955:16:0;;;71750:233;72000:8;;-1:-1:-1;;;72000:8:0;;;;71999:9;:42;;;;-1:-1:-1;;;;;;72012:29:0;;;;;;:25;:29;;;;;;;;71999:42;:59;;;;-1:-1:-1;72045:13:0;;;;71999:59;:114;;;;;72098:15;;72081:14;;:32;;;;:::i;:::-;72062:15;:51;;71999:114;:144;;;;-1:-1:-1;;;;;;72118:25:0;;;;;;:19;:25;;;;;;;;72117:26;71999:144;71995:206;;;72160:29;:27;:29::i;:::-;;71995:206;72229:8;;-1:-1:-1;;;;;72254:25:0;;72213:12;72254:25;;;:19;:25;;;;;;72229:8;-1:-1:-1;;;72229:8:0;;;;;72228:9;;72254:25;;:52;;-1:-1:-1;;;;;;72283:23:0;;;;;;:19;:23;;;;;;;;72254:52;72250:100;;;-1:-1:-1;72333:5:0;72250:100;72362:12;72393:7;72389:922;;;-1:-1:-1;;;;;72421:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;72470:1;72454:13;;:17;72421:50;72417:745;;;72499:34;72529:3;72499:25;72510:13;;72499:6;:10;;:25;;;;:::i;:34::-;72492:41;;72602:13;;72582:16;;72575:4;:23;;;;:::i;:::-;72574:41;;;;:::i;:::-;72552:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;72672:13:0;;72658:10;;72651:17;;:4;:17;:::i;:::-;72650:35;;;;:::i;:::-;72634:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;72754:13:0;;72734:16;;72727:23;;:4;:23;:::i;:::-;72726:41;;;;:::i;:::-;72704:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;72417:745:0;;-1:-1:-1;72417:745:0;;-1:-1:-1;;;;;72806:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;72856:1;72841:12;;:16;72806:51;72802:360;;;72885:33;72914:3;72885:24;72896:12;;72885:6;:10;;:24;;;;:::i;:33::-;72878:40;;72986:12;;72967:15;;72960:4;:22;;;;:::i;:::-;72959:39;;;;:::i;:::-;72937:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;73054:12:0;;73041:9;;73034:16;;:4;:16;:::i;:::-;73033:33;;;;:::i;:::-;73017:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;73134:12:0;;73115:15;;73108:22;;:4;:22;:::i;:::-;73107:39;;;;:::i;:::-;73085:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;72802:360:0;73182:8;;73178:91;;73211:42;73227:4;73241;73248;73211:15;:42::i;:::-;73285:14;73295:4;73285:14;;:::i;:::-;;;72389:922;73323:28;73334:4;73340:2;73344:6;73323:10;:28::i;:::-;69717:3642;;;;69604:3755;;;:::o;33238:191::-;33331:6;;;-1:-1:-1;;;;;33348:17:0;;;-1:-1:-1;;;;;;33348:17:0;;;;;;;33381:40;;33331:6;;;33348:17;33331:6;;33381:40;;33312:16;;33381:40;33301:128;33238:191;:::o;68845:186::-;-1:-1:-1;;;;;68928:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;68928:39:0;;;;;;;;;;68983:40;;68928:39;;:31;68983:40;;;68845:186;;:::o;44622:806::-;-1:-1:-1;;;;;44719:18:0;;44711:68;;;;-1:-1:-1;;;44711:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44798:16:0;;44790:64;;;;-1:-1:-1;;;44790:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44940:15:0;;44918:19;44940:15;;;;;;;;;;;44974:21;;;;44966:72;;;;-1:-1:-1;;;44966:72:0;;21261:2:1;44966:72:0;;;21243:21:1;21300:2;21280:18;;;21273:30;21339:34;21319:18;;;21312:62;-1:-1:-1;;;21390:18:1;;;21383:36;21436:19;;44966:72:0;21059:402:1;44966:72:0;-1:-1:-1;;;;;45074:15:0;;;:9;:15;;;;;;;;;;;45092:20;;;45074:38;;45292:13;;;;;;;;;;:23;;;;;;45344:26;;1613:25:1;;;45292:13:0;;45344:26;;1586:18:1;45344:26:0;;;;;;;45383:37;67434:403;26525:98;26583:7;26610:5;26614:1;26610;:5;:::i;26924:98::-;26982:7;27009:5;27013:1;27009;:5;:::i;77286:1677::-;77325:23;77351:24;77369:4;77351:9;:24::i;:::-;77325:50;;77386:25;77474:12;;77444:18;;77414;;:48;;;;:::i;:::-;:72;;;;:::i;:::-;77386:100;-1:-1:-1;77497:12:0;77526:20;;;:46;;-1:-1:-1;77550:22:0;;77526:46;77522:85;;;77589:7;;;77286:1677::o;77522:85::-;77641:18;;77623:15;:36;77619:105;;;77694:18;;77676:36;;77619:105;77736:23;77841:1;77812:17;77781:18;;77763:15;:36;;;;:::i;:::-;77762:67;;;;:::i;:::-;:80;;;;:::i;:::-;77736:106;-1:-1:-1;77853:26:0;77882:36;:15;77736:106;77882:19;:36::i;:::-;77853:65;-1:-1:-1;77959:21:0;77993:36;77853:65;77993:16;:36::i;:::-;78042:18;78063:44;:21;78089:17;78063:25;:44::i;:::-;78042:65;;78120:23;78146:81;78199:17;78146:34;78161:18;;78146:10;:14;;:34;;;;:::i;:81::-;78120:107;;78238:17;78258:51;78291:17;78258:28;78273:12;;78258:10;:14;;:28;;;;:::i;:51::-;78238:71;-1:-1:-1;78322:23:0;78238:71;78348:28;78361:15;78348:10;:28;:::i;:::-;:40;;;;:::i;:::-;78422:1;78401:18;:22;;;78434:18;:22;;;78467:12;:16;;;78517:9;;78509:46;;78322:66;;-1:-1:-1;;;;;;78517:9:0;;78541;;78509:46;78422:1;78509:46;78541:9;78517;78509:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78496:59:0;;-1:-1:-1;;78572:19:0;;;;;:42;;;78613:1;78595:15;:19;78572:42;78568:278;;;78631:46;78644:15;78661;78631:12;:46::i;:::-;78801:18;;78697:137;;;21878:25:1;;;21934:2;21919:18;;21912:34;;;21962:18;;;21955:34;;;;78697:137:0;;;;;;21866:2:1;78697:137:0;;;78568:278;78879:15;;78871:84;;-1:-1:-1;;;;;78879:15:0;;;;78919:21;;78871:84;;;;78919:21;78879:15;78871:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;77286:1677:0:o;79426:534::-;79517:15;79500:14;:32;79591:13;;79576:29;;-1:-1:-1;;;79576:29:0;;-1:-1:-1;;;;;79591:13:0;;;79576:29;;;1822:51:1;79483:4:0;;;;79576;;:14;;1795:18:1;;79576:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79545:60;;79618:20;79641:53;79688:5;79641:42;79666:16;;79641:20;:24;;:42;;;;:::i;:53::-;79618:76;-1:-1:-1;79711:16:0;;79707:110;;79760:13;;79744:61;;-1:-1:-1;;;;;79760:13:0;79783:6;79792:12;79744:15;:61::i;:::-;79866:13;;79891:11;;;-1:-1:-1;;;;;;79891:11:0;;;;-1:-1:-1;;;;;79866:13:0;;;;;;79891:9;;:11;;;;;79829:19;;79891:11;;;;;;;79829:19;79866:13;79891:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;79918:12:0;;;;-1:-1:-1;79918:12:0;;-1:-1:-1;79918:12:0;79948:4;79941:11;;;;;79426:534;:::o;73367:3053::-;73471:13;;73449:11;;-1:-1:-1;;;;;73463:21:0;;;73471:13;;73463:21;:55;;;;;73502:15;-1:-1:-1;;;;;73488:30:0;:2;-1:-1:-1;;;;;73488:30:0;;;73463:55;73550:13;;73449:69;;-1:-1:-1;;;;;;73544:19:0;;;73550:13;;73544:19;73592:4;73607:49;;;;-1:-1:-1;73642:2:0;73607:49;73680:8;;73668:9;;-1:-1:-1;;;73680:8:0;;;;;:37;;-1:-1:-1;;;;;;73692:25:0;;;;;;:19;:25;;;;;;;;73680:37;:64;;;-1:-1:-1;;;;;;73721:23:0;;;;;;:19;:23;;;;;;;;73680:64;73668:76;;73759:4;73755:2516;;;73780:33;73796:4;73802:2;73806:6;73780:15;:33::i;:::-;73755:2516;;;73870:12;;:17;;73885:2;73870:17;:::i;:::-;73852:15;:35;73848:764;;;73929:9;;40381:12;;73912:26;73908:689;;73963:9;:16;;-1:-1:-1;;73963:16:0;73975:4;73963:16;;;74002:7;:5;:7::i;:::-;-1:-1:-1;74036:8:0;;;;:17;;:8;:17;74032:291;;74082:17;74118:9;;74102:13;40381:12;;;40293:108;74102:13;:25;;;;:::i;:::-;74082:45;-1:-1:-1;74202:1:0;74186:13;74082:45;74198:1;74186:13;:::i;:::-;74168:14;;74158:25;;-1:-1:-1;;;;;74168:14:0;74158:9;:25::i;:::-;:41;;;;:::i;:::-;:45;74154:146;;;74242:14;;74236:36;;-1:-1:-1;;;;;74242:14:0;74258:13;:9;74270:1;74258:13;:::i;74236:36::-;74055:268;74032:291;73908:689;;;74369:9;;40381:12;;74352:26;74348:249;;74403:9;:17;;-1:-1:-1;;74403:17:0;;;74443:7;:5;:7::i;:::-;;74473:17;74505:13;40381:12;;;40293:108;74505:13;74493:9;;:25;;;;:::i;:::-;74547:14;;74473:45;;-1:-1:-1;74541:36:0;;-1:-1:-1;;;;;74547:14:0;74563:13;74473:45;74575:1;74563:13;:::i;:::-;74541:5;:36::i;:::-;74380:217;74348:249;74632:19;;74655:1;74632:24;74628:75;;74677:10;:8;:10::i;:::-;;74628:75;74723:9;;;;:17;;:9;:17;74719:1541;;74761:16;74780:34;74798:6;74806:7;;74780:17;:34::i;:::-;74761:53;;74833:21;74839:4;74845:8;74833:5;:21::i;:::-;74875:19;74917:28;74948:46;74966:13;40381:12;;;40293:108;74966:13;74981:12;;74948:17;:46::i;:::-;75027:14;;74917:77;;-1:-1:-1;74917:77:0;;75017:25;;-1:-1:-1;;;;;75027:14:0;75017:9;:25::i;:::-;:49;75013:222;;75105:37;75123:6;75131:10;;75105:17;:37::i;:::-;75187:14;;75091:51;;-1:-1:-1;75165:50:0;;75181:4;;-1:-1:-1;;;;;75187:14:0;75091:51;75165:15;:50::i;:::-;75255:14;75292:11;75272:17;75281:8;75272:6;:17;:::i;:::-;:31;;;;:::i;:::-;75255:48;;75322:33;75338:4;75344:2;75348:6;75322:15;:33::i;:::-;75381:1;75374:3;;:8;;;;;;;:::i;:::-;;;;-1:-1:-1;75401:29:0;;-1:-1:-1;75416:6:0;75424:5;75401:14;:29::i;:::-;;74742:704;;;;74719:1541;;;75456:9;;;;:18;;:9;:18;75452:808;;75500:14;;;;75499:15;;:25;;;75518:6;75499:25;:36;;;;75528:7;75499:36;75495:183;;;75560:16;75579:34;75597:6;75605:7;;75579:17;:34::i;:::-;75560:53;;75636:22;75642:5;75649:8;75636:5;:22::i;:::-;75537:141;75495:183;75698:19;75740:28;75771:46;75789:13;40381:12;;;40293:108;75771:46;75850:14;;75740:77;;-1:-1:-1;75740:77:0;;75840:25;;-1:-1:-1;;;;;75850:14:0;75840:9;:25::i;:::-;:49;75836:222;;75928:37;75946:6;75954:10;;75928:17;:37::i;:::-;76010:14;;75914:51;;-1:-1:-1;75988:50:0;;76004:4;;-1:-1:-1;;;;;76010:14:0;75914:51;75988:15;:50::i;:::-;76078:14;76095:20;76104:11;76095:6;:20;:::i;:::-;76078:37;;76134:33;76150:4;76156:2;76160:6;76134:15;:33::i;:::-;76195:1;76188:3;;:8;;;;;;;:::i;:::-;;;;-1:-1:-1;76215:29:0;;-1:-1:-1;76230:6:0;76238:5;76215:14;:29::i;:::-;;75476:784;;;75452:808;-1:-1:-1;;;;;;76281:17:0;;;;;:10;:17;;;;;;;;76301:15;76281:35;;;;76327:12;:19;;;;;:37;;;76375:12;:19;;;;;;:37;-1:-1:-1;;;;;73367:3053:0:o;26168:98::-;26226:7;26253:5;26257:1;26253;:5;:::i;76428:475::-;76518:16;;;76532:1;76518:16;;;;;;;;76494:21;;76518:16;;;;;;;;;;-1:-1:-1;76518:16:0;76494:40;;76563:4;76545;76550:1;76545:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;76545:23:0;;;-1:-1:-1;;;;;76545:23:0;;;;;76589:15;-1:-1:-1;;;;;76589:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76579:4;76584:1;76579:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;76579:32:0;;;-1:-1:-1;;;;;76579:32:0;;;;;76624:62;76641:4;76656:15;76674:11;76624:8;:62::i;:::-;76699:196;;-1:-1:-1;;;76699:196:0;;-1:-1:-1;;;;;76699:15:0;:66;;;;:196;;76780:11;;76806:1;;76822:4;;76849;;76869:15;;76699:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76483:420;76428:475;:::o;76911:367::-;76992:62;77009:4;77024:15;77042:11;76992:8;:62::i;:::-;77067:203;;-1:-1:-1;;;77067:203:0;;77140:4;77067:203;;;23714:34:1;23764:18;;;23757:34;;;77186:1:0;23807:18:1;;;23800:34;;;23850:18;;;23843:34;58794:6:0;23893:19:1;;;23886:44;77244:15:0;23946:19:1;;;23939:35;77067:15:0;-1:-1:-1;;;;;77067:31:0;;;;77107:9;;23648:19:1;;77067:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;76911:367;;:::o;83700:726::-;83735:4;83760:1;83752:4;;:9;;;;;;;:::i;:::-;;;;-1:-1:-1;;83776:4:0;;83784:1;83776:9;:30;;;;-1:-1:-1;83789:8:0;;;;:17;83776:30;83772:326;;;83823:13;83839:16;40218:2;83839;:16;:::i;:::-;83823:32;-1:-1:-1;83897:5:0;83880:14;83823:32;83891:3;83880:14;:::i;:::-;:22;;;;:::i;:::-;83870:7;:32;83944:5;83927:14;:8;83938:3;83927:14;:::i;:::-;:22;;;;:::i;:::-;83917:7;:32;83993:5;83977:13;:8;83988:2;83977:13;:::i;:::-;:21;;;;:::i;:::-;83964:10;:34;;;84043:5;;84027:13;;:8;;:13;:::i;:::-;:21;;;;:::i;:::-;84013:11;:35;-1:-1:-1;84063:16:0;:23;;-1:-1:-1;;84063:23:0;84082:4;84063:23;;;83772:326;84120:1;84112:4;;:9;;:23;;;;;84133:2;84125:4;;:10;;84112:23;84108:248;;;84152:27;:25;:27::i;:::-;-1:-1:-1;84194:16:0;:23;;-1:-1:-1;;84194:23:0;84213:4;84194:23;;;84108:248;;;84247:2;84239:4;;:10;;:24;;;;;84261:2;84253:4;;:10;;84239:24;84235:121;;;84280:25;:23;:25::i;:::-;-1:-1:-1;84320:16:0;:24;;-1:-1:-1;;84320:24:0;;;84235:121;-1:-1:-1;84381:15:0;84366:12;:30;84414:4;;83700:726::o;45715:548::-;-1:-1:-1;;;;;45799:21:0;;45791:65;;;;-1:-1:-1;;;45791:65:0;;24498:2:1;45791:65:0;;;24480:21:1;24537:2;24517:18;;;24510:30;24576:33;24556:18;;;24549:61;24627:18;;45791:65:0;24296:355:1;45791:65:0;45947:6;45931:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;46102:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;46157:37;1613:25:1;;;46157:37:0;;1586:18:1;46157:37:0;;;;;;;68455:242;;:::o;80911:1148::-;80970:9;;80949:4;;80970:9;;:17;;:9;:17;80966:385;;81025:2;81015:7;;:12;;;;:::i;:::-;81004:7;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;81053:7:0;;:12;;81063:2;;81053:12;:::i;:::-;81042:7;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;81094:10:0;;:15;;81107:2;;81094:15;:::i;:::-;81080:10;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;81139:11:0;;:16;;81153:2;;81139:16;:::i;:::-;81124:11;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;80966:385:0;;-1:-1:-1;80966:385:0;;81209:2;81199:7;;:12;;;;:::i;:::-;81188:7;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;81237:7:0;;:12;;81247:2;;81237:12;:::i;:::-;81226:7;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;81278:10:0;;:15;;81291:2;;81278:15;:::i;:::-;81264:10;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;81323:11:0;;:16;;81337:2;;81323:16;:::i;:::-;81308:11;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;80966:385:0;81375:6;;:10;;81384:1;81375:10;:::i;:::-;81365:7;;:20;81361:74;;;81413:6;;:10;;81422:1;81413:10;:::i;:::-;81402:7;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;81361:74:0;81459:6;;:10;;81468:1;81459:10;:::i;:::-;81449:7;;:20;81445:74;;;81497:6;;:10;;81506:1;81497:10;:::i;:::-;81486:7;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;81445:74:0;81548:6;;:10;;81557:1;81548:10;:::i;:::-;81535;;:23;81531:76;;;81589:6;;81575:10;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;81531:76:0;81637:6;;:10;;81646:1;81637:10;:::i;:::-;81623:11;;:24;81619:78;;;81679:6;;81664:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;81619:78:0;81723:6;;81713:7;;:16;:36;;;;81743:6;;81733:7;;:16;81713:36;:63;;;;81775:1;81766:6;;:10;;;;:::i;:::-;81753;;:23;81713:63;81709:321;;;81793:13;81809:16;40218:2;81809;:16;:::i;:::-;81793:32;-1:-1:-1;81867:5:0;81850:14;81793:32;81861:3;81850:14;:::i;:::-;:22;;;;:::i;:::-;81840:7;:32;81914:5;81897:14;:8;81908:3;81897:14;:::i;:::-;:22;;;;:::i;:::-;81887:7;:32;81963:5;81947:13;:8;81958:2;81947:13;:::i;:::-;:21;;;;:::i;:::-;81934:10;:34;;;82013:5;;81997:13;;:8;;:13;:::i;:::-;:21;;;;:::i;:::-;81983:11;:35;-1:-1:-1;81709:321:0;-1:-1:-1;82047:4:0;;80911:1148::o;87989:1430::-;88133:14;;88067:4;;88105:62;;88123:25;;-1:-1:-1;;;;;88133:14:0;88123:9;:25::i;:::-;88150:16;;88105:17;:62::i;:::-;88085:17;:82;;;88182:28;;88178:1212;;88227:20;:32;;-1:-1:-1;;;;;;88227:32:0;-1:-1:-1;;;;;88227:32:0;;;;;88278:8;;;;:16;;-1:-1:-1;88278:16:0;88274:1105;;88341:16;;88319:19;;:38;88315:531;;;88431:20;;88408:19;;88382:25;:46;;-1:-1:-1;;;;;88431:20:0;;;;88382:25;;88408:19;88382:46;;;;;;:::i;:::-;;;;;;;;;:69;;;;;-1:-1:-1;;;;;88382:69:0;;;;;-1:-1:-1;;;;;88382:69:0;;;;;;88497:1;88474:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;88274:1105:0;;-1:-1:-1;88274:1105:0;88315:531;88551:16;;88528:19;;:39;88524:322;;88592:8;:16;;-1:-1:-1;;88592:16:0;;;88680:20;;88657:19;;88631:25;:46;;-1:-1:-1;;;;;88680:20:0;;;;88631:25;;88657:19;88631:46;;;;;;:::i;:::-;;;;;;;;;:69;;-1:-1:-1;;;;;;88631:69:0;-1:-1:-1;;;;;88631:69:0;;;;;;;;;;;88723:19;:23;88769:10;:8;:10::i;:::-;;88825:1;88802:19;;:24;;;;;;;:::i;88524:322::-;88274:1105;;;88912:16;;88890:19;;:38;88886:478;;;88953:10;:8;:10::i;:::-;-1:-1:-1;89035:20:0;;89012:19;;88986:25;:46;;-1:-1:-1;;;;;89035:20:0;;;;88986:25;;89012:19;88986:46;;;;;;:::i;88886:478::-;89155:16;;89132:19;;:39;89128:236;;89196:10;:8;:10::i;:::-;-1:-1:-1;89278:20:0;;89255:19;;89229:25;:46;;-1:-1:-1;;;;;89278:20:0;;;;89229:25;;89255:19;89229:46;;;;;;:::i;:::-;;;;;;;;;:69;;-1:-1:-1;;;;;;89229:69:0;-1:-1:-1;;;;;89229:69:0;;;;;;;;;;;89321:19;:23;89128:236;-1:-1:-1;89407:4:0;87989:1430;;;;:::o;83044:234::-;83120:9;;83099:4;;83120:9;;:17;;:9;:17;83116:133;;83178:1;83166:9;;:13;;;;:::i;:::-;83154:9;:25;83116:133;;;83236:1;83224:9;;:13;;;;:::i;:::-;83212:9;:25;-1:-1:-1;83266:4:0;;83044:234::o;83286:406::-;83360:9;;83339:4;;83360:9;;:17;;:9;:17;83356:133;;83406:9;;:13;;83418:1;83406:13;:::i;:::-;83394:9;:25;83356:133;;;83464:9;;:13;;83476:1;83464:13;:::i;:::-;83452:9;:25;83356:133;83503:4;;83511:2;83503:10;83499:164;;83542:11;;83530:9;:23;83580:9;;83568;:21;-1:-1:-1;83604:4:0;:8;83627:16;:24;;-1:-1:-1;;83627:24:0;;;-1:-1:-1;83680:4:0;;83286:406::o;82067:969::-;82105:4;82122:21;82146:40;82164:13;40381:12;;;40293:108;82164:13;82179:6;;82146:17;:40::i;:::-;82239:14;;82122:64;;-1:-1:-1;82197:13:0;;82122:64;;82229:25;;-1:-1:-1;;;;;82239:14:0;82229:9;:25::i;:::-;:42;82225:309;;82306:14;;82324:3;;82296:25;;-1:-1:-1;;;;;82306:14:0;82296:9;:25::i;:::-;:31;;;;:::i;:::-;82288:39;;82225:309;;;82377:17;:13;82393:1;82377:17;:::i;:::-;82359:14;;82349:25;;-1:-1:-1;;;;;82359:14:0;82349:9;:25::i;:::-;:45;82345:189;;;82429:14;;82447:3;;82419:25;;-1:-1:-1;;;;;82429:14:0;82419:9;:25::i;82345:189::-;82501:14;;82519:3;;82491:25;;-1:-1:-1;;;;;82501:14:0;82491:9;:25::i;:::-;:31;;;;:::i;:::-;82483:39;;82345:189;82560:14;;82586:1;;82578:5;;82550:25;;-1:-1:-1;;;;;82560:14:0;82550:9;:25::i;:::-;:33;;;;:::i;:::-;:37;82546:461;;;82620:14;;82662:19;;82636:25;:46;;82604:86;;-1:-1:-1;;;;;82620:14:0;;82662:19;82636:46;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;82636:46:0;82684:5;82604:15;:86::i;:::-;82720:14;;-1:-1:-1;;;;;82720:14:0;82705:30;;;;:14;:30;;;;;:39;;82739:5;;82705:30;:39;;82739:5;;82705:39;:::i;:::-;;;;;;;;82776:5;82759:13;;:22;;;;;;;:::i;:::-;;;;;;;;82813:1;82796:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;82840:14:0;;;-1:-1:-1;;;;;82840:14:0;;;82829:26;;;;:10;:26;;;;;;;;82858:15;82829:44;;;;82901:14;;;;82888:28;;:12;:28;;;;;:46;;;82962:14;;;;;82949:28;;:12;:28;;;:46;82546:461;83024:4;83017:11;;;;82067:969;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:180::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:52;;;2012:1;2009;2002:12;1964:52;-1:-1:-1;2035:23:1;;1884:180;-1:-1:-1;1884:180:1:o;2069:160::-;2134:20;;2190:13;;2183:21;2173:32;;2163:60;;2219:1;2216;2209:12;2234:315;2299:6;2307;2360:2;2348:9;2339:7;2335:23;2331:32;2328:52;;;2376:1;2373;2366:12;2328:52;2415:9;2402:23;2434:31;2459:5;2434:31;:::i;:::-;2484:5;-1:-1:-1;2508:35:1;2539:2;2524:18;;2508:35;:::i;:::-;2498:45;;2234:315;;;;;:::o;2554:456::-;2631:6;2639;2647;2700:2;2688:9;2679:7;2675:23;2671:32;2668:52;;;2716:1;2713;2706:12;2668:52;2755:9;2742:23;2774:31;2799:5;2774:31;:::i;:::-;2824:5;-1:-1:-1;2881:2:1;2866:18;;2853:32;2894:33;2853:32;2894:33;:::i;:::-;2554:456;;2946:7;;-1:-1:-1;;;3000:2:1;2985:18;;;;2972:32;;2554:456::o;3412:316::-;3486:6;3494;3502;3555:2;3543:9;3534:7;3530:23;3526:32;3523:52;;;3571:1;3568;3561:12;3523:52;3607:9;3594:23;3584:33;;3664:2;3653:9;3649:18;3636:32;3626:42;;3687:35;3718:2;3707:9;3703:18;3687:35;:::i;:::-;3677:45;;3412:316;;;;;:::o;3733:689::-;3828:6;3836;3844;3897:2;3885:9;3876:7;3872:23;3868:32;3865:52;;;3913:1;3910;3903:12;3865:52;3953:9;3940:23;3982:18;4023:2;4015:6;4012:14;4009:34;;;4039:1;4036;4029:12;4009:34;4077:6;4066:9;4062:22;4052:32;;4122:7;4115:4;4111:2;4107:13;4103:27;4093:55;;4144:1;4141;4134:12;4093:55;4184:2;4171:16;4210:2;4202:6;4199:14;4196:34;;;4226:1;4223;4216:12;4196:34;4281:7;4274:4;4264:6;4261:1;4257:14;4253:2;4249:23;4245:34;4242:47;4239:67;;;4302:1;4299;4292:12;4239:67;4333:4;4325:13;;;;4357:6;;-1:-1:-1;4395:20:1;;;;4382:34;;3733:689;-1:-1:-1;;;;3733:689:1:o;4427:316::-;4504:6;4512;4520;4573:2;4561:9;4552:7;4548:23;4544:32;4541:52;;;4589:1;4586;4579:12;4541:52;-1:-1:-1;;4612:23:1;;;4682:2;4667:18;;4654:32;;-1:-1:-1;4733:2:1;4718:18;;;4705:32;;4427:316;-1:-1:-1;4427:316:1:o;4748:180::-;4804:6;4857:2;4845:9;4836:7;4832:23;4828:32;4825:52;;;4873:1;4870;4863:12;4825:52;4896:26;4912:9;4896:26;:::i;4933:388::-;5001:6;5009;5062:2;5050:9;5041:7;5037:23;5033:32;5030:52;;;5078:1;5075;5068:12;5030:52;5117:9;5104:23;5136:31;5161:5;5136:31;:::i;:::-;5186:5;-1:-1:-1;5243:2:1;5228:18;;5215:32;5256:33;5215:32;5256:33;:::i;:::-;5308:7;5298:17;;;4933:388;;;;;:::o;5326:161::-;5420:6;5453:4;5441:17;;5438:26;-1:-1:-1;5435:46:1;;;5477:1;5474;5467:12;5492:367;5614:6;5622;5675:5;5663:9;5654:7;5650:23;5646:35;5643:55;;;5694:1;5691;5684:12;5643:55;5717:53;5762:7;5751:9;5717:53;:::i;:::-;5707:63;;5789:64;5845:7;5838:4;5827:9;5823:20;5789:64;:::i;5864:380::-;5943:1;5939:12;;;;5986;;;6007:61;;6061:4;6053:6;6049:17;6039:27;;6007:61;6114:2;6106:6;6103:14;6083:18;6080:38;6077:161;;6160:10;6155:3;6151:20;6148:1;6141:31;6195:4;6192:1;6185:15;6223:4;6220:1;6213:15;6077:161;;5864:380;;;:::o;6249:127::-;6310:10;6305:3;6301:20;6298:1;6291:31;6341:4;6338:1;6331:15;6365:4;6362:1;6355:15;6381:168;6454:9;;;6485;;6502:15;;;6496:22;;6482:37;6472:71;;6523:18;;:::i;6554:217::-;6594:1;6620;6610:132;;6664:10;6659:3;6655:20;6652:1;6645:31;6699:4;6696:1;6689:15;6727:4;6724:1;6717:15;6610:132;-1:-1:-1;6756:9:1;;6554:217::o;7677:125::-;7742:9;;;7763:10;;;7760:36;;;7776:18;;:::i;9537:127::-;9598:10;9593:3;9589:20;9586:1;9579:31;9629:4;9626:1;9619:15;9653:4;9650:1;9643:15;9669:135;9708:3;9729:17;;;9726:43;;9749:18;;:::i;:::-;-1:-1:-1;9796:1:1;9785:13;;9669:135::o;13007:422::-;13096:1;13139:5;13096:1;13153:270;13174:7;13164:8;13161:21;13153:270;;;13233:4;13229:1;13225:6;13221:17;13215:4;13212:27;13209:53;;;13242:18;;:::i;:::-;13292:7;13282:8;13278:22;13275:55;;;13312:16;;;;13275:55;13391:22;;;;13351:15;;;;13153:270;;;13157:3;13007:422;;;;;:::o;13434:806::-;13483:5;13513:8;13503:80;;-1:-1:-1;13554:1:1;13568:5;;13503:80;13602:4;13592:76;;-1:-1:-1;13639:1:1;13653:5;;13592:76;13684:4;13702:1;13697:59;;;;13770:1;13765:130;;;;13677:218;;13697:59;13727:1;13718:10;;13741:5;;;13765:130;13802:3;13792:8;13789:17;13786:43;;;13809:18;;:::i;:::-;-1:-1:-1;;13865:1:1;13851:16;;13880:5;;13677:218;;13979:2;13969:8;13966:16;13960:3;13954:4;13951:13;13947:36;13941:2;13931:8;13928:16;13923:2;13917:4;13914:12;13910:35;13907:77;13904:159;;;-1:-1:-1;14016:19:1;;;14048:5;;13904:159;14095:34;14120:8;14114:4;14095:34;:::i;:::-;14165:6;14161:1;14157:6;14153:19;14144:7;14141:32;14138:58;;;14176:18;;:::i;:::-;14214:20;;13434:806;-1:-1:-1;;;13434:806:1:o;14245:140::-;14303:5;14332:47;14373:4;14363:8;14359:19;14353:4;14332:47;:::i;15569:184::-;15639:6;15692:2;15680:9;15671:7;15667:23;15663:32;15660:52;;;15708:1;15705;15698:12;15660:52;-1:-1:-1;15731:16:1;;15569:184;-1:-1:-1;15569:184:1:o;18090:401::-;18292:2;18274:21;;;18331:2;18311:18;;;18304:30;18370:34;18365:2;18350:18;;18343:62;-1:-1:-1;;;18436:2:1;18421:18;;18414:35;18481:3;18466:19;;18090:401::o;18496:399::-;18698:2;18680:21;;;18737:2;18717:18;;;18710:30;18776:34;18771:2;18756:18;;18749:62;-1:-1:-1;;;18842:2:1;18827:18;;18820:33;18885:3;18870:19;;18496:399::o;20926:128::-;20993:9;;;21014:11;;;21011:37;;;21028:18;;:::i;22132:251::-;22202:6;22255:2;22243:9;22234:7;22230:23;22226:32;22223:52;;;22271:1;22268;22261:12;22223:52;22303:9;22297:16;22322:31;22347:5;22322:31;:::i;22388:980::-;22650:4;22698:3;22687:9;22683:19;22729:6;22718:9;22711:25;22755:2;22793:6;22788:2;22777:9;22773:18;22766:34;22836:3;22831:2;22820:9;22816:18;22809:31;22860:6;22895;22889:13;22926:6;22918;22911:22;22964:3;22953:9;22949:19;22942:26;;23003:2;22995:6;22991:15;22977:29;;23024:1;23034:195;23048:6;23045:1;23042:13;23034:195;;;23113:13;;-1:-1:-1;;;;;23109:39:1;23097:52;;23204:15;;;;23169:12;;;;23145:1;23063:9;23034:195;;;-1:-1:-1;;;;;;;23285:32:1;;;;23280:2;23265:18;;23258:60;-1:-1:-1;;;23349:3:1;23334:19;23327:35;23246:3;22388:980;-1:-1:-1;;;22388:980:1:o;23985:306::-;24073:6;24081;24089;24142:2;24130:9;24121:7;24117:23;24113:32;24110:52;;;24158:1;24155;24148:12;24110:52;24187:9;24181:16;24171:26;;24237:2;24226:9;24222:18;24216:25;24206:35;;24281:2;24270:9;24266:18;24260:25;24250:35;;23985:306;;;;;:::o

Swarm Source

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