ETH Price: $3,516.73 (+4.83%)

Token

Pomeranians (POM)
 

Overview

Max Total Supply

3,333 POM

Holders

839

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 POM
0x47dedafec81071216f9815f2de8d17ceea0d34a3
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:
Pomeranians

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-26
*/

// POMERANIANSNFT//
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: OperatorFilterer.sol


pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: FacepunchAbstractions.sol



pragma solidity ^0.8.9;




contract Pomeranians is ERC721, Ownable, DefaultOperatorFilterer {
    using Strings for uint256;

    uint public constant MAX_TOKENS = 3333;
    uint private constant TOKENS_RESERVED = 0;
    uint public price = 0;
    uint256 public constant MAX_MINT_PER_TX = 4;
    uint256 public totalTokens;

    bool public isSaleActive;   
    uint256 public totalSupply;
    mapping(address => uint256) private mintedPerWallet;

    string public baseUri;
    string public baseExtension = ".json";

    constructor() ERC721("Pomeranians", "POM") {
        baseUri = "https://sereno.work/pomoutput/";
        for(uint256 i = 1; i <= TOKENS_RESERVED; ++i) {
            _safeMint(msg.sender, i);
        }
        totalSupply = TOKENS_RESERVED;
    }

    // Public Functions
    function mint(uint256 _numTokens) external payable {
        require(isSaleActive, "The sale is paused.");
        require(_numTokens <= MAX_MINT_PER_TX, "You cannot mint that many in one transaction.");
        require(mintedPerWallet[msg.sender] + _numTokens <= MAX_MINT_PER_TX, "You cannot mint that many total.");
        uint256 curTotalSupply = totalSupply;
        require(curTotalSupply + _numTokens <= MAX_TOKENS, "Exceeds total supply.");
        require(_numTokens * price <= msg.value, "Insufficient funds.");

        for(uint256 i = 1; i <= _numTokens; ++i) {
            _safeMint(msg.sender, curTotalSupply + i);
        }
        mintedPerWallet[msg.sender] += _numTokens;
        totalSupply += _numTokens;
    }

    // Owner-only functions
    function airdrop(uint16 numberOfTokens, address userAddress) external onlyOwner {
        for(uint256 i = 1; i <= numberOfTokens; i+=1) {
            _safeMint(userAddress, totalTokens+i);
        }
        totalTokens += numberOfTokens;
    }

    function flipSaleState() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance is 0");
        payable(owner()).transfer(address(this).balance);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
 
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return baseUri;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":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":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"},{"internalType":"address","name":"userAddress","type":"address"}],"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","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":"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":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","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":"nonpayable","type":"function"}]

