ETH Price: $3,439.76 (-0.43%)
Gas: 7 Gwei

Token

NonFunFriends (NFF)
 

Overview

Max Total Supply

555 NFF

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hhiker42.kongz.eth
Balance
1 NFF
0xa4fcf064131db228cfa72bfb64f0f50b940538fc
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:
NONFUNFRIENDS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-18
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File: 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: 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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract Payment is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }


    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }


    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }


    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// File: IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
// File: IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: ERC721A.sol


pragma solidity ^0.8.0;









contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.2;

contract NONFUNFRIENDS is ERC721A, Payment, Ownable {  
    using Strings for uint256;
    string public _baseURIextended;

    // Sale States
    bool public isAllowlistFreeActive = false;
    bool public isAllowlistActive = false;
    bool public isPublicActive = false;

    //signature
    address private signer = 0x74C16afC1153c577D2A3825daa8DEE2e2eC61934;

    //settings
    uint256 public MAX_SUPPLY = 9006;

    uint256 public MAX_SUPPLY_PER_PHASE_FREE = 1000; //will change with each phase
    uint256 public MAX_SUPPLY_PER_PHASE_ALLOWLIST = 500; //will change with each phase
    uint256 public MAX_SUPPLY_PER_PHASE_PUBLIC = 500; //will change with each phase

    uint256 public MAX_MINT_PER_PHASE_FREE = 1; //will change with each phase
    uint256 public MAX_MINT_PER_PHASE_FREE_THRESHOLD = 50; //will change with each phase
    uint256 public MAX_MINT_PER_PHASE_ALLOWLIST = 5; //will change with each phase
    uint256 public MAX_MINT_PER_PHASE_PUBLIC = 5; //will change with each phase

    uint256 public CURRENT_ALLOWLIST = 1;

	//mappings
    mapping(address => uint256) public numMintedPerPersonFree;
    mapping(address => mapping(uint => uint256)) public numMintedPerPersonAllowlist;
    mapping(address => uint256) public numMintedPerPersonPublic;

    uint256 public numMintedFree;
    mapping(uint => uint256) public numMintedPerAllowlist;
    uint256 public numMintedPublic;

    uint256 public PRICE_PER_TOKEN = 0.05 ether; //will change with each phase
   
    //shares
	address[] private addressList = [
	0xAD60f4834eD4f5996C5a27A6b21C9E95Da78c873,
	0x5969D31AB27392529450AA5ffd359a4Cd840fE66,
    0xEcc03efB7C0A7BD09A5cC7e954Ac42E8f949A0B5,
    0x761B6679dD6bB00F7116f88b8d8b35A879f765D3,
    0x38395321aa7e0f5Bf2d6De007dfb293988Ec6Ee0,
    0x4755D63F5b81BBBf72804F6F15B69F2920A24D82,
    0xbe82F82692a0a5c38E7bb20b5E498DAc9B6E32Cb
	];

	uint[] private shareList = [
	3600,
    1500,
    1900,
    1300,
    567,
    567,
    566
	];


	constructor() ERC721A("NonFunFriends", "NFF") Payment(addressList, shareList) {}

 	function mintFree(address _address, bytes calldata _voucher, uint256 _tokenAmount) public {
  	    uint256 ts = totalSupply();
        require(isAllowlistFreeActive);
  		require(_tokenAmount <= MAX_MINT_PER_PHASE_FREE_THRESHOLD, "Purchase would exceed max tokens in this Phase");
        require(numMintedFree <= MAX_SUPPLY_PER_PHASE_FREE, "Purchase would exceed max tokens");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.sender == _address, "Not your voucher");
        require(msg.sender == tx.origin);
    	require(numMintedPerPersonFree[_address] < MAX_MINT_PER_PHASE_FREE, "Purchase would exceed max tokens per Wallet");

        bytes32 hash = keccak256(
            abi.encodePacked(_address)
        );
        require(_verifySignature(signer, hash, _voucher), "Invalid voucher");

        _safeMint(_address, _tokenAmount);
        numMintedPerPersonFree[_address] += _tokenAmount;
        numMintedFree += _tokenAmount;
    }

 	function mintAllowlist(address _address, bytes calldata _voucher, uint256 _tokenAmount, uint allowlist) public payable {
  	    uint256 ts = totalSupply();
        require(isAllowlistActive);
        require(allowlist == CURRENT_ALLOWLIST,"Not the current allowlist");
  		require(_tokenAmount <= MAX_MINT_PER_PHASE_ALLOWLIST, "Purchase would exceed max tokens per Wallet in this Phase");
        require(numMintedPerAllowlist[allowlist] <= MAX_SUPPLY_PER_PHASE_ALLOWLIST, "Purchase would exceed max tokens");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.sender == _address, "Not your voucher");
        require(msg.sender == tx.origin);
    	require(numMintedPerPersonAllowlist[_address][allowlist] < MAX_MINT_PER_PHASE_ALLOWLIST, "Purchase would exceed max tokens per Wallet");
        require(msg.value >= PRICE_PER_TOKEN * _tokenAmount, "Ether value sent is not correct");

        bytes32 hash = keccak256(
            abi.encodePacked(_address)
        );
        require(_verifySignature(signer, hash, _voucher), "Invalid voucher");

        _safeMint(_address, _tokenAmount);
        numMintedPerPersonAllowlist[_address][allowlist] += _tokenAmount;
        numMintedPerAllowlist[allowlist] += _tokenAmount;
    }

 	function mintPublic(uint256 _tokenAmount) public payable {
  	    uint256 ts = totalSupply();
        require(isPublicActive);
  		require(_tokenAmount <= MAX_MINT_PER_PHASE_PUBLIC, "Purchase would exceed max tokens per Wallet in this Phase");
        require(numMintedPublic <= MAX_SUPPLY_PER_PHASE_PUBLIC, "Purchase would exceed max tokens");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.sender == tx.origin);
    	require(numMintedPerPersonPublic[msg.sender] <= MAX_MINT_PER_PHASE_PUBLIC, "Purchase would exceed max tokens per Wallet");
        require(msg.value >= PRICE_PER_TOKEN * _tokenAmount, "Ether value sent is not correct");

        _safeMint(msg.sender, _tokenAmount);
        numMintedPerPersonPublic[msg.sender] += _tokenAmount;
        numMintedPublic += _tokenAmount;
    }

    //airdrops
 	function airdrop(address addr, uint256 _tokenAmount) public onlyOwner {
  	    uint256 ts = totalSupply();
	    require(ts + _tokenAmount <= MAX_SUPPLY);
        _safeMint(addr, _tokenAmount);
    }

    //signatures
    function _verifySignature(address _signer, bytes32 _hash, bytes memory _signature) private pure returns (bool) {
        return _signer == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature);
    }

    function setSigner(address _signer) external onlyOwner {
        signer = _signer;
    }

    // Set  price
    function setPrice(uint256 _newPrice) external onlyOwner {
        PRICE_PER_TOKEN = _newPrice;
    }

    function setAllowlistFree(bool _status) external onlyOwner {
        isAllowlistFreeActive = _status;
    }

     // Allowed Minting
    function setAllowlist(bool _status) external onlyOwner {
        isAllowlistActive = _status;
    }

    function setPublic(bool _status) external onlyOwner {
        isPublicActive = _status;
    }

     // Max Per Wallet
    function setMaxMintPerFree(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_FREE = _amount;
    }

    function setMaxMintPerFreeThreshold(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_FREE_THRESHOLD = _amount;
    }

    function setMaxMintPerAllowlist(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_ALLOWLIST = _amount;
    }

    function setMaxMintPerPublic(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_PUBLIC = _amount;
    }

    //Max Supplys
    function setMaxSupplyFree(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_FREE = _amount;
    }

    function setMaxSupplyAllowlist(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_ALLOWLIST = _amount;
    }

    function setMaxSupplyPublic(uint256 _amount) external onlyOwner {
        MAX_MINT_PER_PHASE_PUBLIC = _amount;
    }

    //current allowlist
    function setCurrentAllowlist(uint256 _allowlist) external onlyOwner {
        CURRENT_ALLOWLIST = _allowlist;
    }

    //metadata
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    function withdraw() public payable onlyOwner {
	(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
		require(success);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURRENT_ALLOWLIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_PHASE_ALLOWLIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_PHASE_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_PHASE_FREE_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_PHASE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PER_PHASE_ALLOWLIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PER_PHASE_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PER_PHASE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistFreeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes","name":"_voucher","type":"bytes"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"allowlist","type":"uint256"}],"name":"mintAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes","name":"_voucher","type":"bytes"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numMintedPerAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"numMintedPerPersonAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPersonFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPersonPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMintedPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAllowlistFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowlist","type":"uint256"}],"name":"setCurrentAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerFreeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupplyAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupplyFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupplyPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600e80546001600160b81b0319167674c16afc1153c577d2a3825daa8dee2e2ec6193400000017905561232e600f556103e86010556101f460118190556012556001601381905560326014556005601581905560165560175566b1a2bc2ec50000601e5561016060405273ad60f4834ed4f5996c5a27a6b21c9e95da78c8736080908152735969d31ab27392529450aa5ffd359a4cd840fe6660a05273ecc03efb7c0a7bd09a5cc7e954ac42e8f949a0b560c05273761b6679dd6bb00f7116f88b8d8b35a879f765d360e0527338395321aa7e0f5bf2d6de007dfb293988ec6ee061010052734755d63f5b81bbbf72804f6f15b69f2920a24d826101205273be82f82692a0a5c38e7bb20b5e498dac9b6e32cb610140526200012690601f9060076200063b565b506040805160e081018252610e1081526105dc60208083019190915261076c9282019290925261051460608201526102376080820181905260a082015261023660c08201526200017991906007620006a5565b503480156200018757600080fd5b50601f805480602002602001604051908101604052809291908181526020018280548015620001e057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620001c1575b505050505060208054806020026020016040519081016040528092919081815260200182805480156200023357602002820191906000526020600020905b8154815260200190600101908083116200021e575b5050604080518082018252600d81526c4e6f6e46756e467269656e647360981b60208083019182528351808501909452600384526227232360e91b9084015281519195509193506200028a925060019190620006e9565b508051620002a0906002906020840190620006e9565b5050508051825114620003155760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003685760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200030c565b60005b8251811015620003d457620003bf8382815181106200038e576200038e6200077d565b6020026020010151838381518110620003ab57620003ab6200077d565b6020026020010151620003f760201b60201c565b80620003cb81620007a9565b9150506200036b565b505050620003f1620003eb620005e560201b60201c565b620005e9565b6200081c565b6001600160a01b038216620004645760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200030c565b60008111620004b65760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200030c565b6001600160a01b03821660009081526009602052604090205415620005325760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200030c565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200059c908290620007c5565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000693579160200282015b828111156200069357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200065c565b50620006a192915062000766565b5090565b82805482825590600052602060002090810192821562000693579160200282015b8281111562000693578251829061ffff16905591602001919060010190620006c6565b828054620006f790620007e0565b90600052602060002090601f0160209004810192826200071b576000855562000693565b82601f106200073657805160ff191683800117855562000693565b8280016001018555821562000693579182015b828111156200069357825182559160200191906001019062000749565b5b80821115620006a1576000815560010162000767565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620007be57620007be62000793565b5060010190565b60008219821115620007db57620007db62000793565b500190565b600181811c90821680620007f557607f821691505b6020821081036200081657634e487b7160e01b600052602260045260246000fd5b50919050565b613ebb806200082c6000396000f3fe6080604052600436106103c75760003560e01c80636fc415eb116101f2578063c717e4e11161010d578063da6c3fed116100a0578063e985e9c51161006f578063e985e9c514610b01578063efd0cbf914610b4a578063f2fde38b14610b5d578063f846993014610b7d57600080fd5b8063da6c3fed14610a96578063dabdbac314610ab6578063e33b7de314610acc578063e4cb027e14610ae157600080fd5b8063d29352d3116100dc578063d29352d3146106a4578063d2d515cc14610a41578063d3d75b6014610a60578063d604a89014610a8057600080fd5b8063c717e4e1146109bf578063c87b56dd146109d5578063ca7da733146109f5578063ce7c2ac214610a0b57600080fd5b80638da5cb5b11610185578063a22cb46511610154578063a22cb46514610927578063a3330d2514610947578063b356076a14610967578063b88d4fde1461099f57600080fd5b80638da5cb5b1461089e57806391b7f5ed146108bc57806395d89b41146108dc5780639852595c146108f157600080fd5b806377b9d46c116101c157806377b9d46c14610832578063833b9499146108485780638b83209b1461085e5780638ba4cc3c1461087e57600080fd5b80636fc415eb146107e75780636fff3a3b1461065c57806370a08231146107fd578063715018a61461081d57600080fd5b8063381a2dc2116102e25780634f6ccce7116102755780635cbcec4e116102445780635cbcec4e146107675780636352211e14610787578063667ba618146107a75780636c19e783146107c757600080fd5b80634f6ccce7146106f157806354066a2d1461071157806355f804b3146107275780635ad1c1b51461074757600080fd5b80633de5534e116102b15780633de5534e146105a457806342842e0e1461068457806349e949e7146106a45780634c24fa7b146106c457600080fd5b8063381a2dc2146106345780633a98ef39146106475780633ac51b011461065c5780633ccfd60b1461067c57600080fd5b80631505104c1161035a57806323b872dd1161032957806323b872dd146105c45780632ca959cf146105e45780632f745c59146105fe57806332cb6b0c1461061e57600080fd5b80631505104c1461054257806318160ddd1461056f5780631916558714610584578063238bb6a1146105a457600080fd5b8063081812fc11610396578063081812fc146104a65780630928fc22146104de578063095ea7b3146104f35780630a41d00f1461051557600080fd5b806301e1870d1461041557806301ffc9a71461043e57806306fdde031461046e57806307543c991461049057600080fd5b36610410577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561042157600080fd5b5061042b601d5481565b6040519081526020015b60405180910390f35b34801561044a57600080fd5b5061045e6104593660046138a3565b610b93565b6040519015158152602001610435565b34801561047a57600080fd5b50610483610c64565b6040516104359190613918565b34801561049c57600080fd5b5061042b60135481565b3480156104b257600080fd5b506104c66104c136600461392b565b610cf6565b6040516001600160a01b039091168152602001610435565b3480156104ea57600080fd5b50610483610d96565b3480156104ff57600080fd5b5061051361050e366004613959565b610e24565b005b34801561052157600080fd5b5061042b610530366004613985565b60186020526000908152604090205481565b34801561054e57600080fd5b5061042b61055d36600461392b565b601c6020526000908152604090205481565b34801561057b57600080fd5b5060005461042b565b34801561059057600080fd5b5061051361059f366004613985565b610f56565b3480156105b057600080fd5b506105136105bf36600461392b565b611133565b3480156105d057600080fd5b506105136105df3660046139a2565b611192565b3480156105f057600080fd5b50600e5461045e9060ff1681565b34801561060a57600080fd5b5061042b610619366004613959565b61119d565b34801561062a57600080fd5b5061042b600f5481565b610513610642366004613a25565b611322565b34801561065357600080fd5b5060075461042b565b34801561066857600080fd5b5061051361067736600461392b565b611762565b6105136117c1565b34801561069057600080fd5b5061051361069f3660046139a2565b611873565b3480156106b057600080fd5b506105136106bf36600461392b565b61188e565b3480156106d057600080fd5b5061042b6106df366004613985565b601a6020526000908152604090205481565b3480156106fd57600080fd5b5061042b61070c36600461392b565b6118ed565b34801561071d57600080fd5b5061042b60115481565b34801561073357600080fd5b50610513610742366004613b18565b611969565b34801561075357600080fd5b50610513610762366004613b76565b6119da565b34801561077357600080fd5b50610513610782366004613b76565b611a6b565b34801561079357600080fd5b506104c66107a236600461392b565b611afd565b3480156107b357600080fd5b506105136107c236600461392b565b611b0f565b3480156107d357600080fd5b506105136107e2366004613985565b611b6e565b3480156107f357600080fd5b5061042b60175481565b34801561080957600080fd5b5061042b610818366004613985565b611c09565b34801561082957600080fd5b50610513611cb5565b34801561083e57600080fd5b5061042b601b5481565b34801561085457600080fd5b5061042b601e5481565b34801561086a57600080fd5b506104c661087936600461392b565b611d1b565b34801561088a57600080fd5b50610513610899366004613959565b611d4b565b3480156108aa57600080fd5b50600c546001600160a01b03166104c6565b3480156108c857600080fd5b506105136108d736600461392b565b611dca565b3480156108e857600080fd5b50610483611e29565b3480156108fd57600080fd5b5061042b61090c366004613985565b6001600160a01b03166000908152600a602052604090205490565b34801561093357600080fd5b50610513610942366004613b91565b611e38565b34801561095357600080fd5b50600e5461045e9062010000900460ff1681565b34801561097357600080fd5b5061042b610982366004613959565b601960209081526000928352604080842090915290825290205481565b3480156109ab57600080fd5b506105136109ba366004613bc6565b611efc565b3480156109cb57600080fd5b5061042b60125481565b3480156109e157600080fd5b506104836109f036600461392b565b611f8b565b348015610a0157600080fd5b5061042b60145481565b348015610a1757600080fd5b5061042b610a26366004613985565b6001600160a01b031660009081526009602052604090205490565b348015610a4d57600080fd5b50600e5461045e90610100900460ff1681565b348015610a6c57600080fd5b50610513610a7b36600461392b565b612066565b348015610a8c57600080fd5b5061042b60105481565b348015610aa257600080fd5b50610513610ab1366004613b76565b6120c5565b348015610ac257600080fd5b5061042b60165481565b348015610ad857600080fd5b5060085461042b565b348015610aed57600080fd5b50610513610afc366004613c46565b612132565b348015610b0d57600080fd5b5061045e610b1c366004613ca2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610513610b5836600461392b565b612492565b348015610b6957600080fd5b50610513610b78366004613985565b61270c565b348015610b8957600080fd5b5061042b60155481565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610bf657506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2a57506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c5e57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060018054610c7390613cdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90613cdb565b8015610cec5780601f10610cc157610100808354040283529160200191610cec565b820191906000526020600020905b815481529060010190602001808311610ccf57829003601f168201915b5050505050905090565b6000610d03826000541190565b610d7a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600d8054610da390613cdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613cdb565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b505050505081565b6000610e2f82611afd565b9050806001600160a01b0316836001600160a01b031603610eb85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b336001600160a01b0382161480610ed45750610ed48133610b1c565b610f465760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610d71565b610f518383836127eb565b505050565b6001600160a01b038116600090815260096020526040902054610fe15760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610d71565b6000610fec60085490565b610ff69047613d2b565b90506000611023838361101e866001600160a01b03166000908152600a602052604090205490565b61285f565b90508060000361109b5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b0383166000908152600a6020526040812080548392906110c3908490613d2b565b9250508190555080600860008282546110dc9190613d2b565b909155506110ec905083826128a5565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600c546001600160a01b0316331461118d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601555565b610f518383836129be565b60006111a883611c09565b821061121c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b600080549080805b838110156112b3576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561127757805192505b876001600160a01b0316836001600160a01b0316036112aa578684036112a357509350610c5e92505050565b6001909301925b50600101611224565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610d71565b600054600e54610100900460ff1661133957600080fd5b601754821461138a5760405162461bcd60e51b815260206004820152601960248201527f4e6f74207468652063757272656e7420616c6c6f776c697374000000000000006044820152606401610d71565b6015548311156114025760405162461bcd60e51b815260206004820152603960248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c657420696e2074686973205068617365000000000000006064820152608401610d71565b6011546000838152601c602052604090205411156114625760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f5461146f8483613d2b565b11156114bd5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b336001600160a01b038716146115155760405162461bcd60e51b815260206004820152601060248201527f4e6f7420796f757220766f7563686572000000000000000000000000000000006044820152606401610d71565b33321461152157600080fd5b6015546001600160a01b0387166000908152601960209081526040808320868452909152902054106115bb5760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b82601e546115c99190613d43565b3410156116185760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610d71565b6040516bffffffffffffffffffffffff19606088901b1660208201526000906034016040516020818303038152906040528051906020012090506116a8600e60039054906101000a90046001600160a01b03168288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cfe92505050565b6116f45760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420766f756368657200000000000000000000000000000000006044820152606401610d71565b6116fe8785612d7d565b6001600160a01b038716600090815260196020908152604080832086845290915281208054869290611731908490613d2b565b90915550506000838152601c602052604081208054869290611754908490613d2b565b909155505050505050505050565b600c546001600160a01b031633146117bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601355565b600c546001600160a01b0316331461181b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b604051600090339047908381818185875af1925050503d806000811461185d576040519150601f19603f3d011682016040523d82523d6000602084013e611862565b606091505b505090508061187057600080fd5b50565b610f5183838360405180602001604052806000815250611efc565b600c546001600160a01b031633146118e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601655565b6000805482106119655760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610d71565b5090565b600c546001600160a01b031633146119c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b80516119d690600d9060208401906137fd565b5050565b600c546001600160a01b03163314611a345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b600c546001600160a01b03163314611ac55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b6000611b0882612d97565b5192915050565b600c546001600160a01b03163314611b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601755565b600c546001600160a01b03163314611bc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e80546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60006001600160a01b038216611c875760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610d71565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b600c546001600160a01b03163314611d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b611d196000612e81565b565b6000600b8281548110611d3057611d30613d62565b6000918252602090912001546001600160a01b031692915050565b600c546001600160a01b03163314611da55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600054600f54611db58383613d2b565b1115611dc057600080fd5b610f518383612d7d565b600c546001600160a01b03163314611e245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601e55565b606060028054610c7390613cdb565b336001600160a01b03831603611e905760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610d71565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f078484846129be565b611f1384848484612eeb565b611f855760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b50505050565b6060611f98826000541190565b61200a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610d71565b6000612014613074565b90508051600003612034576040518060200160405280600081525061205f565b8061203e84613083565b60405160200161204f929190613d78565b6040516020818303038152906040525b9392505050565b600c546001600160a01b031633146120c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601455565b600c546001600160a01b0316331461211f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e805460ff1916911515919091179055565b600054600e5460ff1661214457600080fd5b6014548211156121bc5760405162461bcd60e51b815260206004820152602e60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f20696e20746869732050686173650000000000000000000000000000000000006064820152608401610d71565b601054601b5411156122105760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f5461221d8383613d2b565b111561226b5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b336001600160a01b038616146122c35760405162461bcd60e51b815260206004820152601060248201527f4e6f7420796f757220766f7563686572000000000000000000000000000000006044820152606401610d71565b3332146122cf57600080fd5b6013546001600160a01b0386166000908152601860205260409020541061235e5760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b6040516bffffffffffffffffffffffff19606087901b1660208201526000906034016040516020818303038152906040528051906020012090506123ee600e60039054906101000a90046001600160a01b03168287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cfe92505050565b61243a5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420766f756368657200000000000000000000000000000000006044820152606401610d71565b6124448684612d7d565b6001600160a01b0386166000908152601860205260408120805485929061246c908490613d2b565b9250508190555082601b60008282546124859190613d2b565b9091555050505050505050565b600054600e5462010000900460ff166124aa57600080fd5b6016548211156125225760405162461bcd60e51b815260206004820152603960248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c657420696e2074686973205068617365000000000000006064820152608401610d71565b601254601d5411156125765760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f546125838383613d2b565b11156125d15760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b3332146125dd57600080fd5b601654336000908152601a602052604090205411156126645760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b81601e546126729190613d43565b3410156126c15760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610d71565b6126cb3383612d7d565b336000908152601a6020526040812080548492906126ea908490613d2b565b9250508190555081601d60008282546127039190613d2b565b90915550505050565b600c546001600160a01b031633146127665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d71565b61187081612e81565b60008281526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6007546001600160a01b038416600090815260096020526040812054909183916128899086613d43565b6128939190613dbd565b61289d9190613dd1565b949350505050565b804710156128f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d71565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612942576040519150601f19603f3d011682016040523d82523d6000602084013e612947565b606091505b5050905080610f515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d71565b60006129c982612d97565b80519091506000906001600160a01b0316336001600160a01b03161480612a005750336129f584610cf6565b6001600160a01b0316145b80612a1257508151612a129033610b1c565b905080612a875760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610d71565b846001600160a01b031682600001516001600160a01b031614612b125760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b038416612b8e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610d71565b612b9e60008484600001516127eb565b6001600160a01b03858116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffff000000000000000000000000000000008082166fffffffffffffffffffffffffffffffff928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612cb457612c67816000541190565b15612cb4578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000612d60612d5a846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b836131b8565b6001600160a01b0316846001600160a01b03161490509392505050565b6119d68282604051806020016040528060008152506131dc565b6040805180820190915260008082526020820152612db6826000541190565b612e285760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610d71565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612e77579392505050565b5060001901612e2a565b600c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15613069576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f48903390899088908890600401613de8565b6020604051808303816000875af1925050508015612f83575060408051601f3d908101601f19168201909252612f8091810190613e24565b60015b613036573d808015612fb1576040519150601f19603f3d011682016040523d82523d6000602084013e612fb6565b606091505b50805160000361302e5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061289d565b506001949350505050565b6060600d8054610c7390613cdb565b6060816000036130c657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156130f057806130da81613e41565b91506130e99050600a83613dbd565b91506130ca565b60008167ffffffffffffffff81111561310b5761310b613a8c565b6040519080825280601f01601f191660200182016040528015613135576020820181803683370190505b5090505b841561289d5761314a600183613dd1565b9150613157600a86613e5b565b613162906030613d2b565b60f81b81838151811061317757613177613d62565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506131b1600a86613dbd565b9450613139565b60008060006131c785856131e9565b915091506131d481613257565b509392505050565b610f518383836001613443565b600080825160410361321f5760208301516040840151606085015160001a613213878285856136be565b94509450505050613250565b8251604003613248576020830151604084015161323d8683836137ab565b935093505050613250565b506000905060025b9250929050565b600081600481111561326b5761326b613e6f565b036132735750565b600181600481111561328757613287613e6f565b036132d45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d71565b60028160048111156132e8576132e8613e6f565b036133355760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d71565b600381600481111561334957613349613e6f565b036133bc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b60048160048111156133d0576133d0613e6f565b036118705760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b6000546001600160a01b0385166134c25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b836000036135385760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201527f72207468616e20300000000000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b038516600081815260046020908152604080832080547001000000000000000000000000000000007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082166fffffffffffffffffffffffffffffffff9283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156136b55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156136a9576136376000888488612eeb565b6136a95760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b600191820191016135e4565b50600055612cf7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156136f557506000905060036137a2565b8460ff16601b1415801561370d57508460ff16601c14155b1561371e57506000905060046137a2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613772573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661379b576000600192509250506137a2565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816137e160ff86901c601b613d2b565b90506137ef878288856136be565b935093505050935093915050565b82805461380990613cdb565b90600052602060002090601f01602090048101928261382b5760008555613871565b82601f1061384457805160ff1916838001178555613871565b82800160010185558215613871579182015b82811115613871578251825591602001919060010190613856565b506119659291505b808211156119655760008155600101613879565b6001600160e01b03198116811461187057600080fd5b6000602082840312156138b557600080fd5b813561205f8161388d565b60005b838110156138db5781810151838201526020016138c3565b83811115611f855750506000910152565b600081518084526139048160208601602086016138c0565b601f01601f19169290920160200192915050565b60208152600061205f60208301846138ec565b60006020828403121561393d57600080fd5b5035919050565b6001600160a01b038116811461187057600080fd5b6000806040838503121561396c57600080fd5b823561397781613944565b946020939093013593505050565b60006020828403121561399757600080fd5b813561205f81613944565b6000806000606084860312156139b757600080fd5b83356139c281613944565b925060208401356139d281613944565b929592945050506040919091013590565b60008083601f8401126139f557600080fd5b50813567ffffffffffffffff811115613a0d57600080fd5b60208301915083602082850101111561325057600080fd5b600080600080600060808688031215613a3d57600080fd5b8535613a4881613944565b9450602086013567ffffffffffffffff811115613a6457600080fd5b613a70888289016139e3565b9699909850959660408101359660609091013595509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613abd57613abd613a8c565b604051601f8501601f19908116603f01168101908282118183101715613ae557613ae5613a8c565b81604052809350858152868686011115613afe57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613b2a57600080fd5b813567ffffffffffffffff811115613b4157600080fd5b8201601f81018413613b5257600080fd5b61289d84823560208401613aa2565b80358015158114613b7157600080fd5b919050565b600060208284031215613b8857600080fd5b61205f82613b61565b60008060408385031215613ba457600080fd5b8235613baf81613944565b9150613bbd60208401613b61565b90509250929050565b60008060008060808587031215613bdc57600080fd5b8435613be781613944565b93506020850135613bf781613944565b925060408501359150606085013567ffffffffffffffff811115613c1a57600080fd5b8501601f81018713613c2b57600080fd5b613c3a87823560208401613aa2565b91505092959194509250565b60008060008060608587031215613c5c57600080fd5b8435613c6781613944565b9350602085013567ffffffffffffffff811115613c8357600080fd5b613c8f878288016139e3565b9598909750949560400135949350505050565b60008060408385031215613cb557600080fd5b8235613cc081613944565b91506020830135613cd081613944565b809150509250929050565b600181811c90821680613cef57607f821691505b602082108103613d0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613d3e57613d3e613d15565b500190565b6000816000190483118215151615613d5d57613d5d613d15565b500290565b634e487b7160e01b600052603260045260246000fd5b60008351613d8a8184602088016138c0565b835190830190613d9e8183602088016138c0565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613dcc57613dcc613da7565b500490565b600082821015613de357613de3613d15565b500390565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e1a60808301846138ec565b9695505050505050565b600060208284031215613e3657600080fd5b815161205f8161388d565b60006000198203613e5457613e54613d15565b5060010190565b600082613e6a57613e6a613da7565b500690565b634e487b7160e01b600052602160045260246000fdfea264697066735822122014ff39d3abcdecbe0db84cc981639211365d6a4ba8729070f11e086823f33bdc64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c80636fc415eb116101f2578063c717e4e11161010d578063da6c3fed116100a0578063e985e9c51161006f578063e985e9c514610b01578063efd0cbf914610b4a578063f2fde38b14610b5d578063f846993014610b7d57600080fd5b8063da6c3fed14610a96578063dabdbac314610ab6578063e33b7de314610acc578063e4cb027e14610ae157600080fd5b8063d29352d3116100dc578063d29352d3146106a4578063d2d515cc14610a41578063d3d75b6014610a60578063d604a89014610a8057600080fd5b8063c717e4e1146109bf578063c87b56dd146109d5578063ca7da733146109f5578063ce7c2ac214610a0b57600080fd5b80638da5cb5b11610185578063a22cb46511610154578063a22cb46514610927578063a3330d2514610947578063b356076a14610967578063b88d4fde1461099f57600080fd5b80638da5cb5b1461089e57806391b7f5ed146108bc57806395d89b41146108dc5780639852595c146108f157600080fd5b806377b9d46c116101c157806377b9d46c14610832578063833b9499146108485780638b83209b1461085e5780638ba4cc3c1461087e57600080fd5b80636fc415eb146107e75780636fff3a3b1461065c57806370a08231146107fd578063715018a61461081d57600080fd5b8063381a2dc2116102e25780634f6ccce7116102755780635cbcec4e116102445780635cbcec4e146107675780636352211e14610787578063667ba618146107a75780636c19e783146107c757600080fd5b80634f6ccce7146106f157806354066a2d1461071157806355f804b3146107275780635ad1c1b51461074757600080fd5b80633de5534e116102b15780633de5534e146105a457806342842e0e1461068457806349e949e7146106a45780634c24fa7b146106c457600080fd5b8063381a2dc2146106345780633a98ef39146106475780633ac51b011461065c5780633ccfd60b1461067c57600080fd5b80631505104c1161035a57806323b872dd1161032957806323b872dd146105c45780632ca959cf146105e45780632f745c59146105fe57806332cb6b0c1461061e57600080fd5b80631505104c1461054257806318160ddd1461056f5780631916558714610584578063238bb6a1146105a457600080fd5b8063081812fc11610396578063081812fc146104a65780630928fc22146104de578063095ea7b3146104f35780630a41d00f1461051557600080fd5b806301e1870d1461041557806301ffc9a71461043e57806306fdde031461046e57806307543c991461049057600080fd5b36610410577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561042157600080fd5b5061042b601d5481565b6040519081526020015b60405180910390f35b34801561044a57600080fd5b5061045e6104593660046138a3565b610b93565b6040519015158152602001610435565b34801561047a57600080fd5b50610483610c64565b6040516104359190613918565b34801561049c57600080fd5b5061042b60135481565b3480156104b257600080fd5b506104c66104c136600461392b565b610cf6565b6040516001600160a01b039091168152602001610435565b3480156104ea57600080fd5b50610483610d96565b3480156104ff57600080fd5b5061051361050e366004613959565b610e24565b005b34801561052157600080fd5b5061042b610530366004613985565b60186020526000908152604090205481565b34801561054e57600080fd5b5061042b61055d36600461392b565b601c6020526000908152604090205481565b34801561057b57600080fd5b5060005461042b565b34801561059057600080fd5b5061051361059f366004613985565b610f56565b3480156105b057600080fd5b506105136105bf36600461392b565b611133565b3480156105d057600080fd5b506105136105df3660046139a2565b611192565b3480156105f057600080fd5b50600e5461045e9060ff1681565b34801561060a57600080fd5b5061042b610619366004613959565b61119d565b34801561062a57600080fd5b5061042b600f5481565b610513610642366004613a25565b611322565b34801561065357600080fd5b5060075461042b565b34801561066857600080fd5b5061051361067736600461392b565b611762565b6105136117c1565b34801561069057600080fd5b5061051361069f3660046139a2565b611873565b3480156106b057600080fd5b506105136106bf36600461392b565b61188e565b3480156106d057600080fd5b5061042b6106df366004613985565b601a6020526000908152604090205481565b3480156106fd57600080fd5b5061042b61070c36600461392b565b6118ed565b34801561071d57600080fd5b5061042b60115481565b34801561073357600080fd5b50610513610742366004613b18565b611969565b34801561075357600080fd5b50610513610762366004613b76565b6119da565b34801561077357600080fd5b50610513610782366004613b76565b611a6b565b34801561079357600080fd5b506104c66107a236600461392b565b611afd565b3480156107b357600080fd5b506105136107c236600461392b565b611b0f565b3480156107d357600080fd5b506105136107e2366004613985565b611b6e565b3480156107f357600080fd5b5061042b60175481565b34801561080957600080fd5b5061042b610818366004613985565b611c09565b34801561082957600080fd5b50610513611cb5565b34801561083e57600080fd5b5061042b601b5481565b34801561085457600080fd5b5061042b601e5481565b34801561086a57600080fd5b506104c661087936600461392b565b611d1b565b34801561088a57600080fd5b50610513610899366004613959565b611d4b565b3480156108aa57600080fd5b50600c546001600160a01b03166104c6565b3480156108c857600080fd5b506105136108d736600461392b565b611dca565b3480156108e857600080fd5b50610483611e29565b3480156108fd57600080fd5b5061042b61090c366004613985565b6001600160a01b03166000908152600a602052604090205490565b34801561093357600080fd5b50610513610942366004613b91565b611e38565b34801561095357600080fd5b50600e5461045e9062010000900460ff1681565b34801561097357600080fd5b5061042b610982366004613959565b601960209081526000928352604080842090915290825290205481565b3480156109ab57600080fd5b506105136109ba366004613bc6565b611efc565b3480156109cb57600080fd5b5061042b60125481565b3480156109e157600080fd5b506104836109f036600461392b565b611f8b565b348015610a0157600080fd5b5061042b60145481565b348015610a1757600080fd5b5061042b610a26366004613985565b6001600160a01b031660009081526009602052604090205490565b348015610a4d57600080fd5b50600e5461045e90610100900460ff1681565b348015610a6c57600080fd5b50610513610a7b36600461392b565b612066565b348015610a8c57600080fd5b5061042b60105481565b348015610aa257600080fd5b50610513610ab1366004613b76565b6120c5565b348015610ac257600080fd5b5061042b60165481565b348015610ad857600080fd5b5060085461042b565b348015610aed57600080fd5b50610513610afc366004613c46565b612132565b348015610b0d57600080fd5b5061045e610b1c366004613ca2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610513610b5836600461392b565b612492565b348015610b6957600080fd5b50610513610b78366004613985565b61270c565b348015610b8957600080fd5b5061042b60155481565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610bf657506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2a57506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c5e57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060018054610c7390613cdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90613cdb565b8015610cec5780601f10610cc157610100808354040283529160200191610cec565b820191906000526020600020905b815481529060010190602001808311610ccf57829003601f168201915b5050505050905090565b6000610d03826000541190565b610d7a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600d8054610da390613cdb565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613cdb565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b505050505081565b6000610e2f82611afd565b9050806001600160a01b0316836001600160a01b031603610eb85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b336001600160a01b0382161480610ed45750610ed48133610b1c565b610f465760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610d71565b610f518383836127eb565b505050565b6001600160a01b038116600090815260096020526040902054610fe15760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610d71565b6000610fec60085490565b610ff69047613d2b565b90506000611023838361101e866001600160a01b03166000908152600a602052604090205490565b61285f565b90508060000361109b5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b0383166000908152600a6020526040812080548392906110c3908490613d2b565b9250508190555080600860008282546110dc9190613d2b565b909155506110ec905083826128a5565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600c546001600160a01b0316331461118d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601555565b610f518383836129be565b60006111a883611c09565b821061121c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b600080549080805b838110156112b3576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561127757805192505b876001600160a01b0316836001600160a01b0316036112aa578684036112a357509350610c5e92505050565b6001909301925b50600101611224565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610d71565b600054600e54610100900460ff1661133957600080fd5b601754821461138a5760405162461bcd60e51b815260206004820152601960248201527f4e6f74207468652063757272656e7420616c6c6f776c697374000000000000006044820152606401610d71565b6015548311156114025760405162461bcd60e51b815260206004820152603960248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c657420696e2074686973205068617365000000000000006064820152608401610d71565b6011546000838152601c602052604090205411156114625760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f5461146f8483613d2b565b11156114bd5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b336001600160a01b038716146115155760405162461bcd60e51b815260206004820152601060248201527f4e6f7420796f757220766f7563686572000000000000000000000000000000006044820152606401610d71565b33321461152157600080fd5b6015546001600160a01b0387166000908152601960209081526040808320868452909152902054106115bb5760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b82601e546115c99190613d43565b3410156116185760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610d71565b6040516bffffffffffffffffffffffff19606088901b1660208201526000906034016040516020818303038152906040528051906020012090506116a8600e60039054906101000a90046001600160a01b03168288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cfe92505050565b6116f45760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420766f756368657200000000000000000000000000000000006044820152606401610d71565b6116fe8785612d7d565b6001600160a01b038716600090815260196020908152604080832086845290915281208054869290611731908490613d2b565b90915550506000838152601c602052604081208054869290611754908490613d2b565b909155505050505050505050565b600c546001600160a01b031633146117bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601355565b600c546001600160a01b0316331461181b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b604051600090339047908381818185875af1925050503d806000811461185d576040519150601f19603f3d011682016040523d82523d6000602084013e611862565b606091505b505090508061187057600080fd5b50565b610f5183838360405180602001604052806000815250611efc565b600c546001600160a01b031633146118e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601655565b6000805482106119655760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610d71565b5090565b600c546001600160a01b031633146119c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b80516119d690600d9060208401906137fd565b5050565b600c546001600160a01b03163314611a345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b600c546001600160a01b03163314611ac55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b6000611b0882612d97565b5192915050565b600c546001600160a01b03163314611b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601755565b600c546001600160a01b03163314611bc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e80546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60006001600160a01b038216611c875760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610d71565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b600c546001600160a01b03163314611d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b611d196000612e81565b565b6000600b8281548110611d3057611d30613d62565b6000918252602090912001546001600160a01b031692915050565b600c546001600160a01b03163314611da55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600054600f54611db58383613d2b565b1115611dc057600080fd5b610f518383612d7d565b600c546001600160a01b03163314611e245760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601e55565b606060028054610c7390613cdb565b336001600160a01b03831603611e905760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610d71565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f078484846129be565b611f1384848484612eeb565b611f855760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b50505050565b6060611f98826000541190565b61200a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610d71565b6000612014613074565b90508051600003612034576040518060200160405280600081525061205f565b8061203e84613083565b60405160200161204f929190613d78565b6040516020818303038152906040525b9392505050565b600c546001600160a01b031633146120c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b601455565b600c546001600160a01b0316331461211f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b600e805460ff1916911515919091179055565b600054600e5460ff1661214457600080fd5b6014548211156121bc5760405162461bcd60e51b815260206004820152602e60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f20696e20746869732050686173650000000000000000000000000000000000006064820152608401610d71565b601054601b5411156122105760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f5461221d8383613d2b565b111561226b5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b336001600160a01b038616146122c35760405162461bcd60e51b815260206004820152601060248201527f4e6f7420796f757220766f7563686572000000000000000000000000000000006044820152606401610d71565b3332146122cf57600080fd5b6013546001600160a01b0386166000908152601860205260409020541061235e5760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b6040516bffffffffffffffffffffffff19606087901b1660208201526000906034016040516020818303038152906040528051906020012090506123ee600e60039054906101000a90046001600160a01b03168287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cfe92505050565b61243a5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420766f756368657200000000000000000000000000000000006044820152606401610d71565b6124448684612d7d565b6001600160a01b0386166000908152601860205260408120805485929061246c908490613d2b565b9250508190555082601b60008282546124859190613d2b565b9091555050505050505050565b600054600e5462010000900460ff166124aa57600080fd5b6016548211156125225760405162461bcd60e51b815260206004820152603960248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c657420696e2074686973205068617365000000000000006064820152608401610d71565b601254601d5411156125765760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b600f546125838383613d2b565b11156125d15760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e736044820152606401610d71565b3332146125dd57600080fd5b601654336000908152601a602052604090205411156126645760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201527f207065722057616c6c65740000000000000000000000000000000000000000006064820152608401610d71565b81601e546126729190613d43565b3410156126c15760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610d71565b6126cb3383612d7d565b336000908152601a6020526040812080548492906126ea908490613d2b565b9250508190555081601d60008282546127039190613d2b565b90915550505050565b600c546001600160a01b031633146127665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d71565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d71565b61187081612e81565b60008281526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6007546001600160a01b038416600090815260096020526040812054909183916128899086613d43565b6128939190613dbd565b61289d9190613dd1565b949350505050565b804710156128f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d71565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612942576040519150601f19603f3d011682016040523d82523d6000602084013e612947565b606091505b5050905080610f515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d71565b60006129c982612d97565b80519091506000906001600160a01b0316336001600160a01b03161480612a005750336129f584610cf6565b6001600160a01b0316145b80612a1257508151612a129033610b1c565b905080612a875760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610d71565b846001600160a01b031682600001516001600160a01b031614612b125760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b038416612b8e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610d71565b612b9e60008484600001516127eb565b6001600160a01b03858116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffff000000000000000000000000000000008082166fffffffffffffffffffffffffffffffff928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612cb457612c67816000541190565b15612cb4578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000612d60612d5a846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b836131b8565b6001600160a01b0316846001600160a01b03161490509392505050565b6119d68282604051806020016040528060008152506131dc565b6040805180820190915260008082526020820152612db6826000541190565b612e285760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610d71565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612e77579392505050565b5060001901612e2a565b600c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15613069576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f48903390899088908890600401613de8565b6020604051808303816000875af1925050508015612f83575060408051601f3d908101601f19168201909252612f8091810190613e24565b60015b613036573d808015612fb1576040519150601f19603f3d011682016040523d82523d6000602084013e612fb6565b606091505b50805160000361302e5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061289d565b506001949350505050565b6060600d8054610c7390613cdb565b6060816000036130c657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156130f057806130da81613e41565b91506130e99050600a83613dbd565b91506130ca565b60008167ffffffffffffffff81111561310b5761310b613a8c565b6040519080825280601f01601f191660200182016040528015613135576020820181803683370190505b5090505b841561289d5761314a600183613dd1565b9150613157600a86613e5b565b613162906030613d2b565b60f81b81838151811061317757613177613d62565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506131b1600a86613dbd565b9450613139565b60008060006131c785856131e9565b915091506131d481613257565b509392505050565b610f518383836001613443565b600080825160410361321f5760208301516040840151606085015160001a613213878285856136be565b94509450505050613250565b8251604003613248576020830151604084015161323d8683836137ab565b935093505050613250565b506000905060025b9250929050565b600081600481111561326b5761326b613e6f565b036132735750565b600181600481111561328757613287613e6f565b036132d45760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d71565b60028160048111156132e8576132e8613e6f565b036133355760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d71565b600381600481111561334957613349613e6f565b036133bc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b60048160048111156133d0576133d0613e6f565b036118705760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b6000546001600160a01b0385166134c25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610d71565b836000036135385760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201527f72207468616e20300000000000000000000000000000000000000000000000006064820152608401610d71565b6001600160a01b038516600081815260046020908152604080832080547001000000000000000000000000000000007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082166fffffffffffffffffffffffffffffffff9283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156136b55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156136a9576136376000888488612eeb565b6136a95760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610d71565b600191820191016135e4565b50600055612cf7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156136f557506000905060036137a2565b8460ff16601b1415801561370d57508460ff16601c14155b1561371e57506000905060046137a2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613772573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661379b576000600192509250506137a2565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816137e160ff86901c601b613d2b565b90506137ef878288856136be565b935093505050935093915050565b82805461380990613cdb565b90600052602060002090601f01602090048101928261382b5760008555613871565b82601f1061384457805160ff1916838001178555613871565b82800160010185558215613871579182015b82811115613871578251825591602001919060010190613856565b506119659291505b808211156119655760008155600101613879565b6001600160e01b03198116811461187057600080fd5b6000602082840312156138b557600080fd5b813561205f8161388d565b60005b838110156138db5781810151838201526020016138c3565b83811115611f855750506000910152565b600081518084526139048160208601602086016138c0565b601f01601f19169290920160200192915050565b60208152600061205f60208301846138ec565b60006020828403121561393d57600080fd5b5035919050565b6001600160a01b038116811461187057600080fd5b6000806040838503121561396c57600080fd5b823561397781613944565b946020939093013593505050565b60006020828403121561399757600080fd5b813561205f81613944565b6000806000606084860312156139b757600080fd5b83356139c281613944565b925060208401356139d281613944565b929592945050506040919091013590565b60008083601f8401126139f557600080fd5b50813567ffffffffffffffff811115613a0d57600080fd5b60208301915083602082850101111561325057600080fd5b600080600080600060808688031215613a3d57600080fd5b8535613a4881613944565b9450602086013567ffffffffffffffff811115613a6457600080fd5b613a70888289016139e3565b9699909850959660408101359660609091013595509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613abd57613abd613a8c565b604051601f8501601f19908116603f01168101908282118183101715613ae557613ae5613a8c565b81604052809350858152868686011115613afe57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613b2a57600080fd5b813567ffffffffffffffff811115613b4157600080fd5b8201601f81018413613b5257600080fd5b61289d84823560208401613aa2565b80358015158114613b7157600080fd5b919050565b600060208284031215613b8857600080fd5b61205f82613b61565b60008060408385031215613ba457600080fd5b8235613baf81613944565b9150613bbd60208401613b61565b90509250929050565b60008060008060808587031215613bdc57600080fd5b8435613be781613944565b93506020850135613bf781613944565b925060408501359150606085013567ffffffffffffffff811115613c1a57600080fd5b8501601f81018713613c2b57600080fd5b613c3a87823560208401613aa2565b91505092959194509250565b60008060008060608587031215613c5c57600080fd5b8435613c6781613944565b9350602085013567ffffffffffffffff811115613c8357600080fd5b613c8f878288016139e3565b9598909750949560400135949350505050565b60008060408385031215613cb557600080fd5b8235613cc081613944565b91506020830135613cd081613944565b809150509250929050565b600181811c90821680613cef57607f821691505b602082108103613d0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613d3e57613d3e613d15565b500190565b6000816000190483118215151615613d5d57613d5d613d15565b500290565b634e487b7160e01b600052603260045260246000fd5b60008351613d8a8184602088016138c0565b835190830190613d9e8183602088016138c0565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613dcc57613dcc613da7565b500490565b600082821015613de357613de3613d15565b500390565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e1a60808301846138ec565b9695505050505050565b600060208284031215613e3657600080fd5b815161205f8161388d565b60006000198203613e5457613e54613d15565b5060010190565b600082613e6a57613e6a613da7565b500690565b634e487b7160e01b600052602160045260246000fdfea264697066735822122014ff39d3abcdecbe0db84cc981639211365d6a4ba8729070f11e086823f33bdc64736f6c634300080d0033

Deployed Bytecode Sourcemap

53506:7867:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:40;12192:10;25389:40;;;-1:-1:-1;;;;;206:55:1;;;188:74;;25419:9:0;293:2:1;278:18;;271:34;161:18;25389:40:0;;;;;;;53506:7867;;;;;54909:30;;;;;;;;;;;;;;;;;;;462:25:1;;;450:2;435:18;54909:30:0;;;;;;;;40355:372;;;;;;;;;;-1:-1:-1;40355:372:0;;;;;:::i;:::-;;:::i;:::-;;;1095:14:1;;1088:22;1070:41;;1058:2;1043:18;40355:372:0;930:187:1;42241:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54202:42::-;;;;;;;;;;;;;;;;43803:214;;;;;;;;;;-1:-1:-1;43803:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2281:55:1;;;2263:74;;2251:2;2236:18;43803:214:0;2117:226:1;53599:30:0;;;;;;;;;;;;;:::i;43324:413::-;;;;;;;;;;-1:-1:-1;43324:413:0;;;;;:::i;:::-;;:::i;:::-;;54596:57;;;;;;;;;;-1:-1:-1;54596:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;54849:53;;;;;;;;;;-1:-1:-1;54849:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;38612:100;;;;;;;;;;-1:-1:-1;38665:7:0;38692:12;38612:100;;26599:566;;;;;;;;;;-1:-1:-1;26599:566:0;;;;;:::i;:::-;;:::i;60151:125::-;;;;;;;;;;-1:-1:-1;60151:125:0;;;;;:::i;:::-;;:::i;44679:162::-;;;;;;;;;;-1:-1:-1;44679:162:0;;;;;:::i;:::-;;:::i;53658:41::-;;;;;;;;;;-1:-1:-1;53658:41:0;;;;;;;;39276:1007;;;;;;;;;;-1:-1:-1;39276:1007:0;;;;;:::i;:::-;;:::i;53902:32::-;;;;;;;;;;;;;;;;56640:1302;;;;;;:::i;:::-;;:::i;25520:91::-;;;;;;;;;;-1:-1:-1;25591:12:0;;25520:91;;59886:115;;;;;;;;;;-1:-1:-1;59886:115:0;;;;;:::i;:::-;;:::i;61218:152::-;;;:::i;44912:177::-;;;;;;;;;;-1:-1:-1;44912:177:0;;;;;:::i;:::-;;:::i;60284:119::-;;;;;;;;;;-1:-1:-1;60284:119:0;;;;;:::i;:::-;;:::i;54746:59::-;;;;;;;;;;-1:-1:-1;54746:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;38789:187;;;;;;;;;;-1:-1:-1;38789:187:0;;;;;:::i;:::-;;:::i;54027:51::-;;;;;;;;;;;;;;;;60976:109;;;;;;;;;;-1:-1:-1;60976:109:0;;;;;:::i;:::-;;:::i;59650:101::-;;;;;;;;;;-1:-1:-1;59650:101:0;;;;;:::i;:::-;;:::i;59759:95::-;;;;;;;;;;-1:-1:-1;59759:95:0;;;;;:::i;:::-;;:::i;42050:124::-;;;;;;;;;;-1:-1:-1;42050:124:0;;;;;:::i;:::-;;:::i;60835:117::-;;;;;;;;;;-1:-1:-1;60835:117:0;;;;;:::i;:::-;;:::i;59281:90::-;;;;;;;;;;-1:-1:-1;59281:90:0;;;;;:::i;:::-;;:::i;54538:36::-;;;;;;;;;;;;;;;;40791:221;;;;;;;;;;-1:-1:-1;40791:221:0;;;;;:::i;:::-;;:::i;13942:94::-;;;;;;;;;;;;;:::i;54814:28::-;;;;;;;;;;;;;;;;54948:43;;;;;;;;;;;;;;;;26299:100;;;;;;;;;;-1:-1:-1;26299:100:0;;;;;:::i;:::-;;:::i;58835:202::-;;;;;;;;;;-1:-1:-1;58835:202:0;;;;;:::i;:::-;;:::i;13291:87::-;;;;;;;;;;-1:-1:-1;13364:6:0;;-1:-1:-1;;;;;13364:6:0;13291:87;;59398:102;;;;;;;;;;-1:-1:-1;59398:102:0;;;;;:::i;:::-;;:::i;42410:104::-;;;;;;;;;;;;;:::i;26097:109::-;;;;;;;;;;-1:-1:-1;26097:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;26180:18:0;26153:7;26180:18;;;:9;:18;;;;;;;26097:109;44089:288;;;;;;;;;;-1:-1:-1;44089:288:0;;;;;:::i;:::-;;:::i;53750:34::-;;;;;;;;;;-1:-1:-1;53750:34:0;;;;;;;;;;;54660:79;;;;;;;;;;-1:-1:-1;54660:79:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45160:355;;;;;;;;;;-1:-1:-1;45160:355:0;;;;;:::i;:::-;;:::i;54115:48::-;;;;;;;;;;;;;;;;42585:335;;;;;;;;;;-1:-1:-1;42585:335:0;;;;;:::i;:::-;;:::i;54281:53::-;;;;;;;;;;;;;;;;25893:105;;;;;;;;;;-1:-1:-1;25893:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;25974:16:0;25947:7;25974:16;;;:7;:16;;;;;;;25893:105;53706:37;;;;;;;;;;-1:-1:-1;53706:37:0;;;;;;;;;;;60009:134;;;;;;;;;;-1:-1:-1;60009:134:0;;;;;:::i;:::-;;:::i;53943:47::-;;;;;;;;;;;;;;;;59508:109;;;;;;;;;;-1:-1:-1;59508:109:0;;;;;:::i;:::-;;:::i;54455:44::-;;;;;;;;;;;;;;;;25705:95;;;;;;;;;;-1:-1:-1;25778:14:0;;25705:95;;55619:1015;;;;;;;;;;-1:-1:-1;55619:1015:0;;;;;:::i;:::-;;:::i;44448:164::-;;;;;;;;;;-1:-1:-1;44448:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44569:25:0;;;44545:4;44569:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44448:164;57948:865;;;;;;:::i;:::-;;:::i;14191:192::-;;;;;;;;;;-1:-1:-1;14191:192:0;;;;;:::i;:::-;;:::i;54371:47::-;;;;;;;;;;;;;;;;40355:372;40457:4;-1:-1:-1;;;;;;40494:40:0;;40509:25;40494:40;;:105;;-1:-1:-1;;;;;;;40551:48:0;;40566:33;40551:48;40494:105;:172;;;-1:-1:-1;;;;;;;40616:50:0;;40631:35;40616:50;40494:172;:225;;;-1:-1:-1;30867:25:0;-1:-1:-1;;;;;;30852:40:0;;;40683:36;40474:245;40355:372;-1:-1:-1;;40355:372:0:o;42241:100::-;42295:13;42328:5;42321:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42241:100;:::o;43803:214::-;43871:7;43899:16;43907:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;43899:16;43891:74;;;;-1:-1:-1;;;43891:74:0;;9303:2:1;43891:74:0;;;9285:21:1;9342:2;9322:18;;;9315:30;9381:34;9361:18;;;9354:62;9452:15;9432:18;;;9425:43;9485:19;;43891:74:0;;;;;;;;;-1:-1:-1;43985:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43985:24:0;;43803:214::o;53599:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43324:413::-;43397:13;43413:24;43429:7;43413:15;:24::i;:::-;43397:40;;43462:5;-1:-1:-1;;;;;43456:11:0;:2;-1:-1:-1;;;;;43456:11:0;;43448:58;;;;-1:-1:-1;;;43448:58:0;;9717:2:1;43448:58:0;;;9699:21:1;9756:2;9736:18;;;9729:30;9795:34;9775:18;;;9768:62;9866:4;9846:18;;;9839:32;9888:19;;43448:58:0;9515:398:1;43448:58:0;12192:10;-1:-1:-1;;;;;43541:21:0;;;;:62;;-1:-1:-1;43566:37:0;43583:5;12192:10;44448:164;:::i;43566:37::-;43519:169;;;;-1:-1:-1;;;43519:169:0;;10120:2:1;43519:169:0;;;10102:21:1;10159:2;10139:18;;;10132:30;10198:34;10178:18;;;10171:62;10269:27;10249:18;;;10242:55;10314:19;;43519:169:0;9918:421:1;43519:169:0;43701:28;43710:2;43714:7;43723:5;43701:8;:28::i;:::-;43386:351;43324:413;;:::o;26599:566::-;-1:-1:-1;;;;;26675:16:0;;26694:1;26675:16;;;:7;:16;;;;;;26667:71;;;;-1:-1:-1;;;26667:71:0;;10546:2:1;26667:71:0;;;10528:21:1;10585:2;10565:18;;;10558:30;10624:34;10604:18;;;10597:62;10695:8;10675:18;;;10668:36;10721:19;;26667:71:0;10344:402:1;26667:71:0;26751:21;26799:15;25778:14;;;25705:95;26799:15;26775:39;;:21;:39;:::i;:::-;26751:63;;26825:15;26843:58;26859:7;26868:13;26883:17;26892:7;-1:-1:-1;;;;;26180:18:0;26153:7;26180:18;;;:9;:18;;;;;;;26097:109;26883:17;26843:15;:58::i;:::-;26825:76;;26922:7;26933:1;26922:12;26914:68;;;;-1:-1:-1;;;26914:68:0;;11275:2:1;26914:68:0;;;11257:21:1;11314:2;11294:18;;;11287:30;11353:34;11333:18;;;11326:62;11424:13;11404:18;;;11397:41;11455:19;;26914:68:0;11073:407:1;26914:68:0;-1:-1:-1;;;;;26995:18:0;;;;;;:9;:18;;;;;:29;;27017:7;;26995:18;:29;;27017:7;;26995:29;:::i;:::-;;;;;;;;27053:7;27035:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;27073:35:0;;-1:-1:-1;27091:7:0;27100;27073:17;:35::i;:::-;27124:33;;;-1:-1:-1;;;;;206:55:1;;188:74;;293:2;278:18;;271:34;;;27124:33:0;;161:18:1;27124:33:0;;;;;;;26656:509;;26599:566;:::o;60151:125::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;60230:28:::1;:38:::0;60151:125::o;44679:162::-;44805:28;44815:4;44821:2;44825:7;44805:9;:28::i;39276:1007::-;39365:7;39401:16;39411:5;39401:9;:16::i;:::-;39393:5;:24;39385:71;;;;-1:-1:-1;;;39385:71:0;;12358:2:1;39385:71:0;;;12340:21:1;12397:2;12377:18;;;12370:30;12436:34;12416:18;;;12409:62;12507:4;12487:18;;;12480:32;12529:19;;39385:71:0;12156:398:1;39385:71:0;39467:22;38692:12;;;39467:22;;39730:466;39750:14;39746:1;:18;39730:466;;;39790:31;39824:14;;;:11;:14;;;;;;;;;39790:48;;;;;;;;;-1:-1:-1;;;;;39790:48:0;;;;;-1:-1:-1;;;39790:48:0;;;;;;;;;;;;39861:28;39857:111;;39934:14;;;-1:-1:-1;39857:111:0;40011:5;-1:-1:-1;;;;;39990:26:0;:17;-1:-1:-1;;;;;39990:26:0;;39986:195;;40060:5;40045:11;:20;40041:85;;-1:-1:-1;40101:1:0;-1:-1:-1;40094:8:0;;-1:-1:-1;;;40094:8:0;40041:85;40148:13;;;;;39986:195;-1:-1:-1;39766:3:0;;39730:466;;;-1:-1:-1;40219:56:0;;-1:-1:-1;;;40219:56:0;;12761:2:1;40219:56:0;;;12743:21:1;12800:2;12780:18;;;12773:30;12839:34;12819:18;;;12812:62;12910:16;12890:18;;;12883:44;12944:19;;40219:56:0;12559:410:1;56640:1302:0;56769:10;38692:12;56814:17;;;;;;;56806:26;;;;;;56864:17;;56851:9;:30;56843:67;;;;-1:-1:-1;;;56843:67:0;;13176:2:1;56843:67:0;;;13158:21:1;13215:2;13195:18;;;13188:30;13254:27;13234:18;;;13227:55;13299:18;;56843:67:0;12974:349:1;56843:67:0;56941:28;;56925:12;:44;;56917:114;;;;-1:-1:-1;;;56917:114:0;;13530:2:1;56917:114:0;;;13512:21:1;13569:2;13549:18;;;13542:30;13608:34;13588:18;;;13581:62;13679:27;13659:18;;;13652:55;13724:19;;56917:114:0;13328:421:1;56917:114:0;57086:30;;57050:32;;;;:21;:32;;;;;;:66;;57042:111;;;;-1:-1:-1;;;57042:111:0;;13956:2:1;57042:111:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;57042:111:0;13754:356:1;57042:111:0;57193:10;;57172:17;57177:12;57172:2;:17;:::i;:::-;:31;;57164:76;;;;-1:-1:-1;;;57164:76:0;;13956:2:1;57164:76:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;57164:76:0;13754:356:1;57164:76:0;57259:10;-1:-1:-1;;;;;57259:22:0;;;57251:51;;;;-1:-1:-1;;;57251:51:0;;14317:2:1;57251:51:0;;;14299:21:1;14356:2;14336:18;;;14329:30;14395:18;14375;;;14368:46;14431:18;;57251:51:0;14115:340:1;57251:51:0;57321:10;57335:9;57321:23;57313:32;;;;;;57412:28;;-1:-1:-1;;;;;57361:37:0;;;;;;:27;:37;;;;;;;;:48;;;;;;;;;:79;57353:135;;;;-1:-1:-1;;;57353:135:0;;14662:2:1;57353:135:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;14811:13;14791:18;;;14784:41;14842:19;;57353:135:0;14460:407:1;57353:135:0;57538:12;57520:15;;:30;;;;:::i;:::-;57507:9;:43;;57499:87;;;;-1:-1:-1;;;57499:87:0;;15307:2:1;57499:87:0;;;15289:21:1;15346:2;15326:18;;;15319:30;15385:33;15365:18;;;15358:61;15436:18;;57499:87:0;15105:355:1;57499:87:0;57638:26;;-1:-1:-1;;15614:2:1;15610:15;;;15606:88;57638:26:0;;;15594:101:1;57599:12:0;;15711::1;;57638:26:0;;;;;;;;;;;;57614:61;;;;;;57599:76;;57694:40;57711:6;;;;;;;;;-1:-1:-1;;;;;57711:6:0;57719:4;57725:8;;57694:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57694:16:0;;-1:-1:-1;;;57694:40:0:i;:::-;57686:68;;;;-1:-1:-1;;;57686:68:0;;15936:2:1;57686:68:0;;;15918:21:1;15975:2;15955:18;;;15948:30;16014:17;15994:18;;;15987:45;16049:18;;57686:68:0;15734:339:1;57686:68:0;57767:33;57777:8;57787:12;57767:9;:33::i;:::-;-1:-1:-1;;;;;57811:37:0;;;;;;:27;:37;;;;;;;;:48;;;;;;;;:64;;57863:12;;57811:37;:64;;57863:12;;57811:64;:::i;:::-;;;;-1:-1:-1;;57886:32:0;;;;:21;:32;;;;;:48;;57922:12;;57886:32;:48;;57922:12;;57886:48;:::i;:::-;;;;-1:-1:-1;;;;;;;;;56640:1302:0:o;59886:115::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59960:23:::1;:33:::0;59886:115::o;61218:152::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;61286:58:::1;::::0;61268:12:::1;::::0;61294:10:::1;::::0;61318:21:::1;::::0;61268:12;61286:58;61268:12;61286:58;61318:21;61294:10;61286:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61267:77;;;61357:7;61349:16;;;::::0;::::1;;61263:107;61218:152::o:0;44912:177::-;45042:39;45059:4;45065:2;45069:7;45042:39;;;;;;;;;;;;:16;:39::i;60284:119::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;60360:25:::1;:35:::0;60284:119::o;38789:187::-;38856:7;38692:12;;38884:5;:21;38876:69;;;;-1:-1:-1;;;38876:69:0;;16490:2:1;38876:69:0;;;16472:21:1;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;16639:5;16619:18;;;16612:33;16662:19;;38876:69:0;16288:399:1;38876:69:0;-1:-1:-1;38963:5:0;38789:187::o;60976:109::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;61050:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;60976:109:::0;:::o;59650:101::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59716:17:::1;:27:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;59650:101::o;59759:95::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59822:14:::1;:24:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;59759:95::o;42050:124::-;42114:7;42141:20;42153:7;42141:11;:20::i;:::-;:25;;42050:124;-1:-1:-1;;42050:124:0:o;60835:117::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;60914:17:::1;:30:::0;60835:117::o;59281:90::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59347:6:::1;:16:::0;;-1:-1:-1;;;;;59347:16:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;59281:90::o;40791:221::-;40855:7;-1:-1:-1;;;;;40883:19:0;;40875:75;;;;-1:-1:-1;;;40875:75:0;;16894:2:1;40875:75:0;;;16876:21:1;16933:2;16913:18;;;16906:30;16972:34;16952:18;;;16945:62;17043:13;17023:18;;;17016:41;17074:19;;40875:75:0;16692:407:1;40875:75:0;-1:-1:-1;;;;;;40976:19:0;;;;;:12;:19;;;;;:27;;;;40791:221::o;13942:94::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;14007:21:::1;14025:1;14007:9;:21::i;:::-;13942:94::o:0;26299:100::-;26350:7;26377;26385:5;26377:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26377:14:0;;26299:100;-1:-1:-1;;26299:100:0:o;58835:202::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;58915:10:::1;38692:12:::0;58978:10:::1;::::0;58957:17:::1;58962:12:::0;38692;58957:17:::1;:::i;:::-;:31;;58949:40;;;::::0;::::1;;59000:29;59010:4;59016:12;59000:9;:29::i;59398:102::-:0;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59465:15:::1;:27:::0;59398:102::o;42410:104::-;42466:13;42499:7;42492:14;;;;;:::i;44089:288::-;12192:10;-1:-1:-1;;;;;44184:24:0;;;44176:63;;;;-1:-1:-1;;;44176:63:0;;17495:2:1;44176:63:0;;;17477:21:1;17534:2;17514:18;;;17507:30;17573:28;17553:18;;;17546:56;17619:18;;44176:63:0;17293:350:1;44176:63:0;12192:10;44252:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44252:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44252:53:0;;;;;;;;;;44321:48;;1070:41:1;;;44252:42:0;;12192:10;44321:48;;1043:18:1;44321:48:0;;;;;;;44089:288;;:::o;45160:355::-;45319:28;45329:4;45335:2;45339:7;45319:9;:28::i;:::-;45380:48;45403:4;45409:2;45413:7;45422:5;45380:22;:48::i;:::-;45358:149;;;;-1:-1:-1;;;45358:149:0;;17850:2:1;45358:149:0;;;17832:21:1;17889:2;17869:18;;;17862:30;17928:34;17908:18;;;17901:62;17999:21;17979:18;;;17972:49;18038:19;;45358:149:0;17648:415:1;45358:149:0;45160:355;;;;:::o;42585:335::-;42658:13;42692:16;42700:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;42692:16;42684:76;;;;-1:-1:-1;;;42684:76:0;;18270:2:1;42684:76:0;;;18252:21:1;18309:2;18289:18;;;18282:30;18348:34;18328:18;;;18321:62;18419:17;18399:18;;;18392:45;18454:19;;42684:76:0;18068:411:1;42684:76:0;42773:21;42797:10;:8;:10::i;:::-;42773:34;;42831:7;42825:21;42850:1;42825:26;:87;;;;;;;;;;;;;;;;;42878:7;42887:18;:7;:16;:18::i;:::-;42861:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42825:87;42818:94;42585:335;-1:-1:-1;;;42585:335:0:o;60009:134::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;60092:33:::1;:43:::0;60009:134::o;59508:109::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;59578:21:::1;:31:::0;;-1:-1:-1;;59578:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59508:109::o;55619:1015::-;55719:10;38692:12;55764:21;;;;55756:30;;;;;;55817:33;;55801:12;:49;;55793:108;;;;-1:-1:-1;;;55793:108:0;;19161:2:1;55793:108:0;;;19143:21:1;19200:2;19180:18;;;19173:30;19239:34;19219:18;;;19212:62;19310:16;19290:18;;;19283:44;19344:19;;55793:108:0;18959:410:1;55793:108:0;55937:25;;55920:13;;:42;;55912:87;;;;-1:-1:-1;;;55912:87:0;;13956:2:1;55912:87:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;55912:87:0;13754:356:1;55912:87:0;56039:10;;56018:17;56023:12;56018:2;:17;:::i;:::-;:31;;56010:76;;;;-1:-1:-1;;;56010:76:0;;13956:2:1;56010:76:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;56010:76:0;13754:356:1;56010:76:0;56105:10;-1:-1:-1;;;;;56105:22:0;;;56097:51;;;;-1:-1:-1;;;56097:51:0;;14317:2:1;56097:51:0;;;14299:21:1;14356:2;14336:18;;;14329:30;14395:18;14375;;;14368:46;14431:18;;56097:51:0;14115:340:1;56097:51:0;56167:10;56181:9;56167:23;56159:32;;;;;;56242:23;;-1:-1:-1;;;;;56207:32:0;;;;;;:22;:32;;;;;;:58;56199:114;;;;-1:-1:-1;;;56199:114:0;;14662:2:1;56199:114:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;14811:13;14791:18;;;14784:41;14842:19;;56199:114:0;14460:407:1;56199:114:0;56365:26;;-1:-1:-1;;15614:2:1;15610:15;;;15606:88;56365:26:0;;;15594:101:1;56326:12:0;;15711::1;;56365:26:0;;;;;;;;;;;;56341:61;;;;;;56326:76;;56421:40;56438:6;;;;;;;;;-1:-1:-1;;;;;56438:6:0;56446:4;56452:8;;56421:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56421:16:0;;-1:-1:-1;;;56421:40:0:i;:::-;56413:68;;;;-1:-1:-1;;;56413:68:0;;15936:2:1;56413:68:0;;;15918:21:1;15975:2;15955:18;;;15948:30;16014:17;15994:18;;;15987:45;16049:18;;56413:68:0;15734:339:1;56413:68:0;56494:33;56504:8;56514:12;56494:9;:33::i;:::-;-1:-1:-1;;;;;56538:32:0;;;;;;:22;:32;;;;;:48;;56574:12;;56538:32;:48;;56574:12;;56538:48;:::i;:::-;;;;;;;;56614:12;56597:13;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;55619:1015:0:o;57948:865::-;58015:10;38692:12;58060:14;;;;;;;58052:23;;;;;;58106:25;;58090:12;:41;;58082:111;;;;-1:-1:-1;;;58082:111:0;;13530:2:1;58082:111:0;;;13512:21:1;13569:2;13549:18;;;13542:30;13608:34;13588:18;;;13581:62;13679:27;13659:18;;;13652:55;13724:19;;58082:111:0;13328:421:1;58082:111:0;58231:27;;58212:15;;:46;;58204:91;;;;-1:-1:-1;;;58204:91:0;;13956:2:1;58204:91:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;58204:91:0;13754:356:1;58204:91:0;58335:10;;58314:17;58319:12;58314:2;:17;:::i;:::-;:31;;58306:76;;;;-1:-1:-1;;;58306:76:0;;13956:2:1;58306:76:0;;;13938:21:1;;;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14086:18;;58306:76:0;13754:356:1;58306:76:0;58401:10;58415:9;58401:23;58393:32;;;;;;58481:25;;58466:10;58441:36;;;;:24;:36;;;;;;:65;;58433:121;;;;-1:-1:-1;;;58433:121:0;;14662:2:1;58433:121:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;14811:13;14791:18;;;14784:41;14842:19;;58433:121:0;14460:407:1;58433:121:0;58604:12;58586:15;;:30;;;;:::i;:::-;58573:9;:43;;58565:87;;;;-1:-1:-1;;;58565:87:0;;15307:2:1;58565:87:0;;;15289:21:1;15346:2;15326:18;;;15319:30;15385:33;15365:18;;;15358:61;15436:18;;58565:87:0;15105:355:1;58565:87:0;58665:35;58675:10;58687:12;58665:9;:35::i;:::-;58736:10;58711:36;;;;:24;:36;;;;;:52;;58751:12;;58711:36;:52;;58751:12;;58711:52;:::i;:::-;;;;;;;;58793:12;58774:15;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;57948:865:0:o;14191:192::-;13364:6;;-1:-1:-1;;;;;13364:6:0;12192:10;13511:23;13503:68;;;;-1:-1:-1;;;13503:68:0;;11997:2:1;13503:68:0;;;11979:21:1;;;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12127:18;;13503:68:0;11795:356:1;13503:68:0;-1:-1:-1;;;;;14280:22:0;::::1;14272:73;;;::::0;-1:-1:-1;;;14272:73:0;;19576:2:1;14272:73:0::1;::::0;::::1;19558:21:1::0;19615:2;19595:18;;;19588:30;19654:34;19634:18;;;19627:62;19725:8;19705:18;;;19698:36;19751:19;;14272:73:0::1;19374:402:1::0;14272:73:0::1;14356:19;14366:8;14356:9;:19::i;50690:196::-:0;50805:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;50805:29:0;;;;;;;;;50850:28;;50805:24;;50850:28;;;;;;;50690:196;;;:::o;27345:248::-;27555:12;;-1:-1:-1;;;;;27535:16:0;;27491:7;27535:16;;;:7;:16;;;;;;27491:7;;27570:15;;27519:32;;:13;:32;:::i;:::-;27518:49;;;;:::i;:::-;:67;;;;:::i;:::-;27511:74;27345:248;-1:-1:-1;;;;27345:248:0:o;16627:317::-;16742:6;16717:21;:31;;16709:73;;;;-1:-1:-1;;;16709:73:0;;20427:2:1;16709:73:0;;;20409:21:1;20466:2;20446:18;;;20439:30;20505:31;20485:18;;;20478:59;20554:18;;16709:73:0;20225:353:1;16709:73:0;16796:12;16814:9;-1:-1:-1;;;;;16814:14:0;16836:6;16814:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16795:52;;;16866:7;16858:78;;;;-1:-1:-1;;;16858:78:0;;20785:2:1;16858:78:0;;;20767:21:1;20824:2;20804:18;;;20797:30;20863:34;20843:18;;;20836:62;20934:28;20914:18;;;20907:56;20980:19;;16858:78:0;20583:422:1;48570:2002:0;48685:35;48723:20;48735:7;48723:11;:20::i;:::-;48798:18;;48685:58;;-1:-1:-1;48756:22:0;;-1:-1:-1;;;;;48782:34:0;12192:10;-1:-1:-1;;;;;48782:34:0;;:87;;;-1:-1:-1;12192:10:0;48833:20;48845:7;48833:11;:20::i;:::-;-1:-1:-1;;;;;48833:36:0;;48782:87;:154;;;-1:-1:-1;48903:18:0;;48886:50;;12192:10;44448:164;:::i;48886:50::-;48756:181;;48958:17;48950:80;;;;-1:-1:-1;;;48950:80:0;;21212:2:1;48950:80:0;;;21194:21:1;21251:2;21231:18;;;21224:30;21290:34;21270:18;;;21263:62;21361:20;21341:18;;;21334:48;21399:19;;48950:80:0;21010:414:1;48950:80:0;49073:4;-1:-1:-1;;;;;49051:26:0;:13;:18;;;-1:-1:-1;;;;;49051:26:0;;49043:77;;;;-1:-1:-1;;;49043:77:0;;21631:2:1;49043:77:0;;;21613:21:1;21670:2;21650:18;;;21643:30;21709:34;21689:18;;;21682:62;21780:8;21760:18;;;21753:36;21806:19;;49043:77:0;21429:402:1;49043:77:0;-1:-1:-1;;;;;49139:16:0;;49131:66;;;;-1:-1:-1;;;49131:66:0;;22038:2:1;49131:66:0;;;22020:21:1;22077:2;22057:18;;;22050:30;22116:34;22096:18;;;22089:62;22187:7;22167:18;;;22160:35;22212:19;;49131:66:0;21836:401:1;49131:66:0;49318:49;49335:1;49339:7;49348:13;:18;;;49318:8;:49::i;:::-;-1:-1:-1;;;;;49663:18:0;;;;;;;:12;:18;;;;;;;;:31;;;;;;;;;;-1:-1:-1;;49663:31:0;;;;;;;49709:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49709:29:0;;;;;;;;;;;;;49755:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;49800:61:0;;;;-1:-1:-1;;;49845:15:0;49800:61;;;;;;50135:11;;;50165:24;;;;;:29;50135:11;;50165:29;50161:295;;50233:20;50241:11;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;50233:20;50229:212;;;50310:18;;;50278:24;;;:11;:24;;;;;;;;:50;;50393:28;;;;50351:70;;-1:-1:-1;;;50351:70:0;-1:-1:-1;;;;;;50351:70:0;;;-1:-1:-1;;;;;50278:50:0;;;50351:70;;;;;;;50229:212;49638:829;50503:7;50499:2;-1:-1:-1;;;;;50484:27:0;50493:4;-1:-1:-1;;;;;50484:27:0;;;;;;;;;;;50522:42;48674:1898;;48570:2002;;;:::o;59063:210::-;59168:4;59203:62;59217:35;59246:5;10406:58;;24399:66:1;10406:58:0;;;24387:79:1;24482:12;;;24475:28;;;10273:7:0;;24519:12:1;;10406:58:0;;;;;;;;;;;;10396:69;;;;;;10389:76;;10204:269;;;;59217:35;59254:10;59203:13;:62::i;:::-;-1:-1:-1;;;;;59192:73:0;:7;-1:-1:-1;;;;;59192:73:0;;59185:80;;59063:210;;;;;:::o;45889:104::-;45958:27;45968:2;45972:8;45958:27;;;;;;;;;;;;:9;:27::i;41451:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;41554:16:0;41562:7;45827:4;45861:12;-1:-1:-1;45851:22:0;45770:111;41554:16;41546:71;;;;-1:-1:-1;;;41546:71:0;;22444:2:1;41546:71:0;;;22426:21:1;22483:2;22463:18;;;22456:30;22522:34;22502:18;;;22495:62;22593:12;22573:18;;;22566:40;22623:19;;41546:71:0;22242:406:1;41546:71:0;41675:7;41655:245;41722:31;41756:17;;;:11;:17;;;;;;;;;41722:51;;;;;;;;;-1:-1:-1;;;;;41722:51:0;;;;;-1:-1:-1;;;41722:51:0;;;;;;;;;;;;41796:28;41792:93;;41856:9;41451:537;-1:-1:-1;;;41451:537:0:o;41792:93::-;-1:-1:-1;;;41695:6:0;41655:245;;14391:173;14466:6;;;-1:-1:-1;;;;;14483:17:0;;;;;;;;;;;14516:40;;14466:6;;;14483:17;14466:6;;14516:40;;14447:16;;14516:40;14436:128;14391:173;:::o;51451:804::-;51606:4;-1:-1:-1;;;;;51627:13:0;;15628:20;15676:8;51623:625;;51663:72;;;;;-1:-1:-1;;;;;51663:36:0;;;;;:72;;12192:10;;51714:4;;51720:7;;51729:5;;51663:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51663:72:0;;;;;;;;-1:-1:-1;;51663:72:0;;;;;;;;;;;;:::i;:::-;;;51659:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51909:6;:13;51926:1;51909:18;51905:273;;51952:61;;-1:-1:-1;;;51952:61:0;;17850:2:1;51952:61:0;;;17832:21:1;17889:2;17869:18;;;17862:30;17928:34;17908:18;;;17901:62;17999:21;17979:18;;;17972:49;18038:19;;51952:61:0;17648:415:1;51905:273:0;52128:6;52122:13;52113:6;52109:2;52105:15;52098:38;51659:534;-1:-1:-1;;;;;;51786:55:0;51796:45;51786:55;;-1:-1:-1;51779:62:0;;51623:625;-1:-1:-1;52232:4:0;51451:804;;;;;;:::o;61093:117::-;61153:13;61186:16;61179:23;;;;;:::i;286:723::-;342:13;563:5;572:1;563:10;559:53;;-1:-1:-1;;590:10:0;;;;;;;;;;;;;;;;;;286:723::o;559:53::-;637:5;622:12;678:78;685:9;;678:78;;711:8;;;;:::i;:::-;;-1:-1:-1;734:10:0;;-1:-1:-1;742:2:0;734:10;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;788:17:0;;766:39;;816:154;823:10;;816:154;;850:11;860:1;850:11;;:::i;:::-;;-1:-1:-1;919:10:0;927:2;919:5;:10;:::i;:::-;906:24;;:2;:24;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;947:11:0;956:2;947:11;;:::i;:::-;;;816:154;;6402:231;6480:7;6501:17;6520:18;6542:27;6553:4;6559:9;6542:10;:27::i;:::-;6500:69;;;;6580:18;6592:5;6580:11;:18::i;:::-;-1:-1:-1;6616:9:0;6402:231;-1:-1:-1;;;6402:231:0:o;46356:163::-;46479:32;46485:2;46489:8;46499:5;46506:4;46479:5;:32::i;4292:1308::-;4373:7;4382:12;4607:9;:16;4627:2;4607:22;4603:990;;4903:4;4888:20;;4882:27;4953:4;4938:20;;4932:27;5011:4;4996:20;;4990:27;4646:9;4982:36;5054:25;5065:4;4982:36;4882:27;4932;5054:10;:25::i;:::-;5047:32;;;;;;;;;4603:990;5101:9;:16;5121:2;5101:22;5097:496;;5376:4;5361:20;;5355:27;5427:4;5412:20;;5406:27;5469:23;5480:4;5355:27;5406;5469:10;:23::i;:::-;5462:30;;;;;;;;5097:496;-1:-1:-1;5541:1:0;;-1:-1:-1;5545:35:0;5097:496;4292:1308;;;;;:::o;2563:643::-;2641:20;2632:5;:29;;;;;;;;:::i;:::-;;2628:571;;2563:643;:::o;2628:571::-;2739:29;2730:5;:38;;;;;;;;:::i;:::-;;2726:473;;2785:34;;-1:-1:-1;;;2785:34:0;;24933:2:1;2785:34:0;;;24915:21:1;24972:2;24952:18;;;24945:30;25011:26;24991:18;;;24984:54;25055:18;;2785:34:0;24731:348:1;2726:473:0;2850:35;2841:5;:44;;;;;;;;:::i;:::-;;2837:362;;2902:41;;-1:-1:-1;;;2902:41:0;;25286:2:1;2902:41:0;;;25268:21:1;25325:2;25305:18;;;25298:30;25364:33;25344:18;;;25337:61;25415:18;;2902:41:0;25084:355:1;2837:362:0;2974:30;2965:5;:39;;;;;;;;:::i;:::-;;2961:238;;3021:44;;-1:-1:-1;;;3021:44:0;;25646:2:1;3021:44:0;;;25628:21:1;25685:2;25665:18;;;25658:30;25724:34;25704:18;;;25697:62;25795:4;25775:18;;;25768:32;25817:19;;3021:44:0;25444:398:1;2961:238:0;3096:30;3087:5;:39;;;;;;;;:::i;:::-;;3083:116;;3143:44;;-1:-1:-1;;;3143:44:0;;26049:2:1;3143:44:0;;;26031:21:1;26088:2;26068:18;;;26061:30;26127:34;26107:18;;;26100:62;26198:4;26178:18;;;26171:32;26220:19;;3143:44:0;25847:398:1;46778:1538:0;46917:20;46940:12;-1:-1:-1;;;;;46971:16:0;;46963:62;;;;-1:-1:-1;;;46963:62:0;;26452:2:1;46963:62:0;;;26434:21:1;26491:2;26471:18;;;26464:30;26530:34;26510:18;;;26503:62;26601:3;26581:18;;;26574:31;26622:19;;46963:62:0;26250:397:1;46963:62:0;47044:8;47056:1;47044:13;47036:66;;;;-1:-1:-1;;;47036:66:0;;26854:2:1;47036:66:0;;;26836:21:1;26893:2;26873:18;;;26866:30;26932:34;26912:18;;;26905:62;27003:10;26983:18;;;26976:38;27031:19;;47036:66:0;26652:404:1;47036:66:0;-1:-1:-1;;;;;47454:16:0;;;;;;:12;:16;;;;;;;;:45;;47514:50;47454:45;;;;;;;;;;;;;;47514:50;;;;;;;;;;;;;;47581:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;47631:66:0;;;;-1:-1:-1;;;47681:15:0;47631:66;;;;;;;47581:25;;47766:415;47786:8;47782:1;:12;47766:415;;;47825:38;;47850:12;;-1:-1:-1;;;;;47825:38:0;;;47842:1;;47825:38;;47842:1;;47825:38;47886:4;47882:249;;;47949:59;47980:1;47984:2;47988:12;48002:5;47949:22;:59::i;:::-;47915:196;;;;-1:-1:-1;;;47915:196:0;;17850:2:1;47915:196:0;;;17832:21:1;17889:2;17869:18;;;17862:30;17928:34;17908:18;;;17901:62;17999:21;17979:18;;;17972:49;18038:19;;47915:196:0;17648:415:1;47915:196:0;48151:14;;;;;47796:3;47766:415;;;-1:-1:-1;48197:12:0;:27;48248:60;45160:355;7854:1632;7985:7;;8919:66;8906:79;;8902:163;;;-1:-1:-1;9018:1:0;;-1:-1:-1;9022:30:0;9002:51;;8902:163;9079:1;:7;;9084:2;9079:7;;:18;;;;;9090:1;:7;;9095:2;9090:7;;9079:18;9075:102;;;-1:-1:-1;9130:1:0;;-1:-1:-1;9134:30:0;9114:51;;9075:102;9291:24;;;9274:14;9291:24;;;;;;;;;27288:25:1;;;27361:4;27349:17;;27329:18;;;27322:45;;;;27383:18;;;27376:34;;;27426:18;;;27419:34;;;9291:24:0;;27260:19:1;;9291:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9291:24:0;;-1:-1:-1;;9291:24:0;;;-1:-1:-1;;;;;;;9330:20:0;;9326:103;;9383:1;9387:29;9367:50;;;;;;;9326:103;9449:6;-1:-1:-1;9457:20:0;;-1:-1:-1;7854:1632:0;;;;;;;;:::o;6896:344::-;7010:7;;7069:66;7056:80;;7010:7;7163:25;7179:3;7164:18;;;7186:2;7163:25;:::i;:::-;7147:42;;7207:25;7218:4;7224:1;7227;7230;7207:10;:25::i;:::-;7200:32;;;;;;6896:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;498:177:1;-1:-1:-1;;;;;;576:5:1;572:78;565:5;562:89;552:117;;665:1;662;655:12;680:245;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;846:9;833:23;865:30;889:5;865:30;:::i;1122:258::-;1194:1;1204:113;1218:6;1215:1;1212:13;1204:113;;;1294:11;;;1288:18;1275:11;;;1268:39;1240:2;1233:10;1204:113;;;1335:6;1332:1;1329:13;1326:48;;;-1:-1:-1;;1370:1:1;1352:16;;1345:27;1122:258::o;1385:317::-;1427:3;1465:5;1459:12;1492:6;1487:3;1480:19;1508:63;1564:6;1557:4;1552:3;1548:14;1541:4;1534:5;1530:16;1508:63;:::i;:::-;1616:2;1604:15;-1:-1:-1;;1600:88:1;1591:98;;;;1691:4;1587:109;;1385:317;-1:-1:-1;;1385:317:1:o;1707:220::-;1856:2;1845:9;1838:21;1819:4;1876:45;1917:2;1906:9;1902:18;1894:6;1876:45;:::i;1932:180::-;1991:6;2044:2;2032:9;2023:7;2019:23;2015:32;2012:52;;;2060:1;2057;2050:12;2012:52;-1:-1:-1;2083:23:1;;1932:180;-1:-1:-1;1932:180:1:o;2348:154::-;-1:-1:-1;;;;;2427:5:1;2423:54;2416:5;2413:65;2403:93;;2492:1;2489;2482:12;2507:315;2575:6;2583;2636:2;2624:9;2615:7;2611:23;2607:32;2604:52;;;2652:1;2649;2642:12;2604:52;2691:9;2678:23;2710:31;2735:5;2710:31;:::i;:::-;2760:5;2812:2;2797:18;;;;2784:32;;-1:-1:-1;;;2507:315:1:o;2827:247::-;2886:6;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;2994:9;2981:23;3013:31;3038:5;3013:31;:::i;3339:456::-;3416:6;3424;3432;3485:2;3473:9;3464:7;3460:23;3456:32;3453:52;;;3501:1;3498;3491:12;3453:52;3540:9;3527:23;3559:31;3584:5;3559:31;:::i;:::-;3609:5;-1:-1:-1;3666:2:1;3651:18;;3638:32;3679:33;3638:32;3679:33;:::i;:::-;3339:456;;3731:7;;-1:-1:-1;;;3785:2:1;3770:18;;;;3757:32;;3339:456::o;3800:347::-;3851:8;3861:6;3915:3;3908:4;3900:6;3896:17;3892:27;3882:55;;3933:1;3930;3923:12;3882:55;-1:-1:-1;3956:20:1;;3999:18;3988:30;;3985:50;;;4031:1;4028;4021:12;3985:50;4068:4;4060:6;4056:17;4044:29;;4120:3;4113:4;4104:6;4096;4092:19;4088:30;4085:39;4082:59;;;4137:1;4134;4127:12;4152:681;4249:6;4257;4265;4273;4281;4334:3;4322:9;4313:7;4309:23;4305:33;4302:53;;;4351:1;4348;4341:12;4302:53;4390:9;4377:23;4409:31;4434:5;4409:31;:::i;:::-;4459:5;-1:-1:-1;4515:2:1;4500:18;;4487:32;4542:18;4531:30;;4528:50;;;4574:1;4571;4564:12;4528:50;4613:58;4663:7;4654:6;4643:9;4639:22;4613:58;:::i;:::-;4152:681;;4690:8;;-1:-1:-1;4587:84:1;;4772:2;4757:18;;4744:32;;4823:2;4808:18;;;4795:32;;-1:-1:-1;4152:681:1;-1:-1:-1;;;;4152:681:1:o;4838:184::-;-1:-1:-1;;;4887:1:1;4880:88;4987:4;4984:1;4977:15;5011:4;5008:1;5001:15;5027:691;5092:5;5122:18;5163:2;5155:6;5152:14;5149:40;;;5169:18;;:::i;:::-;5303:2;5297:9;5369:2;5357:15;;-1:-1:-1;;5353:24:1;;;5379:2;5349:33;5345:42;5333:55;;;5403:18;;;5423:22;;;5400:46;5397:72;;;5449:18;;:::i;:::-;5489:10;5485:2;5478:22;5518:6;5509:15;;5548:6;5540;5533:22;5588:3;5579:6;5574:3;5570:16;5567:25;5564:45;;;5605:1;5602;5595:12;5564:45;5655:6;5650:3;5643:4;5635:6;5631:17;5618:44;5710:1;5703:4;5694:6;5686;5682:19;5678:30;5671:41;;;;5027:691;;;;;:::o;5723:451::-;5792:6;5845:2;5833:9;5824:7;5820:23;5816:32;5813:52;;;5861:1;5858;5851:12;5813:52;5901:9;5888:23;5934:18;5926:6;5923:30;5920:50;;;5966:1;5963;5956:12;5920:50;5989:22;;6042:4;6034:13;;6030:27;-1:-1:-1;6020:55:1;;6071:1;6068;6061:12;6020:55;6094:74;6160:7;6155:2;6142:16;6137:2;6133;6129:11;6094:74;:::i;6179:160::-;6244:20;;6300:13;;6293:21;6283:32;;6273:60;;6329:1;6326;6319:12;6273:60;6179:160;;;:::o;6344:180::-;6400:6;6453:2;6441:9;6432:7;6428:23;6424:32;6421:52;;;6469:1;6466;6459:12;6421:52;6492:26;6508:9;6492:26;:::i;6529:315::-;6594:6;6602;6655:2;6643:9;6634:7;6630:23;6626:32;6623:52;;;6671:1;6668;6661:12;6623:52;6710:9;6697:23;6729:31;6754:5;6729:31;:::i;:::-;6779:5;-1:-1:-1;6803:35:1;6834:2;6819:18;;6803:35;:::i;:::-;6793:45;;6529:315;;;;;:::o;6849:795::-;6944:6;6952;6960;6968;7021:3;7009:9;7000:7;6996:23;6992:33;6989:53;;;7038:1;7035;7028:12;6989:53;7077:9;7064:23;7096:31;7121:5;7096:31;:::i;:::-;7146:5;-1:-1:-1;7203:2:1;7188:18;;7175:32;7216:33;7175:32;7216:33;:::i;:::-;7268:7;-1:-1:-1;7322:2:1;7307:18;;7294:32;;-1:-1:-1;7377:2:1;7362:18;;7349:32;7404:18;7393:30;;7390:50;;;7436:1;7433;7426:12;7390:50;7459:22;;7512:4;7504:13;;7500:27;-1:-1:-1;7490:55:1;;7541:1;7538;7531:12;7490:55;7564:74;7630:7;7625:2;7612:16;7607:2;7603;7599:11;7564:74;:::i;:::-;7554:84;;;6849:795;;;;;;;:::o;7649:612::-;7737:6;7745;7753;7761;7814:2;7802:9;7793:7;7789:23;7785:32;7782:52;;;7830:1;7827;7820:12;7782:52;7869:9;7856:23;7888:31;7913:5;7888:31;:::i;:::-;7938:5;-1:-1:-1;7994:2:1;7979:18;;7966:32;8021:18;8010:30;;8007:50;;;8053:1;8050;8043:12;8007:50;8092:58;8142:7;8133:6;8122:9;8118:22;8092:58;:::i;:::-;7649:612;;8169:8;;-1:-1:-1;8066:84:1;;8251:2;8236:18;8223:32;;7649:612;-1:-1:-1;;;;7649:612:1:o;8266:388::-;8334:6;8342;8395:2;8383:9;8374:7;8370:23;8366:32;8363:52;;;8411:1;8408;8401:12;8363:52;8450:9;8437:23;8469:31;8494:5;8469:31;:::i;:::-;8519:5;-1:-1:-1;8576:2:1;8561:18;;8548:32;8589:33;8548:32;8589:33;:::i;:::-;8641:7;8631:17;;;8266:388;;;;;:::o;8659:437::-;8738:1;8734:12;;;;8781;;;8802:61;;8856:4;8848:6;8844:17;8834:27;;8802:61;8909:2;8901:6;8898:14;8878:18;8875:38;8872:218;;-1:-1:-1;;;8943:1:1;8936:88;9047:4;9044:1;9037:15;9075:4;9072:1;9065:15;8872:218;;8659:437;;;:::o;10751:184::-;-1:-1:-1;;;10800:1:1;10793:88;10900:4;10897:1;10890:15;10924:4;10921:1;10914:15;10940:128;10980:3;11011:1;11007:6;11004:1;11001:13;10998:39;;;11017:18;;:::i;:::-;-1:-1:-1;11053:9:1;;10940:128::o;14872:228::-;14912:7;15038:1;-1:-1:-1;;14966:74:1;14963:1;14960:81;14955:1;14948:9;14941:17;14937:105;14934:131;;;15045:18;;:::i;:::-;-1:-1:-1;15085:9:1;;14872:228::o;17104:184::-;-1:-1:-1;;;17153:1:1;17146:88;17253:4;17250:1;17243:15;17277:4;17274:1;17267:15;18484:470;18663:3;18701:6;18695:13;18717:53;18763:6;18758:3;18751:4;18743:6;18739:17;18717:53;:::i;:::-;18833:13;;18792:16;;;;18855:57;18833:13;18792:16;18889:4;18877:17;;18855:57;:::i;:::-;18928:20;;18484:470;-1:-1:-1;;;;18484:470:1:o;19781:184::-;-1:-1:-1;;;19830:1:1;19823:88;19930:4;19927:1;19920:15;19954:4;19951:1;19944:15;19970:120;20010:1;20036;20026:35;;20041:18;;:::i;:::-;-1:-1:-1;20075:9:1;;19970:120::o;20095:125::-;20135:4;20163:1;20160;20157:8;20154:34;;;20168:18;;:::i;:::-;-1:-1:-1;20205:9:1;;20095:125::o;23069:512::-;23263:4;-1:-1:-1;;;;;23373:2:1;23365:6;23361:15;23350:9;23343:34;23425:2;23417:6;23413:15;23408:2;23397:9;23393:18;23386:43;;23465:6;23460:2;23449:9;23445:18;23438:34;23508:3;23503:2;23492:9;23488:18;23481:31;23529:46;23570:3;23559:9;23555:19;23547:6;23529:46;:::i;:::-;23521:54;23069:512;-1:-1:-1;;;;;;23069:512:1:o;23586:249::-;23655:6;23708:2;23696:9;23687:7;23683:23;23679:32;23676:52;;;23724:1;23721;23714:12;23676:52;23756:9;23750:16;23775:30;23799:5;23775:30;:::i;23840:195::-;23879:3;-1:-1:-1;;23903:5:1;23900:77;23897:103;;23980:18;;:::i;:::-;-1:-1:-1;24027:1:1;24016:13;;23840:195::o;24040:112::-;24072:1;24098;24088:35;;24103:18;;:::i;:::-;-1:-1:-1;24137:9:1;;24040:112::o;24542:184::-;-1:-1:-1;;;24591:1:1;24584:88;24691:4;24688:1;24681:15;24715:4;24712:1;24705:15

Swarm Source

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