608060405260006007556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004f919062000bc1565b503480156200005d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f506f6d6572616e69616e730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f504f4d00000000000000000000000000000000000000000000000000000000008152508160009081620000f2919062000bc1565b50806001908162000104919062000bc1565b505050620001276200011b620003aa60201b60201c565b620003b260201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200031c578015620001e2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001a892919062000ced565b600060405180830381600087803b158015620001c357600080fd5b505af1158015620001d8573d6000803e3d6000fd5b505050506200031b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200029c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200026292919062000ced565b600060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506200031a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002e5919062000d1a565b600060405180830381600087803b1580156200030057600080fd5b505af115801562000315573d6000803e3d6000fd5b505050505b5b5b50506040518060400160405280601e81526020017f68747470733a2f2f736572656e6f2e776f726b2f706f6d6f75747075742f0000815250600c908162000364919062000bc1565b506000600190505b600081116200039b576200038733826200047860201b60201c565b80620003939062000d66565b90506200036c565b506000600a819055506200110e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200049a8282604051806020016040528060008152506200049e60201b60201c565b5050565b620004b083836200050c60201b60201c565b620004c560008484846200070560201b60201c565b62000507576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fe9062000e3a565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200057e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005759062000eac565b60405180910390fd5b6200058f81620008ae60201b60201c565b15620005d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c99062000f1e565b60405180910390fd5b620005e6600083836200091a60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000638919062000f40565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a462000701600083836200091f60201b60201c565b5050565b6000620007338473ffffffffffffffffffffffffffffffffffffffff166200092460201b6200197b1760201c565b15620008a1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000765620003aa60201b60201c565b8786866040518563ffffffff1660e01b815260040162000789949392919062001026565b6020604051808303816000875af1925050508015620007c857506040513d601f19601f82011682018060405250810190620007c59190620010dc565b60015b62000850573d8060008114620007fb576040519150601f19603f3d011682016040523d82523d6000602084013e62000800565b606091505b50600081510362000848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200083f9062000e3a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008a6565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009c957607f821691505b602082108103620009df57620009de62000981565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a0a565b62000a55868362000a0a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000aa262000a9c62000a968462000a6d565b62000a77565b62000a6d565b9050919050565b6000819050919050565b62000abe8362000a81565b62000ad662000acd8262000aa9565b84845462000a17565b825550505050565b600090565b62000aed62000ade565b62000afa81848462000ab3565b505050565b5b8181101562000b225762000b1660008262000ae3565b60018101905062000b00565b5050565b601f82111562000b715762000b3b81620009e5565b62000b4684620009fa565b8101602085101562000b56578190505b62000b6e62000b6585620009fa565b83018262000aff565b50505b505050565b600082821c905092915050565b600062000b966000198460080262000b76565b1980831691505092915050565b600062000bb1838362000b83565b9150826002028217905092915050565b62000bcc8262000947565b67ffffffffffffffff81111562000be85762000be762000952565b5b62000bf48254620009b0565b62000c0182828562000b26565b600060209050601f83116001811462000c39576000841562000c24578287015190505b62000c30858262000ba3565b86555062000ca0565b601f19841662000c4986620009e5565b60005b8281101562000c735784890151825560018201915060208501945060208101905062000c4c565b8683101562000c93578489015162000c8f601f89168262000b83565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000cd58262000ca8565b9050919050565b62000ce78162000cc8565b82525050565b600060408201905062000d04600083018562000cdc565b62000d13602083018462000cdc565b9392505050565b600060208201905062000d31600083018462000cdc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d738262000a6d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000da85762000da762000d37565b5b600182019050919050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062000e2260328362000db3565b915062000e2f8262000dc4565b604082019050919050565b6000602082019050818103600083015262000e558162000e13565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000e9460208362000db3565b915062000ea18262000e5c565b602082019050919050565b6000602082019050818103600083015262000ec78162000e85565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000f06601c8362000db3565b915062000f138262000ece565b602082019050919050565b6000602082019050818103600083015262000f398162000ef7565b9050919050565b600062000f4d8262000a6d565b915062000f5a8362000a6d565b925082820190508082111562000f755762000f7462000d37565b5b92915050565b62000f868162000a6d565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000fc857808201518184015260208101905062000fab565b60008484015250505050565b6000601f19601f8301169050919050565b600062000ff28262000f8c565b62000ffe818562000f97565b93506200101081856020860162000fa8565b6200101b8162000fd4565b840191505092915050565b60006080820190506200103d600083018762000cdc565b6200104c602083018662000cdc565b6200105b604083018562000f7b565b81810360608301526200106f818462000fe5565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620010b6816200107f565b8114620010c257600080fd5b50565b600081519050620010d681620010ab565b92915050565b600060208284031215620010f557620010f46200107a565b5b60006200110584828501620010c5565b91505092915050565b614145806200111e6000396000f3fe6080604052600436106101cd5760003560e01c80638ecad721116100f7578063a22cb46511610095578063ccf2b9ab11610064578063ccf2b9ab14610631578063e985e9c51461065a578063f2fde38b14610697578063f47c84c5146106c0576101cd565b8063a22cb46514610577578063b88d4fde146105a0578063c6682862146105c9578063c87b56dd146105f4576101cd565b80639abc8320116100d15780639abc8320146104dc578063a035b1fe14610507578063a0712d6814610532578063a0bcfc7f1461054e576101cd565b80638ecad7211461045d57806391b7f5ed1461048857806395d89b41146104b1576101cd565b80633ccfd60b1161016f57806370a082311161013e57806370a08231146103b3578063715018a6146103f05780637e1c0c09146104075780638da5cb5b14610432576101cd565b80633ccfd60b1461030b57806342842e0e14610322578063564566a81461034b5780636352211e14610376576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb57806334918dfd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061282a565b6106eb565b6040516102069190612872565b60405180910390f35b34801561021b57600080fd5b506102246107cd565b604051610231919061291d565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612975565b61085f565b60405161026e91906129e3565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612a2a565b6108e4565b005b3480156102ac57600080fd5b506102b56109fb565b6040516102c29190612a79565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612a94565b610a01565b005b34801561030057600080fd5b50610309610b0d565b005b34801561031757600080fd5b50610320610bb5565b005b34801561032e57600080fd5b5061034960048036038101906103449190612a94565b610cc4565b005b34801561035757600080fd5b50610360610dd0565b60405161036d9190612872565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190612975565b610de3565b6040516103aa91906129e3565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190612ae7565b610e94565b6040516103e79190612a79565b60405180910390f35b3480156103fc57600080fd5b50610405610f4b565b005b34801561041357600080fd5b5061041c610fd3565b6040516104299190612a79565b60405180910390f35b34801561043e57600080fd5b50610447610fd9565b60405161045491906129e3565b60405180910390f35b34801561046957600080fd5b50610472611003565b60405161047f9190612a79565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612975565b611008565b005b3480156104bd57600080fd5b506104c661108e565b6040516104d3919061291d565b60405180910390f35b3480156104e857600080fd5b506104f1611120565b6040516104fe919061291d565b60405180910390f35b34801561051357600080fd5b5061051c6111ae565b6040516105299190612a79565b60405180910390f35b61054c60048036038101906105479190612975565b6111b4565b005b34801561055a57600080fd5b5061057560048036038101906105709190612c49565b611424565b005b34801561058357600080fd5b5061059e60048036038101906105999190612cbe565b6114b3565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190612d9f565b6114c9565b005b3480156105d557600080fd5b506105de6115d7565b6040516105eb919061291d565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612975565b611665565b604051610628919061291d565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612e5c565b61170f565b005b34801561066657600080fd5b50610681600480360381019061067c9190612e9c565b6117ea565b60405161068e9190612872565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612ae7565b61187e565b005b3480156106cc57600080fd5b506106d5611975565b6040516106e29190612a79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c657506107c58261199e565b5b9050919050565b6060600080546107dc90612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461080890612f0b565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a82611a08565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090612fae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef82610de3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690613040565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097e611a74565b73ffffffffffffffffffffffffffffffffffffffff1614806109ad57506109ac816109a7611a74565b6117ea565b5b6109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e3906130d2565b60405180910390fd5b6109f68383611a7c565b505050565b600a5481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610afd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a789291906130f2565b6020604051808303816000875af1158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190613130565b610afc57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610af391906129e3565b60405180910390fd5b5b610b08838383611b35565b505050565b610b15611a74565b73ffffffffffffffffffffffffffffffffffffffff16610b33610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906131a9565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b610bbd611a74565b73ffffffffffffffffffffffffffffffffffffffff16610bdb610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906131a9565b60405180910390fd5b60004711610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613215565b60405180910390fd5b610c7c610fd9565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cc1573d6000803e3d6000fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dc0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d3b9291906130f2565b6020604051808303816000875af1158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190613130565b610dbf57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610db691906129e3565b60405180910390fd5b5b610dcb838383611b95565b505050565b600960009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e82906132a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90613339565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f53611a74565b73ffffffffffffffffffffffffffffffffffffffff16610f71610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906131a9565b60405180910390fd5b610fd16000611bb5565b565b60085481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600481565b611010611a74565b73ffffffffffffffffffffffffffffffffffffffff1661102e610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b906131a9565b60405180910390fd5b8060078190555050565b60606001805461109d90612f0b565b80601f01602080910402602001604051908101604052809291908181526020018280546110c990612f0b565b80156111165780601f106110eb57610100808354040283529160200191611116565b820191906000526020600020905b8154815290600101906020018083116110f957829003601f168201915b5050505050905090565b600c805461112d90612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461115990612f0b565b80156111a65780601f1061117b576101008083540402835291602001916111a6565b820191906000526020600020905b81548152906001019060200180831161118957829003601f168201915b505050505081565b60075481565b600960009054906101000a900460ff16611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906133a5565b60405180910390fd5b6004811115611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613437565b60405180910390fd5b600481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112949190613486565b11156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613506565b60405180910390fd5b6000600a549050610d0582826112eb9190613486565b111561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613572565b60405180910390fd5b346007548361133b9190613592565b111561137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613620565b60405180910390fd5b6000600190505b8281116113b05761139f33828461139a9190613486565b611c7b565b806113a990613640565b9050611383565b5081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114009190613486565b9250508190555081600a60008282546114199190613486565b925050819055505050565b61142c611a74565b73ffffffffffffffffffffffffffffffffffffffff1661144a610fd9565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906131a9565b60405180910390fd5b80600c90816114af9190613834565b5050565b6114c56114be611a74565b8383611c99565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115c5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115409291906130f2565b6020604051808303816000875af115801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190613130565b6115c457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115bb91906129e3565b60405180910390fd5b5b6115d184848484611e05565b50505050565b600d80546115e490612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461161090612f0b565b801561165d5780601f106116325761010080835404028352916020019161165d565b820191906000526020600020905b81548152906001019060200180831161164057829003601f168201915b505050505081565b606061167082611a08565b6116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613978565b60405180910390fd5b60006116b9611e67565b905060008151116116d95760405180602001604052806000815250611707565b806116e384611ef9565b600d6040516020016116f793929190613a57565b6040516020818303038152906040525b915050919050565b611717611a74565b73ffffffffffffffffffffffffffffffffffffffff16611735610fd9565b73ffffffffffffffffffffffffffffffffffffffff161461178b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611782906131a9565b60405180910390fd5b6000600190505b8261ffff1681116117c8576117b482826008546117af9190613486565b611c7b565b6001816117c19190613486565b9050611792565b508161ffff16600860008282546117df9190613486565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611886611a74565b73ffffffffffffffffffffffffffffffffffffffff166118a4610fd9565b73ffffffffffffffffffffffffffffffffffffffff16146118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f1906131a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090613afa565b60405180910390fd5b61197281611bb5565b50565b610d0581565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aef83610de3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611b46611b40611a74565b82612059565b611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613b8c565b60405180910390fd5b611b90838383612137565b505050565b611bb0838383604051806020016040528060008152506114c9565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c9582826040518060200160405280600081525061239d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613bf8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df89190612872565b60405180910390a3505050565b611e16611e10611a74565b83612059565b611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c90613b8c565b60405180910390fd5b611e61848484846123f8565b50505050565b6060600c8054611e7690612f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea290612f0b565b8015611eef5780601f10611ec457610100808354040283529160200191611eef565b820191906000526020600020905b815481529060010190602001808311611ed257829003601f168201915b5050505050905090565b606060008203611f40576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612054565b600082905060005b60008214611f72578080611f5b90613640565b915050600a82611f6b9190613c47565b9150611f48565b60008167ffffffffffffffff811115611f8e57611f8d612b1e565b5b6040519080825280601f01601f191660200182016040528015611fc05781602001600182028036833780820191505090505b5090505b6000851461204d57600182611fd99190613c78565b9150600a85611fe89190613cac565b6030611ff49190613486565b60f81b81838151811061200a57612009613cdd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120469190613c47565b9450611fc4565b8093505050505b919050565b600061206482611a08565b6120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a90613d7e565b60405180910390fd5b60006120ae83610de3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f057506120ef81856117ea565b5b8061212e57508373ffffffffffffffffffffffffffffffffffffffff166121168461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661215782610de3565b73ffffffffffffffffffffffffffffffffffffffff16146121ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a490613e10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613ea2565b60405180910390fd5b612227838383612454565b612232600082611a7c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122829190613c78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d99190613486565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612398838383612459565b505050565b6123a7838361245e565b6123b46000848484612637565b6123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90613f34565b60405180910390fd5b505050565b612403848484612137565b61240f84848484612637565b61244e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244590613f34565b60405180910390fd5b50505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490613fa0565b60405180910390fd5b6124d681611a08565b15612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d9061400c565b60405180910390fd5b61252260008383612454565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125729190613486565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461263360008383612459565b5050565b60006126588473ffffffffffffffffffffffffffffffffffffffff1661197b565b156127b1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612681611a74565b8786866040518563ffffffff1660e01b81526004016126a39493929190614081565b6020604051808303816000875af19250505080156126df57506040513d601f19601f820116820180604052508101906126dc91906140e2565b60015b612761573d806000811461270f576040519150601f19603f3d011682016040523d82523d6000602084013e612714565b606091505b506000815103612759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275090613f34565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b6565b600190505b949350505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612807816127d2565b811461281257600080fd5b50565b600081359050612824816127fe565b92915050565b6000602082840312156128405761283f6127c8565b5b600061284e84828501612815565b91505092915050565b60008115159050919050565b61286c81612857565b82525050565b60006020820190506128876000830184612863565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128c75780820151818401526020810190506128ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006128ef8261288d565b6128f98185612898565b93506129098185602086016128a9565b612912816128d3565b840191505092915050565b6000602082019050818103600083015261293781846128e4565b905092915050565b6000819050919050565b6129528161293f565b811461295d57600080fd5b50565b60008135905061296f81612949565b92915050565b60006020828403121561298b5761298a6127c8565b5b600061299984828501612960565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129cd826129a2565b9050919050565b6129dd816129c2565b82525050565b60006020820190506129f860008301846129d4565b92915050565b612a07816129c2565b8114612a1257600080fd5b50565b600081359050612a24816129fe565b92915050565b60008060408385031215612a4157612a406127c8565b5b6000612a4f85828601612a15565b9250506020612a6085828601612960565b9150509250929050565b612a738161293f565b82525050565b6000602082019050612a8e6000830184612a6a565b92915050565b600080600060608486031215612aad57612aac6127c8565b5b6000612abb86828701612a15565b9350506020612acc86828701612a15565b9250506040612add86828701612960565b9150509250925092565b600060208284031215612afd57612afc6127c8565b5b6000612b0b84828501612a15565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b56826128d3565b810181811067ffffffffffffffff82111715612b7557612b74612b1e565b5b80604052505050565b6000612b886127be565b9050612b948282612b4d565b919050565b600067ffffffffffffffff821115612bb457612bb3612b1e565b5b612bbd826128d3565b9050602081019050919050565b82818337600083830152505050565b6000612bec612be784612b99565b612b7e565b905082815260208101848484011115612c0857612c07612b19565b5b612c13848285612bca565b509392505050565b600082601f830112612c3057612c2f612b14565b5b8135612c40848260208601612bd9565b91505092915050565b600060208284031215612c5f57612c5e6127c8565b5b600082013567ffffffffffffffff811115612c7d57612c7c6127cd565b5b612c8984828501612c1b565b91505092915050565b612c9b81612857565b8114612ca657600080fd5b50565b600081359050612cb881612c92565b92915050565b60008060408385031215612cd557612cd46127c8565b5b6000612ce385828601612a15565b9250506020612cf485828601612ca9565b9150509250929050565b600067ffffffffffffffff821115612d1957612d18612b1e565b5b612d22826128d3565b9050602081019050919050565b6000612d42612d3d84612cfe565b612b7e565b905082815260208101848484011115612d5e57612d5d612b19565b5b612d69848285612bca565b509392505050565b600082601f830112612d8657612d85612b14565b5b8135612d96848260208601612d2f565b91505092915050565b60008060008060808587031215612db957612db86127c8565b5b6000612dc787828801612a15565b9450506020612dd887828801612a15565b9350506040612de987828801612960565b925050606085013567ffffffffffffffff811115612e0a57612e096127cd565b5b612e1687828801612d71565b91505092959194509250565b600061ffff82169050919050565b612e3981612e22565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b60008060408385031215612e7357612e726127c8565b5b6000612e8185828601612e47565b9250506020612e9285828601612a15565b9150509250929050565b60008060408385031215612eb357612eb26127c8565b5b6000612ec185828601612a15565b9250506020612ed285828601612a15565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f2357607f821691505b602082108103612f3657612f35612edc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612f98602c83612898565b9150612fa382612f3c565b604082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061302a602183612898565b915061303582612fce565b604082019050919050565b600060208201905081810360008301526130598161301d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006130bc603883612898565b91506130c782613060565b604082019050919050565b600060208201905081810360008301526130eb816130af565b9050919050565b600060408201905061310760008301856129d4565b61311460208301846129d4565b9392505050565b60008151905061312a81612c92565b92915050565b600060208284031215613146576131456127c8565b5b60006131548482850161311b565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613193602083612898565b915061319e8261315d565b602082019050919050565b600060208201905081810360008301526131c281613186565b9050919050565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b60006131ff600c83612898565b915061320a826131c9565b602082019050919050565b6000602082019050818103600083015261322e816131f2565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613291602983612898565b915061329c82613235565b604082019050919050565b600060208201905081810360008301526132c081613284565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613323602a83612898565b915061332e826132c7565b604082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b7f5468652073616c65206973207061757365642e00000000000000000000000000600082015250565b600061338f601383612898565b915061339a82613359565b602082019050919050565b600060208201905081810360008301526133be81613382565b9050919050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920696e206f6e6560008201527f207472616e73616374696f6e2e00000000000000000000000000000000000000602082015250565b6000613421602d83612898565b915061342c826133c5565b604082019050919050565b6000602082019050818103600083015261345081613414565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134918261293f565b915061349c8361293f565b92508282019050808211156134b4576134b3613457565b5b92915050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920746f74616c2e600082015250565b60006134f0602083612898565b91506134fb826134ba565b602082019050919050565b6000602082019050818103600083015261351f816134e3565b9050919050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b600061355c601583612898565b915061356782613526565b602082019050919050565b6000602082019050818103600083015261358b8161354f565b9050919050565b600061359d8261293f565b91506135a88361293f565b92508282026135b68161293f565b915082820484148315176135cd576135cc613457565b5b5092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b600061360a601383612898565b9150613615826135d4565b602082019050919050565b60006020820190508181036000830152613639816135fd565b9050919050565b600061364b8261293f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361367d5761367c613457565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ad565b6136f486836136ad565b95508019841693508086168417925050509392505050565b6000819050919050565b600061373161372c6137278461293f565b61370c565b61293f565b9050919050565b6000819050919050565b61374b83613716565b61375f61375782613738565b8484546136ba565b825550505050565b600090565b613774613767565b61377f818484613742565b505050565b5b818110156137a35761379860008261376c565b600181019050613785565b5050565b601f8211156137e8576137b981613688565b6137c28461369d565b810160208510156137d1578190505b6137e56137dd8561369d565b830182613784565b50505b505050565b600082821c905092915050565b600061380b600019846008026137ed565b1980831691505092915050565b600061382483836137fa565b9150826002028217905092915050565b61383d8261288d565b67ffffffffffffffff81111561385657613855612b1e565b5b6138608254612f0b565b61386b8282856137a7565b600060209050601f83116001811461389e576000841561388c578287015190505b6138968582613818565b8655506138fe565b601f1984166138ac86613688565b60005b828110156138d4578489015182556001820191506020850194506020810190506138af565b868310156138f157848901516138ed601f8916826137fa565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613962602f83612898565b915061396d82613906565b604082019050919050565b6000602082019050818103600083015261399181613955565b9050919050565b600081905092915050565b60006139ae8261288d565b6139b88185613998565b93506139c88185602086016128a9565b80840191505092915050565b600081546139e181612f0b565b6139eb8186613998565b94506001821660008114613a065760018114613a1b57613a4e565b60ff1983168652811515820286019350613a4e565b613a2485613688565b60005b83811015613a4657815481890152600182019150602081019050613a27565b838801955050505b50505092915050565b6000613a6382866139a3565b9150613a6f82856139a3565b9150613a7b82846139d4565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ae4602683612898565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b76603183612898565b9150613b8182613b1a565b604082019050919050565b60006020820190508181036000830152613ba581613b69565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be2601983612898565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c528261293f565b9150613c5d8361293f565b925082613c6d57613c6c613c18565b5b828204905092915050565b6000613c838261293f565b9150613c8e8361293f565b9250828203905081811115613ca657613ca5613457565b5b92915050565b6000613cb78261293f565b9150613cc28361293f565b925082613cd257613cd1613c18565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613d68602c83612898565b9150613d7382613d0c565b604082019050919050565b60006020820190508181036000830152613d9781613d5b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dfa602583612898565b9150613e0582613d9e565b604082019050919050565b60006020820190508181036000830152613e2981613ded565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e8c602483612898565b9150613e9782613e30565b604082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f1e603283612898565b9150613f2982613ec2565b604082019050919050565b60006020820190508181036000830152613f4d81613f11565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613f8a602083612898565b9150613f9582613f54565b602082019050919050565b60006020820190508181036000830152613fb981613f7d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ff6601c83612898565b915061400182613fc0565b602082019050919050565b6000602082019050818103600083015261402581613fe9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006140538261402c565b61405d8185614037565b935061406d8185602086016128a9565b614076816128d3565b840191505092915050565b600060808201905061409660008301876129d4565b6140a360208301866129d4565b6140b06040830185612a6a565b81810360608301526140c28184614048565b905095945050505050565b6000815190506140dc816127fe565b92915050565b6000602082840312156140f8576140f76127c8565b5b6000614106848285016140cd565b9150509291505056fea2646970667358221220808ce296a479bacae9dd4d7975e6575f8c7aa54671f7b571d5767ee72ef4baa364736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638ecad721116100f7578063a22cb46511610095578063ccf2b9ab11610064578063ccf2b9ab14610631578063e985e9c51461065a578063f2fde38b14610697578063f47c84c5146106c0576101cd565b8063a22cb46514610577578063b88d4fde146105a0578063c6682862146105c9578063c87b56dd146105f4576101cd565b80639abc8320116100d15780639abc8320146104dc578063a035b1fe14610507578063a0712d6814610532578063a0bcfc7f1461054e576101cd565b80638ecad7211461045d57806391b7f5ed1461048857806395d89b41146104b1576101cd565b80633ccfd60b1161016f57806370a082311161013e57806370a08231146103b3578063715018a6146103f05780637e1c0c09146104075780638da5cb5b14610432576101cd565b80633ccfd60b1461030b57806342842e0e14610322578063564566a81461034b5780636352211e14610376576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb57806334918dfd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061282a565b6106eb565b6040516102069190612872565b60405180910390f35b34801561021b57600080fd5b506102246107cd565b604051610231919061291d565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612975565b61085f565b60405161026e91906129e3565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612a2a565b6108e4565b005b3480156102ac57600080fd5b506102b56109fb565b6040516102c29190612a79565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612a94565b610a01565b005b34801561030057600080fd5b50610309610b0d565b005b34801561031757600080fd5b50610320610bb5565b005b34801561032e57600080fd5b5061034960048036038101906103449190612a94565b610cc4565b005b34801561035757600080fd5b50610360610dd0565b60405161036d9190612872565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190612975565b610de3565b6040516103aa91906129e3565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190612ae7565b610e94565b6040516103e79190612a79565b60405180910390f35b3480156103fc57600080fd5b50610405610f4b565b005b34801561041357600080fd5b5061041c610fd3565b6040516104299190612a79565b60405180910390f35b34801561043e57600080fd5b50610447610fd9565b60405161045491906129e3565b60405180910390f35b34801561046957600080fd5b50610472611003565b60405161047f9190612a79565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612975565b611008565b005b3480156104bd57600080fd5b506104c661108e565b6040516104d3919061291d565b60405180910390f35b3480156104e857600080fd5b506104f1611120565b6040516104fe919061291d565b60405180910390f35b34801561051357600080fd5b5061051c6111ae565b6040516105299190612a79565b60405180910390f35b61054c60048036038101906105479190612975565b6111b4565b005b34801561055a57600080fd5b5061057560048036038101906105709190612c49565b611424565b005b34801561058357600080fd5b5061059e60048036038101906105999190612cbe565b6114b3565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190612d9f565b6114c9565b005b3480156105d557600080fd5b506105de6115d7565b6040516105eb919061291d565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612975565b611665565b604051610628919061291d565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612e5c565b61170f565b005b34801561066657600080fd5b50610681600480360381019061067c9190612e9c565b6117ea565b60405161068e9190612872565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612ae7565b61187e565b005b3480156106cc57600080fd5b506106d5611975565b6040516106e29190612a79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c657506107c58261199e565b5b9050919050565b6060600080546107dc90612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461080890612f0b565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a82611a08565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090612fae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef82610de3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690613040565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097e611a74565b73ffffffffffffffffffffffffffffffffffffffff1614806109ad57506109ac816109a7611a74565b6117ea565b5b6109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e3906130d2565b60405180910390fd5b6109f68383611a7c565b505050565b600a5481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610afd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a789291906130f2565b6020604051808303816000875af1158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190613130565b610afc57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610af391906129e3565b60405180910390fd5b5b610b08838383611b35565b505050565b610b15611a74565b73ffffffffffffffffffffffffffffffffffffffff16610b33610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906131a9565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b610bbd611a74565b73ffffffffffffffffffffffffffffffffffffffff16610bdb610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906131a9565b60405180910390fd5b60004711610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613215565b60405180910390fd5b610c7c610fd9565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cc1573d6000803e3d6000fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dc0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d3b9291906130f2565b6020604051808303816000875af1158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190613130565b610dbf57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610db691906129e3565b60405180910390fd5b5b610dcb838383611b95565b505050565b600960009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e82906132a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90613339565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f53611a74565b73ffffffffffffffffffffffffffffffffffffffff16610f71610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906131a9565b60405180910390fd5b610fd16000611bb5565b565b60085481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600481565b611010611a74565b73ffffffffffffffffffffffffffffffffffffffff1661102e610fd9565b73ffffffffffffffffffffffffffffffffffffffff1614611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b906131a9565b60405180910390fd5b8060078190555050565b60606001805461109d90612f0b565b80601f01602080910402602001604051908101604052809291908181526020018280546110c990612f0b565b80156111165780601f106110eb57610100808354040283529160200191611116565b820191906000526020600020905b8154815290600101906020018083116110f957829003601f168201915b5050505050905090565b600c805461112d90612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461115990612f0b565b80156111a65780601f1061117b576101008083540402835291602001916111a6565b820191906000526020600020905b81548152906001019060200180831161118957829003601f168201915b505050505081565b60075481565b600960009054906101000a900460ff16611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906133a5565b60405180910390fd5b6004811115611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613437565b60405180910390fd5b600481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112949190613486565b11156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613506565b60405180910390fd5b6000600a549050610d0582826112eb9190613486565b111561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613572565b60405180910390fd5b346007548361133b9190613592565b111561137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613620565b60405180910390fd5b6000600190505b8281116113b05761139f33828461139a9190613486565b611c7b565b806113a990613640565b9050611383565b5081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114009190613486565b9250508190555081600a60008282546114199190613486565b925050819055505050565b61142c611a74565b73ffffffffffffffffffffffffffffffffffffffff1661144a610fd9565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906131a9565b60405180910390fd5b80600c90816114af9190613834565b5050565b6114c56114be611a74565b8383611c99565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115c5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115409291906130f2565b6020604051808303816000875af115801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190613130565b6115c457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115bb91906129e3565b60405180910390fd5b5b6115d184848484611e05565b50505050565b600d80546115e490612f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461161090612f0b565b801561165d5780601f106116325761010080835404028352916020019161165d565b820191906000526020600020905b81548152906001019060200180831161164057829003601f168201915b505050505081565b606061167082611a08565b6116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690613978565b60405180910390fd5b60006116b9611e67565b905060008151116116d95760405180602001604052806000815250611707565b806116e384611ef9565b600d6040516020016116f793929190613a57565b6040516020818303038152906040525b915050919050565b611717611a74565b73ffffffffffffffffffffffffffffffffffffffff16611735610fd9565b73ffffffffffffffffffffffffffffffffffffffff161461178b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611782906131a9565b60405180910390fd5b6000600190505b8261ffff1681116117c8576117b482826008546117af9190613486565b611c7b565b6001816117c19190613486565b9050611792565b508161ffff16600860008282546117df9190613486565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611886611a74565b73ffffffffffffffffffffffffffffffffffffffff166118a4610fd9565b73ffffffffffffffffffffffffffffffffffffffff16146118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f1906131a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090613afa565b60405180910390fd5b61197281611bb5565b50565b610d0581565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aef83610de3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611b46611b40611a74565b82612059565b611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613b8c565b60405180910390fd5b611b90838383612137565b505050565b611bb0838383604051806020016040528060008152506114c9565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c9582826040518060200160405280600081525061239d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613bf8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611df89190612872565b60405180910390a3505050565b611e16611e10611a74565b83612059565b611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c90613b8c565b60405180910390fd5b611e61848484846123f8565b50505050565b6060600c8054611e7690612f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea290612f0b565b8015611eef5780601f10611ec457610100808354040283529160200191611eef565b820191906000526020600020905b815481529060010190602001808311611ed257829003601f168201915b5050505050905090565b606060008203611f40576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612054565b600082905060005b60008214611f72578080611f5b90613640565b915050600a82611f6b9190613c47565b9150611f48565b60008167ffffffffffffffff811115611f8e57611f8d612b1e565b5b6040519080825280601f01601f191660200182016040528015611fc05781602001600182028036833780820191505090505b5090505b6000851461204d57600182611fd99190613c78565b9150600a85611fe89190613cac565b6030611ff49190613486565b60f81b81838151811061200a57612009613cdd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120469190613c47565b9450611fc4565b8093505050505b919050565b600061206482611a08565b6120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a90613d7e565b60405180910390fd5b60006120ae83610de3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f057506120ef81856117ea565b5b8061212e57508373ffffffffffffffffffffffffffffffffffffffff166121168461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661215782610de3565b73ffffffffffffffffffffffffffffffffffffffff16146121ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a490613e10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613ea2565b60405180910390fd5b612227838383612454565b612232600082611a7c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122829190613c78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d99190613486565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612398838383612459565b505050565b6123a7838361245e565b6123b46000848484612637565b6123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90613f34565b60405180910390fd5b505050565b612403848484612137565b61240f84848484612637565b61244e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244590613f34565b60405180910390fd5b50505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490613fa0565b60405180910390fd5b6124d681611a08565b15612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d9061400c565b60405180910390fd5b61252260008383612454565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125729190613486565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461263360008383612459565b5050565b60006126588473ffffffffffffffffffffffffffffffffffffffff1661197b565b156127b1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612681611a74565b8786866040518563ffffffff1660e01b81526004016126a39493929190614081565b6020604051808303816000875af19250505080156126df57506040513d601f19601f820116820180604052508101906126dc91906140e2565b60015b612761573d806000811461270f576040519150601f19603f3d011682016040523d82523d6000602084013e612714565b606091505b506000815103612759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275090613f34565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b6565b600190505b949350505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612807816127d2565b811461281257600080fd5b50565b600081359050612824816127fe565b92915050565b6000602082840312156128405761283f6127c8565b5b600061284e84828501612815565b91505092915050565b60008115159050919050565b61286c81612857565b82525050565b60006020820190506128876000830184612863565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128c75780820151818401526020810190506128ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006128ef8261288d565b6128f98185612898565b93506129098185602086016128a9565b612912816128d3565b840191505092915050565b6000602082019050818103600083015261293781846128e4565b905092915050565b6000819050919050565b6129528161293f565b811461295d57600080fd5b50565b60008135905061296f81612949565b92915050565b60006020828403121561298b5761298a6127c8565b5b600061299984828501612960565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129cd826129a2565b9050919050565b6129dd816129c2565b82525050565b60006020820190506129f860008301846129d4565b92915050565b612a07816129c2565b8114612a1257600080fd5b50565b600081359050612a24816129fe565b92915050565b60008060408385031215612a4157612a406127c8565b5b6000612a4f85828601612a15565b9250506020612a6085828601612960565b9150509250929050565b612a738161293f565b82525050565b6000602082019050612a8e6000830184612a6a565b92915050565b600080600060608486031215612aad57612aac6127c8565b5b6000612abb86828701612a15565b9350506020612acc86828701612a15565b9250506040612add86828701612960565b9150509250925092565b600060208284031215612afd57612afc6127c8565b5b6000612b0b84828501612a15565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b56826128d3565b810181811067ffffffffffffffff82111715612b7557612b74612b1e565b5b80604052505050565b6000612b886127be565b9050612b948282612b4d565b919050565b600067ffffffffffffffff821115612bb457612bb3612b1e565b5b612bbd826128d3565b9050602081019050919050565b82818337600083830152505050565b6000612bec612be784612b99565b612b7e565b905082815260208101848484011115612c0857612c07612b19565b5b612c13848285612bca565b509392505050565b600082601f830112612c3057612c2f612b14565b5b8135612c40848260208601612bd9565b91505092915050565b600060208284031215612c5f57612c5e6127c8565b5b600082013567ffffffffffffffff811115612c7d57612c7c6127cd565b5b612c8984828501612c1b565b91505092915050565b612c9b81612857565b8114612ca657600080fd5b50565b600081359050612cb881612c92565b92915050565b60008060408385031215612cd557612cd46127c8565b5b6000612ce385828601612a15565b9250506020612cf485828601612ca9565b9150509250929050565b600067ffffffffffffffff821115612d1957612d18612b1e565b5b612d22826128d3565b9050602081019050919050565b6000612d42612d3d84612cfe565b612b7e565b905082815260208101848484011115612d5e57612d5d612b19565b5b612d69848285612bca565b509392505050565b600082601f830112612d8657612d85612b14565b5b8135612d96848260208601612d2f565b91505092915050565b60008060008060808587031215612db957612db86127c8565b5b6000612dc787828801612a15565b9450506020612dd887828801612a15565b9350506040612de987828801612960565b925050606085013567ffffffffffffffff811115612e0a57612e096127cd565b5b612e1687828801612d71565b91505092959194509250565b600061ffff82169050919050565b612e3981612e22565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b60008060408385031215612e7357612e726127c8565b5b6000612e8185828601612e47565b9250506020612e9285828601612a15565b9150509250929050565b60008060408385031215612eb357612eb26127c8565b5b6000612ec185828601612a15565b9250506020612ed285828601612a15565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f2357607f821691505b602082108103612f3657612f35612edc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612f98602c83612898565b9150612fa382612f3c565b604082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061302a602183612898565b915061303582612fce565b604082019050919050565b600060208201905081810360008301526130598161301d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006130bc603883612898565b91506130c782613060565b604082019050919050565b600060208201905081810360008301526130eb816130af565b9050919050565b600060408201905061310760008301856129d4565b61311460208301846129d4565b9392505050565b60008151905061312a81612c92565b92915050565b600060208284031215613146576131456127c8565b5b60006131548482850161311b565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613193602083612898565b915061319e8261315d565b602082019050919050565b600060208201905081810360008301526131c281613186565b9050919050565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b60006131ff600c83612898565b915061320a826131c9565b602082019050919050565b6000602082019050818103600083015261322e816131f2565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613291602983612898565b915061329c82613235565b604082019050919050565b600060208201905081810360008301526132c081613284565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613323602a83612898565b915061332e826132c7565b604082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b7f5468652073616c65206973207061757365642e00000000000000000000000000600082015250565b600061338f601383612898565b915061339a82613359565b602082019050919050565b600060208201905081810360008301526133be81613382565b9050919050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920696e206f6e6560008201527f207472616e73616374696f6e2e00000000000000000000000000000000000000602082015250565b6000613421602d83612898565b915061342c826133c5565b604082019050919050565b6000602082019050818103600083015261345081613414565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134918261293f565b915061349c8361293f565b92508282019050808211156134b4576134b3613457565b5b92915050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920746f74616c2e600082015250565b60006134f0602083612898565b91506134fb826134ba565b602082019050919050565b6000602082019050818103600083015261351f816134e3565b9050919050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b600061355c601583612898565b915061356782613526565b602082019050919050565b6000602082019050818103600083015261358b8161354f565b9050919050565b600061359d8261293f565b91506135a88361293f565b92508282026135b68161293f565b915082820484148315176135cd576135cc613457565b5b5092915050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b600061360a601383612898565b9150613615826135d4565b602082019050919050565b60006020820190508181036000830152613639816135fd565b9050919050565b600061364b8261293f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361367d5761367c613457565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ad565b6136f486836136ad565b95508019841693508086168417925050509392505050565b6000819050919050565b600061373161372c6137278461293f565b61370c565b61293f565b9050919050565b6000819050919050565b61374b83613716565b61375f61375782613738565b8484546136ba565b825550505050565b600090565b613774613767565b61377f818484613742565b505050565b5b818110156137a35761379860008261376c565b600181019050613785565b5050565b601f8211156137e8576137b981613688565b6137c28461369d565b810160208510156137d1578190505b6137e56137dd8561369d565b830182613784565b50505b505050565b600082821c905092915050565b600061380b600019846008026137ed565b1980831691505092915050565b600061382483836137fa565b9150826002028217905092915050565b61383d8261288d565b67ffffffffffffffff81111561385657613855612b1e565b5b6138608254612f0b565b61386b8282856137a7565b600060209050601f83116001811461389e576000841561388c578287015190505b6138968582613818565b8655506138fe565b601f1984166138ac86613688565b60005b828110156138d4578489015182556001820191506020850194506020810190506138af565b868310156138f157848901516138ed601f8916826137fa565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613962602f83612898565b915061396d82613906565b604082019050919050565b6000602082019050818103600083015261399181613955565b9050919050565b600081905092915050565b60006139ae8261288d565b6139b88185613998565b93506139c88185602086016128a9565b80840191505092915050565b600081546139e181612f0b565b6139eb8186613998565b94506001821660008114613a065760018114613a1b57613a4e565b60ff1983168652811515820286019350613a4e565b613a2485613688565b60005b83811015613a4657815481890152600182019150602081019050613a27565b838801955050505b50505092915050565b6000613a6382866139a3565b9150613a6f82856139a3565b9150613a7b82846139d4565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ae4602683612898565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b76603183612898565b9150613b8182613b1a565b604082019050919050565b60006020820190508181036000830152613ba581613b69565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be2601983612898565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c528261293f565b9150613c5d8361293f565b925082613c6d57613c6c613c18565b5b828204905092915050565b6000613c838261293f565b9150613c8e8361293f565b9250828203905081811115613ca657613ca5613457565b5b92915050565b6000613cb78261293f565b9150613cc28361293f565b925082613cd257613cd1613c18565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613d68602c83612898565b9150613d7382613d0c565b604082019050919050565b60006020820190508181036000830152613d9781613d5b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dfa602583612898565b9150613e0582613d9e565b604082019050919050565b60006020820190508181036000830152613e2981613ded565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e8c602483612898565b9150613e9782613e30565b604082019050919050565b60006020820190508181036000830152613ebb81613e7f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f1e603283612898565b9150613f2982613ec2565b604082019050919050565b60006020820190508181036000830152613f4d81613f11565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613f8a602083612898565b9150613f9582613f54565b602082019050919050565b60006020820190508181036000830152613fb981613f7d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ff6601c83612898565b915061400182613fc0565b602082019050919050565b6000602082019050818103600083015261402581613fe9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006140538261402c565b61405d8185614037565b935061406d8185602086016128a9565b614076816128d3565b840191505092915050565b600060808201905061409660008301876129d4565b6140a360208301866129d4565b6140b06040830185612a6a565b81810360608301526140c28184614048565b905095945050505050565b6000815190506140dc816127fe565b92915050565b6000602082840312156140f8576140f76127c8565b5b6000614106848285016140cd565b9150509291505056fea2646970667358221220808ce296a479bacae9dd4d7975e6575f8c7aa54671f7b571d5767ee72ef4baa364736f6c63430008110033

Deployed Bytecode Sourcemap

54803:3392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39083:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40028:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41588:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41111:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55149:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56937:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56636:91;;;;;;;;;;;;;:::i;:::-;;57505:165;;;;;;;;;;;;;:::i;:::-;;57102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55115:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39722:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39452:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53911:103;;;;;;;;;;;;;:::i;:::-;;55080:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53260:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55030:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56843:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40197:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55242:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55002;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55600:743;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56735:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41881:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57275:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55270:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57678:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56380:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42107:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54169:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54909:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39083:305;39185:4;39237:25;39222:40;;;:11;:40;;;;:105;;;;39294:33;39279:48;;;:11;:48;;;;39222:105;:158;;;;39344:36;39368:11;39344:23;:36::i;:::-;39222:158;39202:178;;39083:305;;;:::o;40028:100::-;40082:13;40115:5;40108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40028:100;:::o;41588:221::-;41664:7;41692:16;41700:7;41692;:16::i;:::-;41684:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41777:15;:24;41793:7;41777:24;;;;;;;;;;;;;;;;;;;;;41770:31;;41588:221;;;:::o;41111:411::-;41192:13;41208:23;41223:7;41208:14;:23::i;:::-;41192:39;;41256:5;41250:11;;:2;:11;;;41242:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41350:5;41334:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41359:37;41376:5;41383:12;:10;:12::i;:::-;41359:16;:37::i;:::-;41334:62;41312:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;41493:21;41502:2;41506:7;41493:8;:21::i;:::-;41181:341;41111:411;;:::o;55149:26::-;;;;:::o;56937:157::-;16969:1;15795:42;16923:43;;;:47;16919:225;;;15795:42;16992:40;;;17041:4;17048:10;16992:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16987:146;;17106:10;17087:30;;;;;;;;;;;:::i;:::-;;;;;;;;16987:146;16919:225;57049:37:::1;57068:4;57074:2;57078:7;57049:18;:37::i;:::-;56937:157:::0;;;:::o;56636:91::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56707:12:::1;;;;;;;;;;;56706:13;56691:12;;:28;;;;;;;;;;;;;;;;;;56636:91::o:0;57505:165::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57585:1:::1;57561:21;:25;57553:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57622:7;:5;:7::i;:::-;57614:25;;:48;57640:21;57614:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57505:165::o:0;57102:::-;16969:1;15795:42;16923:43;;;:47;16919:225;;;15795:42;16992:40;;;17041:4;17048:10;16992:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16987:146;;17106:10;17087:30;;;;;;;;;;;:::i;:::-;;;;;;;;16987:146;16919:225;57218:41:::1;57241:4;57247:2;57251:7;57218:22;:41::i;:::-;57102:165:::0;;;:::o;55115:24::-;;;;;;;;;;;;;:::o;39722:239::-;39794:7;39814:13;39830:7;:16;39838:7;39830:16;;;;;;;;;;;;;;;;;;;;;39814:32;;39882:1;39865:19;;:5;:19;;;39857:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39948:5;39941:12;;;39722:239;;;:::o;39452:208::-;39524:7;39569:1;39552:19;;:5;:19;;;39544:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39636:9;:16;39646:5;39636:16;;;;;;;;;;;;;;;;39629:23;;39452:208;;;:::o;53911:103::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53976:30:::1;54003:1;53976:18;:30::i;:::-;53911:103::o:0;55080:26::-;;;;:::o;53260:87::-;53306:7;53333:6;;;;;;;;;;;53326:13;;53260:87;:::o;55030:43::-;55072:1;55030:43;:::o;56843:86::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56915:6:::1;56907:5;:14;;;;56843:86:::0;:::o;40197:104::-;40253:13;40286:7;40279:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40197:104;:::o;55242:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55002:::-;;;;:::o;55600:743::-;55670:12;;;;;;;;;;;55662:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;55072:1;55725:10;:29;;55717:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;55072:1;55853:10;55823:15;:27;55839:10;55823:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:59;;55815:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55930:22;55955:11;;55930:36;;54943:4;56002:10;55985:14;:27;;;;:::i;:::-;:41;;55977:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56093:9;56084:5;;56071:10;:18;;;;:::i;:::-;:31;;56063:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56143:9;56155:1;56143:13;;56139:109;56163:10;56158:1;:15;56139:109;;56195:41;56205:10;56234:1;56217:14;:18;;;;:::i;:::-;56195:9;:41::i;:::-;56175:3;;;;:::i;:::-;;;56139:109;;;;56289:10;56258:15;:27;56274:10;56258:27;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;56325:10;56310:11;;:25;;;;;;;:::i;:::-;;;;;;;;55651:692;55600:743;:::o;56735:100::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56819:8:::1;56809:7;:18;;;;;;:::i;:::-;;56735:100:::0;:::o;41881:155::-;41976:52;41995:12;:10;:12::i;:::-;42009:8;42019;41976:18;:52::i;:::-;41881:155;;:::o;57275:222::-;16969:1;15795:42;16923:43;;;:47;16919:225;;;15795:42;16992:40;;;17041:4;17048:10;16992:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16987:146;;17106:10;17087:30;;;;;;;;;;;:::i;:::-;;;;;;;;16987:146;16919:225;57442:47:::1;57465:4;57471:2;57475:7;57484:4;57442:22;:47::i;:::-;57275:222:::0;;;;:::o;55270:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57678:397::-;57751:13;57785:16;57793:7;57785;:16::i;:::-;57777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57867:28;57898:10;:8;:10::i;:::-;57867:41;;57957:1;57932:14;57926:28;:32;:141;;;;;;;;;;;;;;;;;57998:14;58014:18;:7;:16;:18::i;:::-;58034:13;57981:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57926:141;57919:148;;;57678:397;;;:::o;56380:248::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56475:9:::1;56487:1;56475:13;;56471:110;56495:14;56490:19;;:1;:19;56471:110;;56532:37;56542:11;56567:1;56555:11;;:13;;;;:::i;:::-;56532:9;:37::i;:::-;56514:1;56511:4;;;;;:::i;:::-;;;56471:110;;;;56606:14;56591:29;;:11;;:29;;;;;;;:::i;:::-;;;;;;;;56380:248:::0;;:::o;42107:164::-;42204:4;42228:18;:25;42247:5;42228:25;;;;;;;;;;;;;;;:35;42254:8;42228:35;;;;;;;;;;;;;;;;;;;;;;;;;42221:42;;42107:164;;;;:::o;54169:201::-;53491:12;:10;:12::i;:::-;53480:23;;:7;:5;:7::i;:::-;:23;;;53472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54278:1:::1;54258:22;;:8;:22;;::::0;54250:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54334:28;54353:8;54334:18;:28::i;:::-;54169:201:::0;:::o;54909:38::-;54943:4;54909:38;:::o;20823:326::-;20883:4;21140:1;21118:7;:19;;;:23;21111:30;;20823:326;;;:::o;30929:157::-;31014:4;31053:25;31038:40;;;:11;:40;;;;31031:47;;30929:157;;;:::o;44842:127::-;44907:4;44959:1;44931:30;;:7;:16;44939:7;44931:16;;;;;;;;;;;;;;;;;;;;;:30;;;;44924:37;;44842:127;;;:::o;37462:98::-;37515:7;37542:10;37535:17;;37462:98;:::o;48988:174::-;49090:2;49063:15;:24;49079:7;49063:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49146:7;49142:2;49108:46;;49117:23;49132:7;49117:14;:23::i;:::-;49108:46;;;;;;;;;;;;48988:174;;:::o;42338:339::-;42533:41;42552:12;:10;:12::i;:::-;42566:7;42533:18;:41::i;:::-;42525:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42641:28;42651:4;42657:2;42661:7;42641:9;:28::i;:::-;42338:339;;;:::o;42748:185::-;42886:39;42903:4;42909:2;42913:7;42886:39;;;;;;;;;;;;:16;:39::i;:::-;42748:185;;;:::o;54530:191::-;54604:16;54623:6;;;;;;;;;;;54604:25;;54649:8;54640:6;;:17;;;;;;;;;;;;;;;;;;54704:8;54673:40;;54694:8;54673:40;;;;;;;;;;;;54593:128;54530:191;:::o;45826:110::-;45902:26;45912:2;45916:7;45902:26;;;;;;;;;;;;:9;:26::i;:::-;45826:110;;:::o;49304:315::-;49459:8;49450:17;;:5;:17;;;49442:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49546:8;49508:18;:25;49527:5;49508:25;;;;;;;;;;;;;;;:35;49534:8;49508:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49592:8;49570:41;;49585:5;49570:41;;;49602:8;49570:41;;;;;;:::i;:::-;;;;;;;;49304:315;;;:::o;43004:328::-;43179:41;43198:12;:10;:12::i;:::-;43212:7;43179:18;:41::i;:::-;43171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43285:39;43299:4;43305:2;43309:7;43318:5;43285:13;:39::i;:::-;43004:328;;;;:::o;58084:108::-;58144:13;58177:7;58170:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58084:108;:::o;17831:723::-;17887:13;18117:1;18108:5;:10;18104:53;;18135:10;;;;;;;;;;;;;;;;;;;;;18104:53;18167:12;18182:5;18167:20;;18198:14;18223:78;18238:1;18230:4;:9;18223:78;;18256:8;;;;;:::i;:::-;;;;18287:2;18279:10;;;;;:::i;:::-;;;18223:78;;;18311:19;18343:6;18333:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18311:39;;18361:154;18377:1;18368:5;:10;18361:154;;18405:1;18395:11;;;;;:::i;:::-;;;18472:2;18464:5;:10;;;;:::i;:::-;18451:2;:24;;;;:::i;:::-;18438:39;;18421:6;18428;18421:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18501:2;18492:11;;;;;:::i;:::-;;;18361:154;;;18539:6;18525:21;;;;;17831:723;;;;:::o;45136:348::-;45229:4;45254:16;45262:7;45254;:16::i;:::-;45246:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45330:13;45346:23;45361:7;45346:14;:23::i;:::-;45330:39;;45399:5;45388:16;;:7;:16;;;:52;;;;45408:32;45425:5;45432:7;45408:16;:32::i;:::-;45388:52;:87;;;;45468:7;45444:31;;:20;45456:7;45444:11;:20::i;:::-;:31;;;45388:87;45380:96;;;45136:348;;;;:::o;48245:625::-;48404:4;48377:31;;:23;48392:7;48377:14;:23::i;:::-;:31;;;48369:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48483:1;48469:16;;:2;:16;;;48461:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48539:39;48560:4;48566:2;48570:7;48539:20;:39::i;:::-;48643:29;48660:1;48664:7;48643:8;:29::i;:::-;48704:1;48685:9;:15;48695:4;48685:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;48733:1;48716:9;:13;48726:2;48716:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48764:2;48745:7;:16;48753:7;48745:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48803:7;48799:2;48784:27;;48793:4;48784:27;;;;;;;;;;;;48824:38;48844:4;48850:2;48854:7;48824:19;:38::i;:::-;48245:625;;;:::o;46163:321::-;46293:18;46299:2;46303:7;46293:5;:18::i;:::-;46344:54;46375:1;46379:2;46383:7;46392:5;46344:22;:54::i;:::-;46322:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46163:321;;;:::o;44214:315::-;44371:28;44381:4;44387:2;44391:7;44371:9;:28::i;:::-;44418:48;44441:4;44447:2;44451:7;44460:5;44418:22;:48::i;:::-;44410:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44214:315;;;;:::o;51555:126::-;;;;:::o;52066:125::-;;;;:::o;46820:439::-;46914:1;46900:16;;:2;:16;;;46892:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46973:16;46981:7;46973;:16::i;:::-;46972:17;46964:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47035:45;47064:1;47068:2;47072:7;47035:20;:45::i;:::-;47110:1;47093:9;:13;47103:2;47093:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47141:2;47122:7;:16;47130:7;47122:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47186:7;47182:2;47161:33;;47178:1;47161:33;;;;;;;;;;;;47207:44;47235:1;47239:2;47243:7;47207:19;:44::i;:::-;46820:439;;:::o;50184:799::-;50339:4;50360:15;:2;:13;;;:15::i;:::-;50356:620;;;50412:2;50396:36;;;50433:12;:10;:12::i;:::-;50447:4;50453:7;50462:5;50396:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50392:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50655:1;50638:6;:13;:18;50634:272;;50681:60;;;;;;;;;;:::i;:::-;;;;;;;;50634:272;50856:6;50850:13;50841:6;50837:2;50833:15;50826:38;50392:529;50529:41;;;50519:51;;;:6;:51;;;;50512:58;;;;;50356:620;50960:4;50953:11;;50184:799;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:89::-;11647:7;11687:6;11680:5;11676:18;11665:29;;11611:89;;;:::o;11706:120::-;11778:23;11795:5;11778:23;:::i;:::-;11771:5;11768:34;11758:62;;11816:1;11813;11806:12;11758:62;11706:120;:::o;11832:137::-;11877:5;11915:6;11902:20;11893:29;;11931:32;11957:5;11931:32;:::i;:::-;11832:137;;;;:::o;11975:472::-;12042:6;12050;12099:2;12087:9;12078:7;12074:23;12070:32;12067:119;;;12105:79;;:::i;:::-;12067:119;12225:1;12250:52;12294:7;12285:6;12274:9;12270:22;12250:52;:::i;:::-;12240:62;;12196:116;12351:2;12377:53;12422:7;12413:6;12402:9;12398:22;12377:53;:::i;:::-;12367:63;;12322:118;11975:472;;;;;:::o;12453:474::-;12521:6;12529;12578:2;12566:9;12557:7;12553:23;12549:32;12546:119;;;12584:79;;:::i;:::-;12546:119;12704:1;12729:53;12774:7;12765:6;12754:9;12750:22;12729:53;:::i;:::-;12719:63;;12675:117;12831:2;12857:53;12902:7;12893:6;12882:9;12878:22;12857:53;:::i;:::-;12847:63;;12802:118;12453:474;;;;;:::o;12933:180::-;12981:77;12978:1;12971:88;13078:4;13075:1;13068:15;13102:4;13099:1;13092:15;13119:320;13163:6;13200:1;13194:4;13190:12;13180:22;;13247:1;13241:4;13237:12;13268:18;13258:81;;13324:4;13316:6;13312:17;13302:27;;13258:81;13386:2;13378:6;13375:14;13355:18;13352:38;13349:84;;13405:18;;:::i;:::-;13349:84;13170:269;13119:320;;;:::o;13445:231::-;13585:34;13581:1;13573:6;13569:14;13562:58;13654:14;13649:2;13641:6;13637:15;13630:39;13445:231;:::o;13682:366::-;13824:3;13845:67;13909:2;13904:3;13845:67;:::i;:::-;13838:74;;13921:93;14010:3;13921:93;:::i;:::-;14039:2;14034:3;14030:12;14023:19;;13682:366;;;:::o;14054:419::-;14220:4;14258:2;14247:9;14243:18;14235:26;;14307:9;14301:4;14297:20;14293:1;14282:9;14278:17;14271:47;14335:131;14461:4;14335:131;:::i;:::-;14327:139;;14054:419;;;:::o;14479:220::-;14619:34;14615:1;14607:6;14603:14;14596:58;14688:3;14683:2;14675:6;14671:15;14664:28;14479:220;:::o;14705:366::-;14847:3;14868:67;14932:2;14927:3;14868:67;:::i;:::-;14861:74;;14944:93;15033:3;14944:93;:::i;:::-;15062:2;15057:3;15053:12;15046:19;;14705:366;;;:::o;15077:419::-;15243:4;15281:2;15270:9;15266:18;15258:26;;15330:9;15324:4;15320:20;15316:1;15305:9;15301:17;15294:47;15358:131;15484:4;15358:131;:::i;:::-;15350:139;;15077:419;;;:::o;15502:243::-;15642:34;15638:1;15630:6;15626:14;15619:58;15711:26;15706:2;15698:6;15694:15;15687:51;15502:243;:::o;15751:366::-;15893:3;15914:67;15978:2;15973:3;15914:67;:::i;:::-;15907:74;;15990:93;16079:3;15990:93;:::i;:::-;16108:2;16103:3;16099:12;16092:19;;15751:366;;;:::o;16123:419::-;16289:4;16327:2;16316:9;16312:18;16304:26;;16376:9;16370:4;16366:20;16362:1;16351:9;16347:17;16340:47;16404:131;16530:4;16404:131;:::i;:::-;16396:139;;16123:419;;;:::o;16548:332::-;16669:4;16707:2;16696:9;16692:18;16684:26;;16720:71;16788:1;16777:9;16773:17;16764:6;16720:71;:::i;:::-;16801:72;16869:2;16858:9;16854:18;16845:6;16801:72;:::i;:::-;16548:332;;;;;:::o;16886:137::-;16940:5;16971:6;16965:13;16956:22;;16987:30;17011:5;16987:30;:::i;:::-;16886:137;;;;:::o;17029:345::-;17096:6;17145:2;17133:9;17124:7;17120:23;17116:32;17113:119;;;17151:79;;:::i;:::-;17113:119;17271:1;17296:61;17349:7;17340:6;17329:9;17325:22;17296:61;:::i;:::-;17286:71;;17242:125;17029:345;;;;:::o;17380:182::-;17520:34;17516:1;17508:6;17504:14;17497:58;17380:182;:::o;17568:366::-;17710:3;17731:67;17795:2;17790:3;17731:67;:::i;:::-;17724:74;;17807:93;17896:3;17807:93;:::i;:::-;17925:2;17920:3;17916:12;17909:19;;17568:366;;;:::o;17940:419::-;18106:4;18144:2;18133:9;18129:18;18121:26;;18193:9;18187:4;18183:20;18179:1;18168:9;18164:17;18157:47;18221:131;18347:4;18221:131;:::i;:::-;18213:139;;17940:419;;;:::o;18365:162::-;18505:14;18501:1;18493:6;18489:14;18482:38;18365:162;:::o;18533:366::-;18675:3;18696:67;18760:2;18755:3;18696:67;:::i;:::-;18689:74;;18772:93;18861:3;18772:93;:::i;:::-;18890:2;18885:3;18881:12;18874:19;;18533:366;;;:::o;18905:419::-;19071:4;19109:2;19098:9;19094:18;19086:26;;19158:9;19152:4;19148:20;19144:1;19133:9;19129:17;19122:47;19186:131;19312:4;19186:131;:::i;:::-;19178:139;;18905:419;;;:::o;19330:228::-;19470:34;19466:1;19458:6;19454:14;19447:58;19539:11;19534:2;19526:6;19522:15;19515:36;19330:228;:::o;19564:366::-;19706:3;19727:67;19791:2;19786:3;19727:67;:::i;:::-;19720:74;;19803:93;19892:3;19803:93;:::i;:::-;19921:2;19916:3;19912:12;19905:19;;19564:366;;;:::o;19936:419::-;20102:4;20140:2;20129:9;20125:18;20117:26;;20189:9;20183:4;20179:20;20175:1;20164:9;20160:17;20153:47;20217:131;20343:4;20217:131;:::i;:::-;20209:139;;19936:419;;;:::o;20361:229::-;20501:34;20497:1;20489:6;20485:14;20478:58;20570:12;20565:2;20557:6;20553:15;20546:37;20361:229;:::o;20596:366::-;20738:3;20759:67;20823:2;20818:3;20759:67;:::i;:::-;20752:74;;20835:93;20924:3;20835:93;:::i;:::-;20953:2;20948:3;20944:12;20937:19;;20596:366;;;:::o;20968:419::-;21134:4;21172:2;21161:9;21157:18;21149:26;;21221:9;21215:4;21211:20;21207:1;21196:9;21192:17;21185:47;21249:131;21375:4;21249:131;:::i;:::-;21241:139;;20968:419;;;:::o;21393:169::-;21533:21;21529:1;21521:6;21517:14;21510:45;21393:169;:::o;21568:366::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:419::-;22106:4;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;21940:419;;;:::o;22365:232::-;22505:34;22501:1;22493:6;22489:14;22482:58;22574:15;22569:2;22561:6;22557:15;22550:40;22365:232;:::o;22603:366::-;22745:3;22766:67;22830:2;22825:3;22766:67;:::i;:::-;22759:74;;22842:93;22931:3;22842:93;:::i;:::-;22960:2;22955:3;22951:12;22944:19;;22603:366;;;:::o;22975:419::-;23141:4;23179:2;23168:9;23164:18;23156:26;;23228:9;23222:4;23218:20;23214:1;23203:9;23199:17;23192:47;23256:131;23382:4;23256:131;:::i;:::-;23248:139;;22975:419;;;:::o;23400:180::-;23448:77;23445:1;23438:88;23545:4;23542:1;23535:15;23569:4;23566:1;23559:15;23586:191;23626:3;23645:20;23663:1;23645:20;:::i;:::-;23640:25;;23679:20;23697:1;23679:20;:::i;:::-;23674:25;;23722:1;23719;23715:9;23708:16;;23743:3;23740:1;23737:10;23734:36;;;23750:18;;:::i;:::-;23734:36;23586:191;;;;:::o;23783:182::-;23923:34;23919:1;23911:6;23907:14;23900:58;23783:182;:::o;23971:366::-;24113:3;24134:67;24198:2;24193:3;24134:67;:::i;:::-;24127:74;;24210:93;24299:3;24210:93;:::i;:::-;24328:2;24323:3;24319:12;24312:19;;23971:366;;;:::o;24343:419::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24343:419;;;:::o;24768:171::-;24908:23;24904:1;24896:6;24892:14;24885:47;24768:171;:::o;24945:366::-;25087:3;25108:67;25172:2;25167:3;25108:67;:::i;:::-;25101:74;;25184:93;25273:3;25184:93;:::i;:::-;25302:2;25297:3;25293:12;25286:19;;24945:366;;;:::o;25317:419::-;25483:4;25521:2;25510:9;25506:18;25498:26;;25570:9;25564:4;25560:20;25556:1;25545:9;25541:17;25534:47;25598:131;25724:4;25598:131;:::i;:::-;25590:139;;25317:419;;;:::o;25742:410::-;25782:7;25805:20;25823:1;25805:20;:::i;:::-;25800:25;;25839:20;25857:1;25839:20;:::i;:::-;25834:25;;25894:1;25891;25887:9;25916:30;25934:11;25916:30;:::i;:::-;25905:41;;26095:1;26086:7;26082:15;26079:1;26076:22;26056:1;26049:9;26029:83;26006:139;;26125:18;;:::i;:::-;26006:139;25790:362;25742:410;;;;:::o;26158:169::-;26298:21;26294:1;26286:6;26282:14;26275:45;26158:169;:::o;26333:366::-;26475:3;26496:67;26560:2;26555:3;26496:67;:::i;:::-;26489:74;;26572:93;26661:3;26572:93;:::i;:::-;26690:2;26685:3;26681:12;26674:19;;26333:366;;;:::o;26705:419::-;26871:4;26909:2;26898:9;26894:18;26886:26;;26958:9;26952:4;26948:20;26944:1;26933:9;26929:17;26922:47;26986:131;27112:4;26986:131;:::i;:::-;26978:139;;26705:419;;;:::o;27130:233::-;27169:3;27192:24;27210:5;27192:24;:::i;:::-;27183:33;;27238:66;27231:5;27228:77;27225:103;;27308:18;;:::i;:::-;27225:103;27355:1;27348:5;27344:13;27337:20;;27130:233;;;:::o;27369:141::-;27418:4;27441:3;27433:11;;27464:3;27461:1;27454:14;27498:4;27495:1;27485:18;27477:26;;27369:141;;;:::o;27516:93::-;27553:6;27600:2;27595;27588:5;27584:14;27580:23;27570:33;;27516:93;;;:::o;27615:107::-;27659:8;27709:5;27703:4;27699:16;27678:37;;27615:107;;;;:::o;27728:393::-;27797:6;27847:1;27835:10;27831:18;27870:97;27900:66;27889:9;27870:97;:::i;:::-;27988:39;28018:8;28007:9;27988:39;:::i;:::-;27976:51;;28060:4;28056:9;28049:5;28045:21;28036:30;;28109:4;28099:8;28095:19;28088:5;28085:30;28075:40;;27804:317;;27728:393;;;;;:::o;28127:60::-;28155:3;28176:5;28169:12;;28127:60;;;:::o;28193:142::-;28243:9;28276:53;28294:34;28303:24;28321:5;28303:24;:::i;:::-;28294:34;:::i;:::-;28276:53;:::i;:::-;28263:66;;28193:142;;;:::o;28341:75::-;28384:3;28405:5;28398:12;;28341:75;;;:::o;28422:269::-;28532:39;28563:7;28532:39;:::i;:::-;28593:91;28642:41;28666:16;28642:41;:::i;:::-;28634:6;28627:4;28621:11;28593:91;:::i;:::-;28587:4;28580:105;28498:193;28422:269;;;:::o;28697:73::-;28742:3;28697:73;:::o;28776:189::-;28853:32;;:::i;:::-;28894:65;28952:6;28944;28938:4;28894:65;:::i;:::-;28829:136;28776:189;;:::o;28971:186::-;29031:120;29048:3;29041:5;29038:14;29031:120;;;29102:39;29139:1;29132:5;29102:39;:::i;:::-;29075:1;29068:5;29064:13;29055:22;;29031:120;;;28971:186;;:::o;29163:543::-;29264:2;29259:3;29256:11;29253:446;;;29298:38;29330:5;29298:38;:::i;:::-;29382:29;29400:10;29382:29;:::i;:::-;29372:8;29368:44;29565:2;29553:10;29550:18;29547:49;;;29586:8;29571:23;;29547:49;29609:80;29665:22;29683:3;29665:22;:::i;:::-;29655:8;29651:37;29638:11;29609:80;:::i;:::-;29268:431;;29253:446;29163:543;;;:::o;29712:117::-;29766:8;29816:5;29810:4;29806:16;29785:37;;29712:117;;;;:::o;29835:169::-;29879:6;29912:51;29960:1;29956:6;29948:5;29945:1;29941:13;29912:51;:::i;:::-;29908:56;29993:4;29987;29983:15;29973:25;;29886:118;29835:169;;;;:::o;30009:295::-;30085:4;30231:29;30256:3;30250:4;30231:29;:::i;:::-;30223:37;;30293:3;30290:1;30286:11;30280:4;30277:21;30269:29;;30009:295;;;;:::o;30309:1395::-;30426:37;30459:3;30426:37;:::i;:::-;30528:18;30520:6;30517:30;30514:56;;;30550:18;;:::i;:::-;30514:56;30594:38;30626:4;30620:11;30594:38;:::i;:::-;30679:67;30739:6;30731;30725:4;30679:67;:::i;:::-;30773:1;30797:4;30784:17;;30829:2;30821:6;30818:14;30846:1;30841:618;;;;31503:1;31520:6;31517:77;;;31569:9;31564:3;31560:19;31554:26;31545:35;;31517:77;31620:67;31680:6;31673:5;31620:67;:::i;:::-;31614:4;31607:81;31476:222;30811:887;;30841:618;30893:4;30889:9;30881:6;30877:22;30927:37;30959:4;30927:37;:::i;:::-;30986:1;31000:208;31014:7;31011:1;31008:14;31000:208;;;31093:9;31088:3;31084:19;31078:26;31070:6;31063:42;31144:1;31136:6;31132:14;31122:24;;31191:2;31180:9;31176:18;31163:31;;31037:4;31034:1;31030:12;31025:17;;31000:208;;;31236:6;31227:7;31224:19;31221:179;;;31294:9;31289:3;31285:19;31279:26;31337:48;31379:4;31371:6;31367:17;31356:9;31337:48;:::i;:::-;31329:6;31322:64;31244:156;31221:179;31446:1;31442;31434:6;31430:14;31426:22;31420:4;31413:36;30848:611;;;30811:887;;30401:1303;;;30309:1395;;:::o;31710:234::-;31850:34;31846:1;31838:6;31834:14;31827:58;31919:17;31914:2;31906:6;31902:15;31895:42;31710:234;:::o;31950:366::-;32092:3;32113:67;32177:2;32172:3;32113:67;:::i;:::-;32106:74;;32189:93;32278:3;32189:93;:::i;:::-;32307:2;32302:3;32298:12;32291:19;;31950:366;;;:::o;32322:419::-;32488:4;32526:2;32515:9;32511:18;32503:26;;32575:9;32569:4;32565:20;32561:1;32550:9;32546:17;32539:47;32603:131;32729:4;32603:131;:::i;:::-;32595:139;;32322:419;;;:::o;32747:148::-;32849:11;32886:3;32871:18;;32747:148;;;;:::o;32901:390::-;33007:3;33035:39;33068:5;33035:39;:::i;:::-;33090:89;33172:6;33167:3;33090:89;:::i;:::-;33083:96;;33188:65;33246:6;33241:3;33234:4;33227:5;33223:16;33188:65;:::i;:::-;33278:6;33273:3;33269:16;33262:23;;33011:280;32901:390;;;;:::o;33321:874::-;33424:3;33461:5;33455:12;33490:36;33516:9;33490:36;:::i;:::-;33542:89;33624:6;33619:3;33542:89;:::i;:::-;33535:96;;33662:1;33651:9;33647:17;33678:1;33673:166;;;;33853:1;33848:341;;;;33640:549;;33673:166;33757:4;33753:9;33742;33738:25;33733:3;33726:38;33819:6;33812:14;33805:22;33797:6;33793:35;33788:3;33784:45;33777:52;;33673:166;;33848:341;33915:38;33947:5;33915:38;:::i;:::-;33975:1;33989:154;34003:6;34000:1;33997:13;33989:154;;;34077:7;34071:14;34067:1;34062:3;34058:11;34051:35;34127:1;34118:7;34114:15;34103:26;;34025:4;34022:1;34018:12;34013:17;;33989:154;;;34172:6;34167:3;34163:16;34156:23;;33855:334;;33640:549;;33428:767;;33321:874;;;;:::o;34201:589::-;34426:3;34448:95;34539:3;34530:6;34448:95;:::i;:::-;34441:102;;34560:95;34651:3;34642:6;34560:95;:::i;:::-;34553:102;;34672:92;34760:3;34751:6;34672:92;:::i;:::-;34665:99;;34781:3;34774:10;;34201:589;;;;;;:::o;34796:225::-;34936:34;34932:1;34924:6;34920:14;34913:58;35005:8;35000:2;34992:6;34988:15;34981:33;34796:225;:::o;35027:366::-;35169:3;35190:67;35254:2;35249:3;35190:67;:::i;:::-;35183:74;;35266:93;35355:3;35266:93;:::i;:::-;35384:2;35379:3;35375:12;35368:19;;35027:366;;;:::o;35399:419::-;35565:4;35603:2;35592:9;35588:18;35580:26;;35652:9;35646:4;35642:20;35638:1;35627:9;35623:17;35616:47;35680:131;35806:4;35680:131;:::i;:::-;35672:139;;35399:419;;;:::o;35824:236::-;35964:34;35960:1;35952:6;35948:14;35941:58;36033:19;36028:2;36020:6;36016:15;36009:44;35824:236;:::o;36066:366::-;36208:3;36229:67;36293:2;36288:3;36229:67;:::i;:::-;36222:74;;36305:93;36394:3;36305:93;:::i;:::-;36423:2;36418:3;36414:12;36407:19;;36066:366;;;:::o;36438:419::-;36604:4;36642:2;36631:9;36627:18;36619:26;;36691:9;36685:4;36681:20;36677:1;36666:9;36662:17;36655:47;36719:131;36845:4;36719:131;:::i;:::-;36711:139;;36438:419;;;:::o;36863:175::-;37003:27;36999:1;36991:6;36987:14;36980:51;36863:175;:::o;37044:366::-;37186:3;37207:67;37271:2;37266:3;37207:67;:::i;:::-;37200:74;;37283:93;37372:3;37283:93;:::i;:::-;37401:2;37396:3;37392:12;37385:19;;37044:366;;;:::o;37416:419::-;37582:4;37620:2;37609:9;37605:18;37597:26;;37669:9;37663:4;37659:20;37655:1;37644:9;37640:17;37633:47;37697:131;37823:4;37697:131;:::i;:::-;37689:139;;37416:419;;;:::o;37841:180::-;37889:77;37886:1;37879:88;37986:4;37983:1;37976:15;38010:4;38007:1;38000:15;38027:185;38067:1;38084:20;38102:1;38084:20;:::i;:::-;38079:25;;38118:20;38136:1;38118:20;:::i;:::-;38113:25;;38157:1;38147:35;;38162:18;;:::i;:::-;38147:35;38204:1;38201;38197:9;38192:14;;38027:185;;;;:::o;38218:194::-;38258:4;38278:20;38296:1;38278:20;:::i;:::-;38273:25;;38312:20;38330:1;38312:20;:::i;:::-;38307:25;;38356:1;38353;38349:9;38341:17;;38380:1;38374:4;38371:11;38368:37;;;38385:18;;:::i;:::-;38368:37;38218:194;;;;:::o;38418:176::-;38450:1;38467:20;38485:1;38467:20;:::i;:::-;38462:25;;38501:20;38519:1;38501:20;:::i;:::-;38496:25;;38540:1;38530:35;;38545:18;;:::i;:::-;38530:35;38586:1;38583;38579:9;38574:14;;38418:176;;;;:::o;38600:180::-;38648:77;38645:1;38638:88;38745:4;38742:1;38735:15;38769:4;38766:1;38759:15;38786:231;38926:34;38922:1;38914:6;38910:14;38903:58;38995:14;38990:2;38982:6;38978:15;38971:39;38786:231;:::o;39023:366::-;39165:3;39186:67;39250:2;39245:3;39186:67;:::i;:::-;39179:74;;39262:93;39351:3;39262:93;:::i;:::-;39380:2;39375:3;39371:12;39364:19;;39023:366;;;:::o;39395:419::-;39561:4;39599:2;39588:9;39584:18;39576:26;;39648:9;39642:4;39638:20;39634:1;39623:9;39619:17;39612:47;39676:131;39802:4;39676:131;:::i;:::-;39668:139;;39395:419;;;:::o;39820:224::-;39960:34;39956:1;39948:6;39944:14;39937:58;40029:7;40024:2;40016:6;40012:15;40005:32;39820:224;:::o;40050:366::-;40192:3;40213:67;40277:2;40272:3;40213:67;:::i;:::-;40206:74;;40289:93;40378:3;40289:93;:::i;:::-;40407:2;40402:3;40398:12;40391:19;;40050:366;;;:::o;40422:419::-;40588:4;40626:2;40615:9;40611:18;40603:26;;40675:9;40669:4;40665:20;40661:1;40650:9;40646:17;40639:47;40703:131;40829:4;40703:131;:::i;:::-;40695:139;;40422:419;;;:::o;40847:223::-;40987:34;40983:1;40975:6;40971:14;40964:58;41056:6;41051:2;41043:6;41039:15;41032:31;40847:223;:::o;41076:366::-;41218:3;41239:67;41303:2;41298:3;41239:67;:::i;:::-;41232:74;;41315:93;41404:3;41315:93;:::i;:::-;41433:2;41428:3;41424:12;41417:19;;41076:366;;;:::o;41448:419::-;41614:4;41652:2;41641:9;41637:18;41629:26;;41701:9;41695:4;41691:20;41687:1;41676:9;41672:17;41665:47;41729:131;41855:4;41729:131;:::i;:::-;41721:139;;41448:419;;;:::o;41873:237::-;42013:34;42009:1;42001:6;41997:14;41990:58;42082:20;42077:2;42069:6;42065:15;42058:45;41873:237;:::o;42116:366::-;42258:3;42279:67;42343:2;42338:3;42279:67;:::i;:::-;42272:74;;42355:93;42444:3;42355:93;:::i;:::-;42473:2;42468:3;42464:12;42457:19;;42116:366;;;:::o;42488:419::-;42654:4;42692:2;42681:9;42677:18;42669:26;;42741:9;42735:4;42731:20;42727:1;42716:9;42712:17;42705:47;42769:131;42895:4;42769:131;:::i;:::-;42761:139;;42488:419;;;:::o;42913:182::-;43053:34;43049:1;43041:6;43037:14;43030:58;42913:182;:::o;43101:366::-;43243:3;43264:67;43328:2;43323:3;43264:67;:::i;:::-;43257:74;;43340:93;43429:3;43340:93;:::i;:::-;43458:2;43453:3;43449:12;43442:19;;43101:366;;;:::o;43473:419::-;43639:4;43677:2;43666:9;43662:18;43654:26;;43726:9;43720:4;43716:20;43712:1;43701:9;43697:17;43690:47;43754:131;43880:4;43754:131;:::i;:::-;43746:139;;43473:419;;;:::o;43898:178::-;44038:30;44034:1;44026:6;44022:14;44015:54;43898:178;:::o;44082:366::-;44224:3;44245:67;44309:2;44304:3;44245:67;:::i;:::-;44238:74;;44321:93;44410:3;44321:93;:::i;:::-;44439:2;44434:3;44430:12;44423:19;;44082:366;;;:::o;44454:419::-;44620:4;44658:2;44647:9;44643:18;44635:26;;44707:9;44701:4;44697:20;44693:1;44682:9;44678:17;44671:47;44735:131;44861:4;44735:131;:::i;:::-;44727:139;;44454:419;;;:::o;44879:98::-;44930:6;44964:5;44958:12;44948:22;;44879:98;;;:::o;44983:168::-;45066:11;45100:6;45095:3;45088:19;45140:4;45135:3;45131:14;45116:29;;44983:168;;;;:::o;45157:373::-;45243:3;45271:38;45303:5;45271:38;:::i;:::-;45325:70;45388:6;45383:3;45325:70;:::i;:::-;45318:77;;45404:65;45462:6;45457:3;45450:4;45443:5;45439:16;45404:65;:::i;:::-;45494:29;45516:6;45494:29;:::i;:::-;45489:3;45485:39;45478:46;;45247:283;45157:373;;;;:::o;45536:640::-;45731:4;45769:3;45758:9;45754:19;45746:27;;45783:71;45851:1;45840:9;45836:17;45827:6;45783:71;:::i;:::-;45864:72;45932:2;45921:9;45917:18;45908:6;45864:72;:::i;:::-;45946;46014:2;46003:9;45999:18;45990:6;45946:72;:::i;:::-;46065:9;46059:4;46055:20;46050:2;46039:9;46035:18;46028:48;46093:76;46164:4;46155:6;46093:76;:::i;:::-;46085:84;;45536:640;;;;;;;:::o;46182:141::-;46238:5;46269:6;46263:13;46254:22;;46285:32;46311:5;46285:32;:::i;:::-;46182:141;;;;:::o;46329:349::-;46398:6;46447:2;46435:9;46426:7;46422:23;46418:32;46415:119;;;46453:79;;:::i;:::-;46415:119;46573:1;46598:63;46653:7;46644:6;46633:9;46629:22;46598:63;:::i;:::-;46588:73;;46544:127;46329:349;;;;:::o

Swarm Source

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