Token COTC2Serum

 

Overview ERC-721

Total Supply:
4,000 COTC2Serum

Holders:
256 addresses
Balance
0 COTC2Serum
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Serums

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// 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/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/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.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 overriden 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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/COTC2SERUM.sol

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









contract Serums is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    Ownable,
    Pausable
{
    modifier onlyDevs() {
        require(
            msg.sender == primaryDevAddress ||
                msg.sender == secondaryDevAddress ||
                msg.sender == tertiaryDevAddress ||
                msg.sender == quaternaryDevAddress ||
                msg.sender == quinaryDevAddress ||
                msg.sender == senaryDevAddress ||
                msg.sender == septenaryDevAddress,
            "Dev Only: caller is not the developer"
        );
        _;
    }

    using Counters for Counters.Counter;
    using SafeMath for uint256;
    using Strings for uint256;

    Counters.Counter private _tokenIds;

    address public primaryDevAddress =
        0x3acDC09A3C4Fc659BfDA7CFE8e6B04237d751e18;
    address public secondaryDevAddress =
        0x982D9A2E8D487C698B29E72701068A5Ac207e139;
    address public tertiaryDevAddress =
        0xf60B7751B3227B4a34477aB144358d44f21d6fc0;
    address public quaternaryDevAddress =
        0x88b09fcF98b80448b96A5a546c86e30454361b41;
    address public quinaryDevAddress =
        0xF2500793A561EB15B7D301f82eeBe56752B2186B;
    address public senaryDevAddress =
        0xA6e950aa70EBaAf99686A5d95aFe8aca8B5E353B;
    address public septenaryDevAddress =
        0xA6F29Ab1Bf8c731Bc99E5CBacDF4F46409BABa49;

    uint256 public primaryDevFee = 1400;
    uint256 public secondaryDevFee = 1400;
    uint256 public tertiaryDevFee = 1400;
    uint256 public quaternaryDevFee = 2000;
    uint256 public quinaryDevFee = 2000;
    uint256 public senaryDevFee = 900;
    uint256 public septenaryDevFee = 800;

    string public baseURI;

    uint256 public maxSupply = 4000;
    uint256 public price = 20 ether;

    address private mutationContract;

    mapping(address => uint256) public devFees;

    constructor() ERC721("COTC2Serum", "COTC2Serum") {
        baseURI = "ipfs://QmRicifSi6rzi69tjV5sJuDntrWHh49X2tFLAzvMfP4cb8/";
        _pause();
    }

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

    function splitFees(uint256 sentAmount) internal {
        uint256 primaryDevFeeAmount = sentAmount.mul(primaryDevFee).div(10000);
        uint256 secondaryDevFeeAmount = sentAmount.mul(secondaryDevFee).div(
            10000
        );
        uint256 tertiaryDevFeeAmount = sentAmount.mul(tertiaryDevFee).div(
            10000
        );
        uint256 quaternaryDevFeeAmount = sentAmount.mul(quaternaryDevFee).div(
            10000
        );
        uint256 quinaryDevFeeAmount = sentAmount.mul(quinaryDevFee).div(10000);

        devFees[primaryDevAddress] += primaryDevFeeAmount;
        devFees[secondaryDevAddress] += secondaryDevFeeAmount;
        devFees[tertiaryDevAddress] += tertiaryDevFeeAmount;
        devFees[quaternaryDevAddress] += quaternaryDevFeeAmount;
        devFees[quinaryDevAddress] += quinaryDevFeeAmount;
    }

    function mint(uint256 amount) public payable whenNotPaused {
        require(msg.value == price * amount, "Invalid amount");
        splitFees(msg.value);

        for (uint256 i = 0; i < amount; i++) {
            internalMint(msg.sender);
        }
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function internalMint(address to) internal {
        require(totalSupply() < maxSupply, "All Serums have been minted!");
        _safeMint(to, _tokenIds.current());
        _tokenIds.increment();
    }

    function airdropsSerum(address[] memory _addr, uint256 amount) public onlyOwner {
        for (uint256 i = 0; i < _addr.length; i++) {
            airdropSerumInternal(amount,_addr[i]);
        }
    }
    
    function airdropSerumInternal(uint256 amount, address _addr) internal {
        for (uint256 i = 0; i < amount; i++) {
            internalMint(_addr);
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function burnSerumForAddress(uint256 burnTokenId)
        external
    {
        require(msg.sender == mutationContract, "Invalid burner address");
        _burn(burnTokenId);
    }

    function setMutationContractAddress(address mutationContractAddress)
        external
        onlyOwner
    {
        mutationContract = mutationContractAddress;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        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))
                : "";
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function withdraw() public onlyDevs {
        uint256 amount = devFees[msg.sender];
        require(amount > 0, "No Fees:(");
        payable(msg.sender).transfer(amount);
        devFees[msg.sender] = 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropsSerum","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnTokenId","type":"uint256"}],"name":"burnSerumForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quaternaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quaternaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quinaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quinaryDevFee","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":[],"name":"secondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"senaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"senaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"septenaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"septenaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mutationContractAddress","type":"address"}],"name":"setMutationContractAddress","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":[],"name":"tertiaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tertiaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052733acdc09a3c4fc659bfda7cfe8e6b04237d751e18600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073982d9a2e8d487c698b29e72701068a5ac207e139600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f60b7751b3227b4a34477ab144358d44f21d6fc0600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507388b09fcf98b80448b96a5a546c86e30454361b41601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f2500793a561eb15b7d301f82eebe56752b2186b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a6e950aa70ebaaf99686a5d95afe8aca8b5e353b601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a6f29ab1bf8c731bc99e5cbacdf4f46409baba49601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506105786014556105786015556105786016556107d06017556107d0601855610384601955610320601a55610fa0601c556801158e460913d00000601d55348015620002a157600080fd5b506040518060400160405280600a81526020017f434f544332536572756d000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f434f544332536572756d0000000000000000000000000000000000000000000081525081600090805190602001906200032692919062000562565b5080600190805190602001906200033f92919062000562565b5050506200036262000356620003c560201b60201c565b620003cd60201b60201c565b6000600b60146101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200576760369139601b9080519060200190620003ae92919062000562565b50620003bf6200049360201b60201c565b6200075c565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004a36200054b60201b60201c565b15620004e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004dd9062000673565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000532620003c560201b60201c565b604051620005419190620006da565b60405180910390a1565b6000600b60149054906101000a900460ff16905090565b828054620005709062000726565b90600052602060002090601f016020900481019282620005945760008555620005e0565b82601f10620005af57805160ff1916838001178555620005e0565b82800160010185558215620005e0579182015b82811115620005df578251825591602001919060010190620005c2565b5b509050620005ef9190620005f3565b5090565b5b808211156200060e576000816000905550600101620005f4565b5090565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006200065b60108362000612565b9150620006688262000623565b602082019050919050565b600060208201905081810360008301526200068e816200064c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006c28262000695565b9050919050565b620006d481620006b5565b82525050565b6000602082019050620006f16000830184620006c9565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073f57607f821691505b60208210811415620007565762000755620006f7565b5b50919050565b614ffb806200076c6000396000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063a64e0015116100c1578063d51980d01161007a578063d51980d014610947578063d5abeb0114610972578063e985e9c51461099d578063f147efeb146109da578063f2fde38b14610a17578063f38cc11114610a405761027d565b8063a64e001514610835578063a879b63214610860578063a9a45f3a1461088b578063b88d4fde146108b6578063c87b56dd146108df578063cdaa2a431461091c5761027d565b80638da5cb5b116101135780638da5cb5b1461074457806395d89b411461076f5780639a41ded81461079a578063a035b1fe146107c5578063a0712d68146107f0578063a22cb4651461080c5761027d565b80636352211e146106715780636c0360eb146106ae57806370a08231146106d9578063715018a6146107165780638456cb591461072d5761027d565b80632e4a15ce116101f357806342842e0e116101ac57806342842e0e1461056157806349325c951461058a578063496bc29e146105b55780634f6ccce7146105e057806355f804b31461061d5780635c975abb146106465761027d565b80632e4a15ce146104775780632f745c59146104a0578063355e8194146104dd57806337648cbb146105085780633ccfd60b146105335780633f4ba83a1461054a5761027d565b80630a78e9a5116102455780630a78e9a51461037b57806318160ddd146103a65780631f5bfd11146103d15780632116612f146103fa57806323b872dd14610423578063281037701461044c5761027d565b806301ffc9a71461028257806304dd3bb4146102bf57806306fdde03146102ea578063081812fc14610315578063095ea7b314610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906137e9565b610a6b565b6040516102b69190613831565b60405180910390f35b3480156102cb57600080fd5b506102d4610a7d565b6040516102e19190613865565b60405180910390f35b3480156102f657600080fd5b506102ff610a83565b60405161030c9190613919565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613967565b610b15565b60405161034991906139d5565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190613a1c565b610b9a565b005b34801561038757600080fd5b50610390610cb2565b60405161039d9190613865565b60405180910390f35b3480156103b257600080fd5b506103bb610cb8565b6040516103c89190613865565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613a5c565b610cc5565b005b34801561040657600080fd5b50610421600480360381019061041c9190613bd1565b610d85565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613c2d565b610e49565b005b34801561045857600080fd5b50610461610ea9565b60405161046e91906139d5565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613967565b610ecf565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613a1c565b610f6b565b6040516104d49190613865565b60405180910390f35b3480156104e957600080fd5b506104f2611010565b6040516104ff9190613865565b60405180910390f35b34801561051457600080fd5b5061051d611016565b60405161052a91906139d5565b60405180910390f35b34801561053f57600080fd5b5061054861103c565b005b34801561055657600080fd5b5061055f6113f2565b005b34801561056d57600080fd5b5061058860048036038101906105839190613c2d565b611478565b005b34801561059657600080fd5b5061059f611498565b6040516105ac9190613865565b60405180910390f35b3480156105c157600080fd5b506105ca61149e565b6040516105d791906139d5565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190613967565b6114c4565b6040516106149190613865565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190613d35565b611535565b005b34801561065257600080fd5b5061065b6115cb565b6040516106689190613831565b60405180910390f35b34801561067d57600080fd5b5061069860048036038101906106939190613967565b6115e2565b6040516106a591906139d5565b60405180910390f35b3480156106ba57600080fd5b506106c3611694565b6040516106d09190613919565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190613a5c565b611722565b60405161070d9190613865565b60405180910390f35b34801561072257600080fd5b5061072b6117da565b005b34801561073957600080fd5b50610742611862565b005b34801561075057600080fd5b506107596118e8565b60405161076691906139d5565b60405180910390f35b34801561077b57600080fd5b50610784611912565b6040516107919190613919565b60405180910390f35b3480156107a657600080fd5b506107af6119a4565b6040516107bc91906139d5565b60405180910390f35b3480156107d157600080fd5b506107da6119ca565b6040516107e79190613865565b60405180910390f35b61080a60048036038101906108059190613967565b6119d0565b005b34801561081857600080fd5b50610833600480360381019061082e9190613daa565b611a9b565b005b34801561084157600080fd5b5061084a611ab1565b6040516108579190613865565b60405180910390f35b34801561086c57600080fd5b50610875611ab7565b60405161088291906139d5565b60405180910390f35b34801561089757600080fd5b506108a0611add565b6040516108ad91906139d5565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613e8b565b611b03565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613967565b611b65565b6040516109139190613919565b60405180910390f35b34801561092857600080fd5b50610931611c02565b60405161093e9190613865565b60405180910390f35b34801561095357600080fd5b5061095c611c08565b6040516109699190613865565b60405180910390f35b34801561097e57600080fd5b50610987611c0e565b6040516109949190613865565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf9190613f0e565b611c14565b6040516109d19190613831565b60405180910390f35b3480156109e657600080fd5b50610a0160048036038101906109fc9190613a5c565b611ca8565b604051610a0e9190613865565b60405180910390f35b348015610a2357600080fd5b50610a3e6004803603810190610a399190613a5c565b611cc0565b005b348015610a4c57600080fd5b50610a55611db8565b604051610a6291906139d5565b60405180910390f35b6000610a7682611dde565b9050919050565b60165481565b606060008054610a9290613f7d565b80601f0160208091040260200160405190810160405280929190818152602001828054610abe90613f7d565b8015610b0b5780601f10610ae057610100808354040283529160200191610b0b565b820191906000526020600020905b815481529060010190602001808311610aee57829003601f168201915b5050505050905090565b6000610b2082611e58565b610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5690614021565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba5826115e2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d906140b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c35611ec4565b73ffffffffffffffffffffffffffffffffffffffff161480610c645750610c6381610c5e611ec4565b611c14565b5b610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90614145565b60405180910390fd5b610cad8383611ecc565b505050565b601a5481565b6000600880549050905090565b610ccd611ec4565b73ffffffffffffffffffffffffffffffffffffffff16610ceb6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d38906141b1565b60405180910390fd5b80601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d8d611ec4565b73ffffffffffffffffffffffffffffffffffffffff16610dab6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df8906141b1565b60405180910390fd5b60005b8251811015610e4457610e3182848381518110610e2457610e236141d1565b5b6020026020010151611f85565b8080610e3c9061422f565b915050610e04565b505050565b610e5a610e54611ec4565b82611fb1565b610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e90906142ea565b60405180910390fd5b610ea483838361208f565b505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690614356565b60405180910390fd5b610f68816122f6565b50565b6000610f7683611722565b8210610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae906143e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60175481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110e55750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061113d5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111955750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111ed5750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806112455750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061129d5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d39061447a565b60405180910390fd5b6000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906144e6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113a9573d6000803e3d6000fd5b506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6113fa611ec4565b73ffffffffffffffffffffffffffffffffffffffff166114186118e8565b73ffffffffffffffffffffffffffffffffffffffff161461146e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611465906141b1565b60405180910390fd5b611476612302565b565b61149383838360405180602001604052806000815250611b03565b505050565b60195481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006114ce610cb8565b821061150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690614578565b60405180910390fd5b60088281548110611523576115226141d1565b5b90600052602060002001549050919050565b61153d611ec4565b73ffffffffffffffffffffffffffffffffffffffff1661155b6118e8565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a8906141b1565b60405180910390fd5b80601b90805190602001906115c792919061369a565b5050565b6000600b60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116829061460a565b60405180910390fd5b80915050919050565b601b80546116a190613f7d565b80601f01602080910402602001604051908101604052809291908181526020018280546116cd90613f7d565b801561171a5780601f106116ef5761010080835404028352916020019161171a565b820191906000526020600020905b8154815290600101906020018083116116fd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a9061469c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e2611ec4565b73ffffffffffffffffffffffffffffffffffffffff166118006118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d906141b1565b60405180910390fd5b61186060006123a4565b565b61186a611ec4565b73ffffffffffffffffffffffffffffffffffffffff166118886118e8565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d5906141b1565b60405180910390fd5b6118e661246a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461192190613f7d565b80601f016020809104026020016040519081016040528092919081815260200182805461194d90613f7d565b801561199a5780601f1061196f5761010080835404028352916020019161199a565b820191906000526020600020905b81548152906001019060200180831161197d57829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d5481565b6119d86115cb565b15611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90614708565b60405180910390fd5b80601d54611a269190614728565b3414611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e906147ce565b60405180910390fd5b611a703461250d565b60005b81811015611a9757611a843361284e565b8080611a8f9061422f565b915050611a73565b5050565b611aad611aa6611ec4565b83836128b9565b5050565b60155481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b14611b0e611ec4565b83611fb1565b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906142ea565b60405180910390fd5b611b5f84848484612a26565b50505050565b6060611b7082611e58565b611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690614860565b60405180910390fd5b6000611bb9612a82565b90506000815111611bd95760405180602001604052806000815250611bfa565b80604051602001611bea91906148bc565b6040516020818303038152906040525b915050919050565b60145481565b60185481565b601c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601f6020528060005260406000206000915090505481565b611cc8611ec4565b73ffffffffffffffffffffffffffffffffffffffff16611ce66118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d33906141b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390614945565b60405180910390fd5b611db5816123a4565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e515750611e5082612b14565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f3f836115e2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b82811015611fac57611f998261284e565b8080611fa49061422f565b915050611f88565b505050565b6000611fbc82611e58565b611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff2906149d7565b60405180910390fd5b6000612006836115e2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061207557508373ffffffffffffffffffffffffffffffffffffffff1661205d84610b15565b73ffffffffffffffffffffffffffffffffffffffff16145b8061208657506120858185611c14565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120af826115e2565b73ffffffffffffffffffffffffffffffffffffffff1614612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90614a69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90614afb565b60405180910390fd5b612180838383612bf6565b61218b600082611ecc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121db9190614b1b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122329190614b4f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f1838383612c4e565b505050565b6122ff81612c53565b50565b61230a6115cb565b612349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234090614bf1565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61238d611ec4565b60405161239a91906139d5565b60405180910390a1565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124726115cb565b156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a990614708565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124f6611ec4565b60405161250391906139d5565b60405180910390a1565b600061253861271061252a60145485612ca690919063ffffffff16565b612cbc90919063ffffffff16565b9050600061256561271061255760155486612ca690919063ffffffff16565b612cbc90919063ffffffff16565b9050600061259261271061258460165487612ca690919063ffffffff16565b612cbc90919063ffffffff16565b905060006125bf6127106125b160175488612ca690919063ffffffff16565b612cbc90919063ffffffff16565b905060006125ec6127106125de60185489612ca690919063ffffffff16565b612cbc90919063ffffffff16565b905084601f6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265f9190614b4f565b9250508190555083601f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d79190614b4f565b9250508190555082601f6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274f9190614b4f565b9250508190555081601f6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c79190614b4f565b9250508190555080601f6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283f9190614b4f565b92505081905550505050505050565b601c54612859610cb8565b10612899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289090614c5d565b60405180910390fd5b6128ac816128a7600c612cd2565b612ce0565b6128b6600c612cfe565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291f90614cc9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a199190613831565b60405180910390a3505050565b612a3184848461208f565b612a3d84848484612d14565b612a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7390614d5b565b60405180910390fd5b50505050565b6060601b8054612a9190613f7d565b80601f0160208091040260200160405190810160405280929190818152602001828054612abd90613f7d565b8015612b0a5780601f10612adf57610100808354040283529160200191612b0a565b820191906000526020600020905b815481529060010190602001808311612aed57829003601f168201915b5050505050905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bdf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bef5750612bee82612e9c565b5b9050919050565b612bfe6115cb565b15612c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3590614708565b60405180910390fd5b612c49838383612f06565b505050565b505050565b612c5c8161301a565b6000600a60008381526020019081526020016000208054612c7c90613f7d565b905014612ca357600a60008281526020019081526020016000206000612ca29190613720565b5b50565b60008183612cb49190614728565b905092915050565b60008183612cca9190614daa565b905092915050565b600081600001549050919050565b612cfa828260405180602001604052806000815250613137565b5050565b6001816000016000828254019250508190555050565b6000612d358473ffffffffffffffffffffffffffffffffffffffff16613192565b15612e8f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d5e611ec4565b8786866040518563ffffffff1660e01b8152600401612d809493929190614e30565b6020604051808303816000875af1925050508015612dbc57506040513d601f19601f82011682018060405250810190612db99190614e91565b60015b612e3f573d8060008114612dec576040519150601f19603f3d011682016040523d82523d6000602084013e612df1565b606091505b50600081511415612e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2e90614d5b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e94565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f118383836131b5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f5457612f4f816131ba565b612f93565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f9257612f918382613203565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fd657612fd181613370565b613015565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613014576130138282613441565b5b5b505050565b6000613025826115e2565b905061303381600084612bf6565b61303e600083611ecc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461308e9190614b1b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461313381600084612c4e565b5050565b61314183836134c0565b61314e6000848484612d14565b61318d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318490614d5b565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161321084611722565b61321a9190614b1b565b90506000600760008481526020019081526020016000205490508181146132ff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133849190614b1b565b90506000600960008481526020019081526020016000205490506000600883815481106133b4576133b36141d1565b5b9060005260206000200154905080600883815481106133d6576133d56141d1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061342557613424614ebe565b5b6001900381819060005260206000200160009055905550505050565b600061344c83611722565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352790614f39565b60405180910390fd5b61353981611e58565b15613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357090614fa5565b60405180910390fd5b61358560008383612bf6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135d59190614b4f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461369660008383612c4e565b5050565b8280546136a690613f7d565b90600052602060002090601f0160209004810192826136c8576000855561370f565b82601f106136e157805160ff191683800117855561370f565b8280016001018555821561370f579182015b8281111561370e5782518255916020019190600101906136f3565b5b50905061371c9190613760565b5090565b50805461372c90613f7d565b6000825580601f1061373e575061375d565b601f01602090049060005260206000209081019061375c9190613760565b5b50565b5b80821115613779576000816000905550600101613761565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137c681613791565b81146137d157600080fd5b50565b6000813590506137e3816137bd565b92915050565b6000602082840312156137ff576137fe613787565b5b600061380d848285016137d4565b91505092915050565b60008115159050919050565b61382b81613816565b82525050565b60006020820190506138466000830184613822565b92915050565b6000819050919050565b61385f8161384c565b82525050565b600060208201905061387a6000830184613856565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138ba57808201518184015260208101905061389f565b838111156138c9576000848401525b50505050565b6000601f19601f8301169050919050565b60006138eb82613880565b6138f5818561388b565b935061390581856020860161389c565b61390e816138cf565b840191505092915050565b6000602082019050818103600083015261393381846138e0565b905092915050565b6139448161384c565b811461394f57600080fd5b50565b6000813590506139618161393b565b92915050565b60006020828403121561397d5761397c613787565b5b600061398b84828501613952565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139bf82613994565b9050919050565b6139cf816139b4565b82525050565b60006020820190506139ea60008301846139c6565b92915050565b6139f9816139b4565b8114613a0457600080fd5b50565b600081359050613a16816139f0565b92915050565b60008060408385031215613a3357613a32613787565b5b6000613a4185828601613a07565b9250506020613a5285828601613952565b9150509250929050565b600060208284031215613a7257613a71613787565b5b6000613a8084828501613a07565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ac6826138cf565b810181811067ffffffffffffffff82111715613ae557613ae4613a8e565b5b80604052505050565b6000613af861377d565b9050613b048282613abd565b919050565b600067ffffffffffffffff821115613b2457613b23613a8e565b5b602082029050602081019050919050565b600080fd5b6000613b4d613b4884613b09565b613aee565b90508083825260208201905060208402830185811115613b7057613b6f613b35565b5b835b81811015613b995780613b858882613a07565b845260208401935050602081019050613b72565b5050509392505050565b600082601f830112613bb857613bb7613a89565b5b8135613bc8848260208601613b3a565b91505092915050565b60008060408385031215613be857613be7613787565b5b600083013567ffffffffffffffff811115613c0657613c0561378c565b5b613c1285828601613ba3565b9250506020613c2385828601613952565b9150509250929050565b600080600060608486031215613c4657613c45613787565b5b6000613c5486828701613a07565b9350506020613c6586828701613a07565b9250506040613c7686828701613952565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613ca057613c9f613a8e565b5b613ca9826138cf565b9050602081019050919050565b82818337600083830152505050565b6000613cd8613cd384613c85565b613aee565b905082815260208101848484011115613cf457613cf3613c80565b5b613cff848285613cb6565b509392505050565b600082601f830112613d1c57613d1b613a89565b5b8135613d2c848260208601613cc5565b91505092915050565b600060208284031215613d4b57613d4a613787565b5b600082013567ffffffffffffffff811115613d6957613d6861378c565b5b613d7584828501613d07565b91505092915050565b613d8781613816565b8114613d9257600080fd5b50565b600081359050613da481613d7e565b92915050565b60008060408385031215613dc157613dc0613787565b5b6000613dcf85828601613a07565b9250506020613de085828601613d95565b9150509250929050565b600067ffffffffffffffff821115613e0557613e04613a8e565b5b613e0e826138cf565b9050602081019050919050565b6000613e2e613e2984613dea565b613aee565b905082815260208101848484011115613e4a57613e49613c80565b5b613e55848285613cb6565b509392505050565b600082601f830112613e7257613e71613a89565b5b8135613e82848260208601613e1b565b91505092915050565b60008060008060808587031215613ea557613ea4613787565b5b6000613eb387828801613a07565b9450506020613ec487828801613a07565b9350506040613ed587828801613952565b925050606085013567ffffffffffffffff811115613ef657613ef561378c565b5b613f0287828801613e5d565b91505092959194509250565b60008060408385031215613f2557613f24613787565b5b6000613f3385828601613a07565b9250506020613f4485828601613a07565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9557607f821691505b60208210811415613fa957613fa8613f4e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061400b602c8361388b565b915061401682613faf565b604082019050919050565b6000602082019050818103600083015261403a81613ffe565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061409d60218361388b565b91506140a882614041565b604082019050919050565b600060208201905081810360008301526140cc81614090565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061412f60388361388b565b915061413a826140d3565b604082019050919050565b6000602082019050818103600083015261415e81614122565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061419b60208361388b565b91506141a682614165565b602082019050919050565b600060208201905081810360008301526141ca8161418e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061423a8261384c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561426d5761426c614200565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006142d460318361388b565b91506142df82614278565b604082019050919050565b60006020820190508181036000830152614303816142c7565b9050919050565b7f496e76616c6964206275726e6572206164647265737300000000000000000000600082015250565b600061434060168361388b565b915061434b8261430a565b602082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006143d2602b8361388b565b91506143dd82614376565b604082019050919050565b60006020820190508181036000830152614401816143c5565b9050919050565b7f446576204f6e6c793a2063616c6c6572206973206e6f7420746865206465766560008201527f6c6f706572000000000000000000000000000000000000000000000000000000602082015250565b600061446460258361388b565b915061446f82614408565b604082019050919050565b6000602082019050818103600083015261449381614457565b9050919050565b7f4e6f20466565733a280000000000000000000000000000000000000000000000600082015250565b60006144d060098361388b565b91506144db8261449a565b602082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614562602c8361388b565b915061456d82614506565b604082019050919050565b6000602082019050818103600083015261459181614555565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145f460298361388b565b91506145ff82614598565b604082019050919050565b60006020820190508181036000830152614623816145e7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614686602a8361388b565b91506146918261462a565b604082019050919050565b600060208201905081810360008301526146b581614679565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006146f260108361388b565b91506146fd826146bc565b602082019050919050565b60006020820190508181036000830152614721816146e5565b9050919050565b60006147338261384c565b915061473e8361384c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561477757614776614200565b5b828202905092915050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006147b8600e8361388b565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061484a602f8361388b565b9150614855826147ee565b604082019050919050565b600060208201905081810360008301526148798161483d565b9050919050565b600081905092915050565b600061489682613880565b6148a08185614880565b93506148b081856020860161389c565b80840191505092915050565b60006148c8828461488b565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061492f60268361388b565b915061493a826148d3565b604082019050919050565b6000602082019050818103600083015261495e81614922565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006149c1602c8361388b565b91506149cc82614965565b604082019050919050565b600060208201905081810360008301526149f0816149b4565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614a5360258361388b565b9150614a5e826149f7565b604082019050919050565b60006020820190508181036000830152614a8281614a46565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ae560248361388b565b9150614af082614a89565b604082019050919050565b60006020820190508181036000830152614b1481614ad8565b9050919050565b6000614b268261384c565b9150614b318361384c565b925082821015614b4457614b43614200565b5b828203905092915050565b6000614b5a8261384c565b9150614b658361384c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b9a57614b99614200565b5b828201905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614bdb60148361388b565b9150614be682614ba5565b602082019050919050565b60006020820190508181036000830152614c0a81614bce565b9050919050565b7f416c6c20536572756d732068617665206265656e206d696e7465642100000000600082015250565b6000614c47601c8361388b565b9150614c5282614c11565b602082019050919050565b60006020820190508181036000830152614c7681614c3a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614cb360198361388b565b9150614cbe82614c7d565b602082019050919050565b60006020820190508181036000830152614ce281614ca6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d4560328361388b565b9150614d5082614ce9565b604082019050919050565b60006020820190508181036000830152614d7481614d38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614db58261384c565b9150614dc08361384c565b925082614dd057614dcf614d7b565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b6000614e0282614ddb565b614e0c8185614de6565b9350614e1c81856020860161389c565b614e25816138cf565b840191505092915050565b6000608082019050614e4560008301876139c6565b614e5260208301866139c6565b614e5f6040830185613856565b8181036060830152614e718184614df7565b905095945050505050565b600081519050614e8b816137bd565b92915050565b600060208284031215614ea757614ea6613787565b5b6000614eb584828501614e7c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614f2360208361388b565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f8f601c8361388b565b9150614f9a82614f59565b602082019050919050565b60006020820190508181036000830152614fbe81614f82565b905091905056fea2646970667358221220dd8514a8986191ca1ab33b4d1c074c850b4d04ddfe850019375d13eef664855764736f6c634300080b0033697066733a2f2f516d5269636966536936727a693639746a5635734a75446e74725748683439583274464c417a764d6650346362382f

Deployed ByteCode Sourcemap

58389:5872:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63823:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59897:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36944:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38503:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38026:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52769:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63157:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62184:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39253:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59339:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62963:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52437:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59940:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59433:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64043:215;;;;;;;;;;;;;:::i;:::-;;61788:65;;;;;;;;;;;;;:::i;:::-;;39663:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60027:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59529:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52959:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61861:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12641:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36638:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60112:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36368:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15540:103;;;;;;;;;;;;;:::i;:::-;;61719:61;;;;;;;;;;;;;:::i;:::-;;14889:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37113:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59622:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60180:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61448:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38796:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59853:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59244:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59714;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39919:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63337:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59811:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59985;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60142:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39022:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60261:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15798:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59151:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63823:212;63962:4;63991:36;64015:11;63991:23;:36::i;:::-;63984:43;;63823:212;;;:::o;59897:36::-;;;;:::o;36944:100::-;36998:13;37031:5;37024:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36944:100;:::o;38503:221::-;38579:7;38607:16;38615:7;38607;:16::i;:::-;38599:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38692:15;:24;38708:7;38692:24;;;;;;;;;;;;;;;;;;;;;38685:31;;38503:221;;;:::o;38026:411::-;38107:13;38123:23;38138:7;38123:14;:23::i;:::-;38107:39;;38171:5;38165:11;;:2;:11;;;;38157:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38265:5;38249:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38274:37;38291:5;38298:12;:10;:12::i;:::-;38274:16;:37::i;:::-;38249:62;38227:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38408:21;38417:2;38421:7;38408:8;:21::i;:::-;38096:341;38026:411;;:::o;60067:36::-;;;;:::o;52769:113::-;52830:7;52857:10;:17;;;;52850:24;;52769:113;:::o;63157:172::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63298:23:::1;63279:16;;:42;;;;;;;;;;;;;;;;;;63157:172:::0;:::o;62184:205::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62280:9:::1;62275:107;62299:5;:12;62295:1;:16;62275:107;;;62333:37;62354:6;62361:5;62367:1;62361:8;;;;;;;;:::i;:::-;;;;;;;;62333:20;:37::i;:::-;62313:3;;;;;:::i;:::-;;;;62275:107;;;;62184:205:::0;;:::o;39253:339::-;39448:41;39467:12;:10;:12::i;:::-;39481:7;39448:18;:41::i;:::-;39440:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39556:28;39566:4;39572:2;39576:7;39556:9;:28::i;:::-;39253:339;;;:::o;59339:87::-;;;;;;;;;;;;;:::o;62963:186::-;63069:16;;;;;;;;;;;63055:30;;:10;:30;;;63047:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63123:18;63129:11;63123:5;:18::i;:::-;62963:186;:::o;52437:256::-;52534:7;52570:23;52587:5;52570:16;:23::i;:::-;52562:5;:31;52554:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52659:12;:19;52672:5;52659:19;;;;;;;;;;;;;;;:26;52679:5;52659:26;;;;;;;;;;;;52652:33;;52437:256;;;;:::o;59940:38::-;;;;:::o;59433:89::-;;;;;;;;;;;;;:::o;64043:215::-;58570:17;;;;;;;;;;;58556:31;;:10;:31;;;:85;;;;58622:19;;;;;;;;;;;58608:33;;:10;:33;;;58556:85;:138;;;;58676:18;;;;;;;;;;;58662:32;;:10;:32;;;58556:138;:193;;;;58729:20;;;;;;;;;;;58715:34;;:10;:34;;;58556:193;:245;;;;58784:17;;;;;;;;;;;58770:31;;:10;:31;;;58556:245;:296;;;;58836:16;;;;;;;;;;;58822:30;;:10;:30;;;58556:296;:350;;;;58887:19;;;;;;;;;;;58873:33;;:10;:33;;;58556:350;58534:437;;;;;;;;;;;;:::i;:::-;;;;;;;;;64090:14:::1;64107:7;:19;64115:10;64107:19;;;;;;;;;;;;;;;;64090:36;;64154:1;64145:6;:10;64137:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;64188:10;64180:28;;:36;64209:6;64180:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64249:1;64227:7;:19;64235:10;64227:19;;;;;;;;;;;;;;;:23;;;;64079:179;64043:215::o:0;61788:65::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61835:10:::1;:8;:10::i;:::-;61788:65::o:0;39663:185::-;39801:39;39818:4;39824:2;39828:7;39801:39;;;;;;;;;;;;:16;:39::i;:::-;39663:185;;;:::o;60027:33::-;;;;:::o;59529:86::-;;;;;;;;;;;;;:::o;52959:233::-;53034:7;53070:30;:28;:30::i;:::-;53062:5;:38;53054:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;53167:10;53178:5;53167:17;;;;;;;;:::i;:::-;;;;;;;;;;53160:24;;52959:233;;;:::o;61861:102::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61945:10:::1;61935:7;:20;;;;;;;;;;;;:::i;:::-;;61861:102:::0;:::o;12641:86::-;12688:4;12712:7;;;;;;;;;;;12705:14;;12641:86;:::o;36638:239::-;36710:7;36730:13;36746:7;:16;36754:7;36746:16;;;;;;;;;;;;;;;;;;;;;36730:32;;36798:1;36781:19;;:5;:19;;;;36773:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36864:5;36857:12;;;36638:239;;;:::o;60112:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36368:208::-;36440:7;36485:1;36468:19;;:5;:19;;;;36460:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36552:9;:16;36562:5;36552:16;;;;;;;;;;;;;;;;36545:23;;36368:208;;;:::o;15540:103::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15605:30:::1;15632:1;15605:18;:30::i;:::-;15540:103::o:0;61719:61::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61764:8:::1;:6;:8::i;:::-;61719:61::o:0;14889:87::-;14935:7;14962:6;;;;;;;;;;;14955:13;;14889:87;:::o;37113:104::-;37169:13;37202:7;37195:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37113:104;:::o;59622:85::-;;;;;;;;;;;;;:::o;60180:31::-;;;;:::o;61448:263::-;12967:8;:6;:8::i;:::-;12966:9;12958:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;61547:6:::1;61539:5;;:14;;;;:::i;:::-;61526:9;:27;61518:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;61583:20;61593:9;61583;:20::i;:::-;61621:9;61616:88;61640:6;61636:1;:10;61616:88;;;61668:24;61681:10;61668:12;:24::i;:::-;61648:3;;;;;:::i;:::-;;;;61616:88;;;;61448:263:::0;:::o;38796:155::-;38891:52;38910:12;:10;:12::i;:::-;38924:8;38934;38891:18;:52::i;:::-;38796:155;;:::o;59853:37::-;;;;:::o;59244:88::-;;;;;;;;;;;;;:::o;59714:::-;;;;;;;;;;;;;:::o;39919:328::-;40094:41;40113:12;:10;:12::i;:::-;40127:7;40094:18;:41::i;:::-;40086:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40200:39;40214:4;40220:2;40224:7;40233:5;40200:13;:39::i;:::-;39919:328;;;;:::o;63337:478::-;63464:13;63517:16;63525:7;63517;:16::i;:::-;63495:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;63621:28;63652:10;:8;:10::i;:::-;63621:41;;63724:1;63699:14;63693:28;:32;:114;;;;;;;;;;;;;;;;;63769:14;63752:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;63693:114;63673:134;;;63337:478;;;:::o;59811:35::-;;;;:::o;59985:::-;;;;:::o;60142:31::-;;;;:::o;39022:164::-;39119:4;39143:18;:25;39162:5;39143:25;;;;;;;;;;;;;;;:35;39169:8;39143:35;;;;;;;;;;;;;;;;;;;;;;;;;39136:42;;39022:164;;;;:::o;60261:42::-;;;;;;;;;;;;;;;;;:::o;15798:201::-;15120:12;:10;:12::i;:::-;15109:23;;:7;:5;:7::i;:::-;:23;;;15101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15907:1:::1;15887:22;;:8;:22;;;;15879:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15963:28;15982:8;15963:18;:28::i;:::-;15798:201:::0;:::o;59151:86::-;;;;;;;;;;;;;:::o;52129:224::-;52231:4;52270:35;52255:50;;;:11;:50;;;;:90;;;;52309:36;52333:11;52309:23;:36::i;:::-;52255:90;52248:97;;52129:224;;;:::o;41757:127::-;41822:4;41874:1;41846:30;;:7;:16;41854:7;41846:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41839:37;;41757:127;;;:::o;11295:98::-;11348:7;11375:10;11368:17;;11295:98;:::o;45903:174::-;46005:2;45978:15;:24;45994:7;45978:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46061:7;46057:2;46023:46;;46032:23;46047:7;46032:14;:23::i;:::-;46023:46;;;;;;;;;;;;45903:174;;:::o;62401:171::-;62487:9;62482:83;62506:6;62502:1;:10;62482:83;;;62534:19;62547:5;62534:12;:19::i;:::-;62514:3;;;;;:::i;:::-;;;;62482:83;;;;62401:171;;:::o;42051:348::-;42144:4;42169:16;42177:7;42169;:16::i;:::-;42161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42245:13;42261:23;42276:7;42261:14;:23::i;:::-;42245:39;;42314:5;42303:16;;:7;:16;;;:51;;;;42347:7;42323:31;;:20;42335:7;42323:11;:20::i;:::-;:31;;;42303:51;:87;;;;42358:32;42375:5;42382:7;42358:16;:32::i;:::-;42303:87;42295:96;;;42051:348;;;;:::o;45160:625::-;45319:4;45292:31;;:23;45307:7;45292:14;:23::i;:::-;:31;;;45284:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45398:1;45384:16;;:2;:16;;;;45376:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45454:39;45475:4;45481:2;45485:7;45454:20;:39::i;:::-;45558:29;45575:1;45579:7;45558:8;:29::i;:::-;45619:1;45600:9;:15;45610:4;45600:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45648:1;45631:9;:13;45641:2;45631:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45679:2;45660:7;:16;45668:7;45660:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45718:7;45714:2;45699:27;;45708:4;45699:27;;;;;;;;;;;;45739:38;45759:4;45765:2;45769:7;45739:19;:38::i;:::-;45160:625;;;:::o;62817:138::-;62927:20;62939:7;62927:11;:20::i;:::-;62817:138;:::o;13700:120::-;13244:8;:6;:8::i;:::-;13236:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;13769:5:::1;13759:7;;:15;;;;;;;;;;;;;;;;;;13790:22;13799:12;:10;:12::i;:::-;13790:22;;;;;;:::i;:::-;;;;;;;;13700:120::o:0;16159:191::-;16233:16;16252:6;;;;;;;;;;;16233:25;;16278:8;16269:6;;:17;;;;;;;;;;;;;;;;;;16333:8;16302:40;;16323:8;16302:40;;;;;;;;;;;;16222:128;16159:191;:::o;13441:118::-;12967:8;:6;:8::i;:::-;12966:9;12958:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;13511:4:::1;13501:7;;:14;;;;;;;;;;;;;;;;;;13531:20;13538:12;:10;:12::i;:::-;13531:20;;;;;;:::i;:::-;;;;;;;;13441:118::o:0;60581:859::-;60640:27;60670:40;60704:5;60670:29;60685:13;;60670:10;:14;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;60640:70;;60721:29;60753:66;60803:5;60753:31;60768:15;;60753:10;:14;;:31;;;;:::i;:::-;:35;;:66;;;;:::i;:::-;60721:98;;60830:28;60861:65;60910:5;60861:30;60876:14;;60861:10;:14;;:30;;;;:::i;:::-;:34;;:65;;;;:::i;:::-;60830:96;;60937:30;60970:67;61021:5;60970:32;60985:16;;60970:10;:14;;:32;;;;:::i;:::-;:36;;:67;;;;:::i;:::-;60937:100;;61048:27;61078:40;61112:5;61078:29;61093:13;;61078:10;:14;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;61048:70;;61161:19;61131:7;:26;61139:17;;;;;;;;;;;61131:26;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;61223:21;61191:7;:28;61199:19;;;;;;;;;;;61191:28;;;;;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;;;;;;;61286:20;61255:7;:27;61263:18;;;;;;;;;;;61255:27;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;61350:22;61317:7;:29;61325:20;;;;;;;;;;;61317:29;;;;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;61413:19;61383:7;:26;61391:17;;;;;;;;;;;61383:26;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;60629:811;;;;;60581:859;:::o;61971:205::-;62049:9;;62033:13;:11;:13::i;:::-;:25;62025:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62102:34;62112:2;62116:19;:9;:17;:19::i;:::-;62102:9;:34::i;:::-;62147:21;:9;:19;:21::i;:::-;61971:205;:::o;46219:315::-;46374:8;46365:17;;:5;:17;;;;46357:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46461:8;46423:18;:25;46442:5;46423:25;;;;;;;;;;;;;;;:35;46449:8;46423:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46507:8;46485:41;;46500:5;46485:41;;;46517:8;46485:41;;;;;;:::i;:::-;;;;;;;;46219:315;;;:::o;41129:::-;41286:28;41296:4;41302:2;41306:7;41286:9;:28::i;:::-;41333:48;41356:4;41362:2;41366:7;41375:5;41333:22;:48::i;:::-;41325:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41129:315;;;;:::o;60473:100::-;60525:13;60558:7;60551:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60473:100;:::o;35999:305::-;36101:4;36153:25;36138:40;;;:11;:40;;;;:105;;;;36210:33;36195:48;;;:11;:48;;;;36138:105;:158;;;;36260:36;36284:11;36260:23;:36::i;:::-;36138:158;36118:178;;35999:305;;;:::o;62580:229::-;12967:8;:6;:8::i;:::-;12966:9;12958:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62756:45:::1;62783:4;62789:2;62793:7;62756:26;:45::i;:::-;62580:229:::0;;;:::o;48981:125::-;;;;:::o;50905:206::-;50974:20;50986:7;50974:11;:20::i;:::-;51048:1;51017:10;:19;51028:7;51017:19;;;;;;;;;;;51011:33;;;;;:::i;:::-;;;:38;51007:97;;51073:10;:19;51084:7;51073:19;;;;;;;;;;;;51066:26;;;;:::i;:::-;51007:97;50905:206;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;3999:::-;4057:7;4088:1;4084;:5;;;;:::i;:::-;4077:12;;3999:98;;;;:::o;7899:114::-;7964:7;7991;:14;;;7984:21;;7899:114;;;:::o;42741:110::-;42817:26;42827:2;42831:7;42817:26;;;;;;;;;;;;:9;:26::i;:::-;42741:110;;:::o;8021:127::-;8128:1;8110:7;:14;;;:19;;;;;;;;;;;8021:127;:::o;47099:799::-;47254:4;47275:15;:2;:13;;;:15::i;:::-;47271:620;;;47327:2;47311:36;;;47348:12;:10;:12::i;:::-;47362:4;47368:7;47377:5;47311:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47307:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47570:1;47553:6;:13;:18;47549:272;;;47596:60;;;;;;;;;;:::i;:::-;;;;;;;;47549:272;47771:6;47765:13;47756:6;47752:2;47748:15;47741:38;47307:529;47444:41;;;47434:51;;;:6;:51;;;;47427:58;;;;;47271:620;47875:4;47868:11;;47099:799;;;;;;;:::o;27673:157::-;27758:4;27797:25;27782:40;;;:11;:40;;;;27775:47;;27673:157;;;:::o;53805:589::-;53949:45;53976:4;53982:2;53986:7;53949:26;:45::i;:::-;54027:1;54011:18;;:4;:18;;;54007:187;;;54046:40;54078:7;54046:31;:40::i;:::-;54007:187;;;54116:2;54108:10;;:4;:10;;;54104:90;;54135:47;54168:4;54174:7;54135:32;:47::i;:::-;54104:90;54007:187;54222:1;54208:16;;:2;:16;;;54204:183;;;54241:45;54278:7;54241:36;:45::i;:::-;54204:183;;;54314:4;54308:10;;:2;:10;;;54304:83;;54335:40;54363:2;54367:7;54335:27;:40::i;:::-;54304:83;54204:183;53805:589;;;:::o;44403:420::-;44463:13;44479:23;44494:7;44479:14;:23::i;:::-;44463:39;;44515:48;44536:5;44551:1;44555:7;44515:20;:48::i;:::-;44604:29;44621:1;44625:7;44604:8;:29::i;:::-;44666:1;44646:9;:16;44656:5;44646:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;44685:7;:16;44693:7;44685:16;;;;;;;;;;;;44678:23;;;;;;;;;;;44747:7;44743:1;44719:36;;44728:5;44719:36;;;;;;;;;;;;44768:47;44788:5;44803:1;44807:7;44768:19;:47::i;:::-;44452:371;44403:420;:::o;43078:321::-;43208:18;43214:2;43218:7;43208:5;:18::i;:::-;43259:54;43290:1;43294:2;43298:7;43307:5;43259:22;:54::i;:::-;43237:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;43078:321;;;:::o;17590:326::-;17650:4;17907:1;17885:7;:19;;;:23;17878:30;;17590:326;;;:::o;48470:126::-;;;;:::o;55117:164::-;55221:10;:17;;;;55194:15;:24;55210:7;55194:24;;;;;;;;;;;:44;;;;55249:10;55265:7;55249:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55117:164;:::o;55908:988::-;56174:22;56224:1;56199:22;56216:4;56199:16;:22::i;:::-;:26;;;;:::i;:::-;56174:51;;56236:18;56257:17;:26;56275:7;56257:26;;;;;;;;;;;;56236:47;;56404:14;56390:10;:28;56386:328;;56435:19;56457:12;:18;56470:4;56457:18;;;;;;;;;;;;;;;:34;56476:14;56457:34;;;;;;;;;;;;56435:56;;56541:11;56508:12;:18;56521:4;56508:18;;;;;;;;;;;;;;;:30;56527:10;56508:30;;;;;;;;;;;:44;;;;56658:10;56625:17;:30;56643:11;56625:30;;;;;;;;;;;:43;;;;56420:294;56386:328;56810:17;:26;56828:7;56810:26;;;;;;;;;;;56803:33;;;56854:12;:18;56867:4;56854:18;;;;;;;;;;;;;;;:34;56873:14;56854:34;;;;;;;;;;;56847:41;;;55989:907;;55908:988;;:::o;57191:1079::-;57444:22;57489:1;57469:10;:17;;;;:21;;;;:::i;:::-;57444:46;;57501:18;57522:15;:24;57538:7;57522:24;;;;;;;;;;;;57501:45;;57873:19;57895:10;57906:14;57895:26;;;;;;;;:::i;:::-;;;;;;;;;;57873:48;;57959:11;57934:10;57945;57934:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;58070:10;58039:15;:28;58055:11;58039:28;;;;;;;;;;;:41;;;;58211:15;:24;58227:7;58211:24;;;;;;;;;;;58204:31;;;58246:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57262:1008;;;57191:1079;:::o;54695:221::-;54780:14;54797:20;54814:2;54797:16;:20::i;:::-;54780:37;;54855:7;54828:12;:16;54841:2;54828:16;;;;;;;;;;;;;;;:24;54845:6;54828:24;;;;;;;;;;;:34;;;;54902:6;54873:17;:26;54891:7;54873:26;;;;;;;;;;;:35;;;;54769:147;54695:221;;:::o;43735:439::-;43829:1;43815:16;;:2;:16;;;;43807:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43888:16;43896:7;43888;:16::i;:::-;43887:17;43879:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43950:45;43979:1;43983:2;43987:7;43950:20;:45::i;:::-;44025:1;44008:9;:13;44018:2;44008:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44056:2;44037:7;:16;44045:7;44037:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44101:7;44097:2;44076:33;;44093:1;44076:33;;;;;;;;;;;;44122:44;44150:1;44154:2;44158:7;44122:19;:44::i;:::-;43735:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:180;5796:77;5793:1;5786:88;5893:4;5890:1;5883:15;5917:4;5914:1;5907:15;5934:281;6017:27;6039:4;6017:27;:::i;:::-;6009:6;6005:40;6147:6;6135:10;6132:22;6111:18;6099:10;6096:34;6093:62;6090:88;;;6158:18;;:::i;:::-;6090:88;6198:10;6194:2;6187:22;5977:238;5934:281;;:::o;6221:129::-;6255:6;6282:20;;:::i;:::-;6272:30;;6311:33;6339:4;6331:6;6311:33;:::i;:::-;6221:129;;;:::o;6356:311::-;6433:4;6523:18;6515:6;6512:30;6509:56;;;6545:18;;:::i;:::-;6509:56;6595:4;6587:6;6583:17;6575:25;;6655:4;6649;6645:15;6637:23;;6356:311;;;:::o;6673:117::-;6782:1;6779;6772:12;6813:710;6909:5;6934:81;6950:64;7007:6;6950:64;:::i;:::-;6934:81;:::i;:::-;6925:90;;7035:5;7064:6;7057:5;7050:21;7098:4;7091:5;7087:16;7080:23;;7151:4;7143:6;7139:17;7131:6;7127:30;7180:3;7172:6;7169:15;7166:122;;;7199:79;;:::i;:::-;7166:122;7314:6;7297:220;7331:6;7326:3;7323:15;7297:220;;;7406:3;7435:37;7468:3;7456:10;7435:37;:::i;:::-;7430:3;7423:50;7502:4;7497:3;7493:14;7486:21;;7373:144;7357:4;7352:3;7348:14;7341:21;;7297:220;;;7301:21;6915:608;;6813:710;;;;;:::o;7546:370::-;7617:5;7666:3;7659:4;7651:6;7647:17;7643:27;7633:122;;7674:79;;:::i;:::-;7633:122;7791:6;7778:20;7816:94;7906:3;7898:6;7891:4;7883:6;7879:17;7816:94;:::i;:::-;7807:103;;7623:293;7546:370;;;;:::o;7922:684::-;8015:6;8023;8072:2;8060:9;8051:7;8047:23;8043:32;8040:119;;;8078:79;;:::i;:::-;8040:119;8226:1;8215:9;8211:17;8198:31;8256:18;8248:6;8245:30;8242:117;;;8278:79;;:::i;:::-;8242:117;8383:78;8453:7;8444:6;8433:9;8429:22;8383:78;:::i;:::-;8373:88;;8169:302;8510:2;8536:53;8581:7;8572:6;8561:9;8557:22;8536:53;:::i;:::-;8526:63;;8481:118;7922:684;;;;;:::o;8612:619::-;8689:6;8697;8705;8754:2;8742:9;8733:7;8729:23;8725:32;8722:119;;;8760:79;;:::i;:::-;8722:119;8880:1;8905:53;8950:7;8941:6;8930:9;8926:22;8905:53;:::i;:::-;8895:63;;8851:117;9007:2;9033:53;9078:7;9069:6;9058:9;9054:22;9033:53;:::i;:::-;9023:63;;8978:118;9135:2;9161:53;9206:7;9197:6;9186:9;9182:22;9161:53;:::i;:::-;9151:63;;9106:118;8612:619;;;;;:::o;9237:117::-;9346:1;9343;9336:12;9360:308;9422:4;9512:18;9504:6;9501:30;9498:56;;;9534:18;;:::i;:::-;9498:56;9572:29;9594:6;9572:29;:::i;:::-;9564:37;;9656:4;9650;9646:15;9638:23;;9360:308;;;:::o;9674:154::-;9758:6;9753:3;9748;9735:30;9820:1;9811:6;9806:3;9802:16;9795:27;9674:154;;;:::o;9834:412::-;9912:5;9937:66;9953:49;9995:6;9953:49;:::i;:::-;9937:66;:::i;:::-;9928:75;;10026:6;10019:5;10012:21;10064:4;10057:5;10053:16;10102:3;10093:6;10088:3;10084:16;10081:25;10078:112;;;10109:79;;:::i;:::-;10078:112;10199:41;10233:6;10228:3;10223;10199:41;:::i;:::-;9918:328;9834:412;;;;;:::o;10266:340::-;10322:5;10371:3;10364:4;10356:6;10352:17;10348:27;10338:122;;10379:79;;:::i;:::-;10338:122;10496:6;10483:20;10521:79;10596:3;10588:6;10581:4;10573:6;10569:17;10521:79;:::i;:::-;10512:88;;10328:278;10266:340;;;;:::o;10612:509::-;10681:6;10730:2;10718:9;10709:7;10705:23;10701:32;10698:119;;;10736:79;;:::i;:::-;10698:119;10884:1;10873:9;10869:17;10856:31;10914:18;10906:6;10903:30;10900:117;;;10936:79;;:::i;:::-;10900:117;11041:63;11096:7;11087:6;11076:9;11072:22;11041:63;:::i;:::-;11031:73;;10827:287;10612:509;;;;:::o;11127:116::-;11197:21;11212:5;11197:21;:::i;:::-;11190:5;11187:32;11177:60;;11233:1;11230;11223:12;11177:60;11127:116;:::o;11249:133::-;11292:5;11330:6;11317:20;11308:29;;11346:30;11370:5;11346:30;:::i;:::-;11249:133;;;;:::o;11388:468::-;11453:6;11461;11510:2;11498:9;11489:7;11485:23;11481:32;11478:119;;;11516:79;;:::i;:::-;11478:119;11636:1;11661:53;11706:7;11697:6;11686:9;11682:22;11661:53;:::i;:::-;11651:63;;11607:117;11763:2;11789:50;11831:7;11822:6;11811:9;11807:22;11789:50;:::i;:::-;11779:60;;11734:115;11388:468;;;;;:::o;11862:307::-;11923:4;12013:18;12005:6;12002:30;11999:56;;;12035:18;;:::i;:::-;11999:56;12073:29;12095:6;12073:29;:::i;:::-;12065:37;;12157:4;12151;12147:15;12139:23;;11862:307;;;:::o;12175:410::-;12252:5;12277:65;12293:48;12334:6;12293:48;:::i;:::-;12277:65;:::i;:::-;12268:74;;12365:6;12358:5;12351:21;12403:4;12396:5;12392:16;12441:3;12432:6;12427:3;12423:16;12420:25;12417:112;;;12448:79;;:::i;:::-;12417:112;12538:41;12572:6;12567:3;12562;12538:41;:::i;:::-;12258:327;12175:410;;;;;:::o;12604:338::-;12659:5;12708:3;12701:4;12693:6;12689:17;12685:27;12675:122;;12716:79;;:::i;:::-;12675:122;12833:6;12820:20;12858:78;12932:3;12924:6;12917:4;12909:6;12905:17;12858:78;:::i;:::-;12849:87;;12665:277;12604:338;;;;:::o;12948:943::-;13043:6;13051;13059;13067;13116:3;13104:9;13095:7;13091:23;13087:33;13084:120;;;13123:79;;:::i;:::-;13084:120;13243:1;13268:53;13313:7;13304:6;13293:9;13289:22;13268:53;:::i;:::-;13258:63;;13214:117;13370:2;13396:53;13441:7;13432:6;13421:9;13417:22;13396:53;:::i;:::-;13386:63;;13341:118;13498:2;13524:53;13569:7;13560:6;13549:9;13545:22;13524:53;:::i;:::-;13514:63;;13469:118;13654:2;13643:9;13639:18;13626:32;13685:18;13677:6;13674:30;13671:117;;;13707:79;;:::i;:::-;13671:117;13812:62;13866:7;13857:6;13846:9;13842:22;13812:62;:::i;:::-;13802:72;;13597:287;12948:943;;;;;;;:::o;13897:474::-;13965:6;13973;14022:2;14010:9;14001:7;13997:23;13993:32;13990:119;;;14028:79;;:::i;:::-;13990:119;14148:1;14173:53;14218:7;14209:6;14198:9;14194:22;14173:53;:::i;:::-;14163:63;;14119:117;14275:2;14301:53;14346:7;14337:6;14326:9;14322:22;14301:53;:::i;:::-;14291:63;;14246:118;13897:474;;;;;:::o;14377:180::-;14425:77;14422:1;14415:88;14522:4;14519:1;14512:15;14546:4;14543:1;14536:15;14563:320;14607:6;14644:1;14638:4;14634:12;14624:22;;14691:1;14685:4;14681:12;14712:18;14702:81;;14768:4;14760:6;14756:17;14746:27;;14702:81;14830:2;14822:6;14819:14;14799:18;14796:38;14793:84;;;14849:18;;:::i;:::-;14793:84;14614:269;14563:320;;;:::o;14889:231::-;15029:34;15025:1;15017:6;15013:14;15006:58;15098:14;15093:2;15085:6;15081:15;15074:39;14889:231;:::o;15126:366::-;15268:3;15289:67;15353:2;15348:3;15289:67;:::i;:::-;15282:74;;15365:93;15454:3;15365:93;:::i;:::-;15483:2;15478:3;15474:12;15467:19;;15126:366;;;:::o;15498:419::-;15664:4;15702:2;15691:9;15687:18;15679:26;;15751:9;15745:4;15741:20;15737:1;15726:9;15722:17;15715:47;15779:131;15905:4;15779:131;:::i;:::-;15771:139;;15498:419;;;:::o;15923:220::-;16063:34;16059:1;16051:6;16047:14;16040:58;16132:3;16127:2;16119:6;16115:15;16108:28;15923:220;:::o;16149:366::-;16291:3;16312:67;16376:2;16371:3;16312:67;:::i;:::-;16305:74;;16388:93;16477:3;16388:93;:::i;:::-;16506:2;16501:3;16497:12;16490:19;;16149:366;;;:::o;16521:419::-;16687:4;16725:2;16714:9;16710:18;16702:26;;16774:9;16768:4;16764:20;16760:1;16749:9;16745:17;16738:47;16802:131;16928:4;16802:131;:::i;:::-;16794:139;;16521:419;;;:::o;16946:243::-;17086:34;17082:1;17074:6;17070:14;17063:58;17155:26;17150:2;17142:6;17138:15;17131:51;16946:243;:::o;17195:366::-;17337:3;17358:67;17422:2;17417:3;17358:67;:::i;:::-;17351:74;;17434:93;17523:3;17434:93;:::i;:::-;17552:2;17547:3;17543:12;17536:19;;17195:366;;;:::o;17567:419::-;17733:4;17771:2;17760:9;17756:18;17748:26;;17820:9;17814:4;17810:20;17806:1;17795:9;17791:17;17784:47;17848:131;17974:4;17848:131;:::i;:::-;17840:139;;17567:419;;;:::o;17992:182::-;18132:34;18128:1;18120:6;18116:14;18109:58;17992:182;:::o;18180:366::-;18322:3;18343:67;18407:2;18402:3;18343:67;:::i;:::-;18336:74;;18419:93;18508:3;18419:93;:::i;:::-;18537:2;18532:3;18528:12;18521:19;;18180:366;;;:::o;18552:419::-;18718:4;18756:2;18745:9;18741:18;18733:26;;18805:9;18799:4;18795:20;18791:1;18780:9;18776:17;18769:47;18833:131;18959:4;18833:131;:::i;:::-;18825:139;;18552:419;;;:::o;18977:180::-;19025:77;19022:1;19015:88;19122:4;19119:1;19112:15;19146:4;19143:1;19136:15;19163:180;19211:77;19208:1;19201:88;19308:4;19305:1;19298:15;19332:4;19329:1;19322:15;19349:233;19388:3;19411:24;19429:5;19411:24;:::i;:::-;19402:33;;19457:66;19450:5;19447:77;19444:103;;;19527:18;;:::i;:::-;19444:103;19574:1;19567:5;19563:13;19556:20;;19349:233;;;:::o;19588:236::-;19728:34;19724:1;19716:6;19712:14;19705:58;19797:19;19792:2;19784:6;19780:15;19773:44;19588:236;:::o;19830:366::-;19972:3;19993:67;20057:2;20052:3;19993:67;:::i;:::-;19986:74;;20069:93;20158:3;20069:93;:::i;:::-;20187:2;20182:3;20178:12;20171:19;;19830:366;;;:::o;20202:419::-;20368:4;20406:2;20395:9;20391:18;20383:26;;20455:9;20449:4;20445:20;20441:1;20430:9;20426:17;20419:47;20483:131;20609:4;20483:131;:::i;:::-;20475:139;;20202:419;;;:::o;20627:172::-;20767:24;20763:1;20755:6;20751:14;20744:48;20627:172;:::o;20805:366::-;20947:3;20968:67;21032:2;21027:3;20968:67;:::i;:::-;20961:74;;21044:93;21133:3;21044:93;:::i;:::-;21162:2;21157:3;21153:12;21146:19;;20805:366;;;:::o;21177:419::-;21343:4;21381:2;21370:9;21366:18;21358:26;;21430:9;21424:4;21420:20;21416:1;21405:9;21401:17;21394:47;21458:131;21584:4;21458:131;:::i;:::-;21450:139;;21177:419;;;:::o;21602:230::-;21742:34;21738:1;21730:6;21726:14;21719:58;21811:13;21806:2;21798:6;21794:15;21787:38;21602:230;:::o;21838:366::-;21980:3;22001:67;22065:2;22060:3;22001:67;:::i;:::-;21994:74;;22077:93;22166:3;22077:93;:::i;:::-;22195:2;22190:3;22186:12;22179:19;;21838:366;;;:::o;22210:419::-;22376:4;22414:2;22403:9;22399:18;22391:26;;22463:9;22457:4;22453:20;22449:1;22438:9;22434:17;22427:47;22491:131;22617:4;22491:131;:::i;:::-;22483:139;;22210:419;;;:::o;22635:224::-;22775:34;22771:1;22763:6;22759:14;22752:58;22844:7;22839:2;22831:6;22827:15;22820:32;22635:224;:::o;22865:366::-;23007:3;23028:67;23092:2;23087:3;23028:67;:::i;:::-;23021:74;;23104:93;23193:3;23104:93;:::i;:::-;23222:2;23217:3;23213:12;23206:19;;22865:366;;;:::o;23237:419::-;23403:4;23441:2;23430:9;23426:18;23418:26;;23490:9;23484:4;23480:20;23476:1;23465:9;23461:17;23454:47;23518:131;23644:4;23518:131;:::i;:::-;23510:139;;23237:419;;;:::o;23662:163::-;23802:11;23798:1;23790:6;23786:14;23779:35;23662:163;:::o;23835:381::-;23977:3;24002:66;24066:1;24061:3;24002:66;:::i;:::-;23995:73;;24081:93;24170:3;24081:93;:::i;:::-;24203:2;24198:3;24194:12;24187:19;;23835:381;;;:::o;24226:435::-;24392:4;24434:2;24423:9;24419:18;24411:26;;24487:9;24481:4;24477:20;24473:1;24462:9;24458:17;24451:47;24519:131;24645:4;24519:131;:::i;:::-;24511:139;;24226:435;;;:::o;24671:243::-;24815:34;24811:1;24803:6;24799:14;24792:58;24888:14;24883:2;24875:6;24871:15;24864:39;24671:243;:::o;24924:382::-;25066:3;25091:67;25155:2;25150:3;25091:67;:::i;:::-;25084:74;;25171:93;25260:3;25171:93;:::i;:::-;25293:2;25288:3;25284:12;25277:19;;24924:382;;;:::o;25316:435::-;25482:4;25524:2;25513:9;25509:18;25501:26;;25577:9;25571:4;25567:20;25563:1;25552:9;25548:17;25541:47;25609:131;25735:4;25609:131;:::i;:::-;25601:139;;25316:435;;;:::o;25761:240::-;25905:34;25901:1;25893:6;25889:14;25882:58;25978:11;25973:2;25965:6;25961:15;25954:36;25761:240;:::o;26011:382::-;26153:3;26178:67;26242:2;26237:3;26178:67;:::i;:::-;26171:74;;26258:93;26347:3;26258:93;:::i;:::-;26380:2;26375:3;26371:12;26364:19;;26011:382;;;:::o;26403:435::-;26569:4;26611:2;26600:9;26596:18;26588:26;;26664:9;26658:4;26654:20;26650:1;26639:9;26635:17;26628:47;26696:131;26822:4;26696:131;:::i;:::-;26688:139;;26403:435;;;:::o;26848:241::-;26992:34;26988:1;26980:6;26976:14;26969:58;27065:12;27060:2;27052:6;27048:15;27041:37;26848:241;:::o;27099:382::-;27241:3;27266:67;27330:2;27325:3;27266:67;:::i;:::-;27259:74;;27346:93;27435:3;27346:93;:::i;:::-;27468:2;27463:3;27459:12;27452:19;;27099:382;;;:::o;27491:435::-;27657:4;27699:2;27688:9;27684:18;27676:26;;27752:9;27746:4;27742:20;27738:1;27727:9;27723:17;27716:47;27784:131;27910:4;27784:131;:::i;:::-;27776:139;;27491:435;;;:::o;27936:174::-;28080:18;28076:1;28068:6;28064:14;28057:42;27936:174;:::o;28120:382::-;28262:3;28287:67;28351:2;28346:3;28287:67;:::i;:::-;28280:74;;28367:93;28456:3;28367:93;:::i;:::-;28489:2;28484:3;28480:12;28473:19;;28120:382;;;:::o;28512:435::-;28678:4;28720:2;28709:9;28705:18;28697:26;;28773:9;28767:4;28763:20;28759:1;28748:9;28744:17;28737:47;28805:131;28931:4;28805:131;:::i;:::-;28797:139;;28512:435;;;:::o;28957:372::-;28997:7;29024:20;29042:1;29024:20;:::i;:::-;29019:25;;29062:20;29080:1;29062:20;:::i;:::-;29057:25;;29258:1;29190:66;29186:74;29183:1;29180:81;29175:1;29168:9;29161:17;29157:105;29154:131;;;29265:18;;:::i;:::-;29154:131;29317:1;29314;29310:9;29299:20;;28957:372;;;;:::o;29339:172::-;29483:16;29479:1;29471:6;29467:14;29460:40;29339:172;:::o;29521:382::-;29663:3;29688:67;29752:2;29747:3;29688:67;:::i;:::-;29681:74;;29768:93;29857:3;29768:93;:::i;:::-;29890:2;29885:3;29881:12;29874:19;;29521:382;;;:::o;29913:435::-;30079:4;30121:2;30110:9;30106:18;30098:26;;30174:9;30168:4;30164:20;30160:1;30149:9;30145:17;30138:47;30206:131;30332:4;30206:131;:::i;:::-;30198:139;;29913:435;;;:::o;30358:246::-;30502:34;30498:1;30490:6;30486:14;30479:58;30575:17;30570:2;30562:6;30558:15;30551:42;30358:246;:::o;30614:382::-;30756:3;30781:67;30845:2;30840:3;30781:67;:::i;:::-;30774:74;;30861:93;30950:3;30861:93;:::i;:::-;30983:2;30978:3;30974:12;30967:19;;30614:382;;;:::o;31006:435::-;31172:4;31214:2;31203:9;31199:18;31191:26;;31267:9;31261:4;31257:20;31253:1;31242:9;31238:17;31231:47;31299:131;31425:4;31299:131;:::i;:::-;31291:139;;31006:435;;;:::o;31451:156::-;31553:11;31594:3;31579:18;;31451:156;;;;:::o;31617:397::-;31723:3;31755:39;31788:5;31755:39;:::i;:::-;31814:89;31896:6;31891:3;31814:89;:::i;:::-;31807:96;;31916:52;31961:6;31956:3;31949:4;31942:5;31938:16;31916:52;:::i;:::-;31997:6;31992:3;31988:16;31981:23;;31727:287;31617:397;;;;:::o;32024:287::-;32156:3;32182:95;32273:3;32264:6;32182:95;:::i;:::-;32175:102;;32298:3;32291:10;;32024:287;;;;:::o;32321:237::-;32465:34;32461:1;32453:6;32449:14;32442:58;32538:8;32533:2;32525:6;32521:15;32514:33;32321:237;:::o;32568:382::-;32710:3;32735:67;32799:2;32794:3;32735:67;:::i;:::-;32728:74;;32815:93;32904:3;32815:93;:::i;:::-;32937:2;32932:3;32928:12;32921:19;;32568:382;;;:::o;32960:435::-;33126:4;33168:2;33157:9;33153:18;33145:26;;33221:9;33215:4;33211:20;33207:1;33196:9;33192:17;33185:47;33253:131;33379:4;33253:131;:::i;:::-;33245:139;;32960:435;;;:::o;33405:243::-;33549:34;33545:1;33537:6;33533:14;33526:58;33622:14;33617:2;33609:6;33605:15;33598:39;33405:243;:::o;33658:382::-;33800:3;33825:67;33889:2;33884:3;33825:67;:::i;:::-;33818:74;;33905:93;33994:3;33905:93;:::i;:::-;34027:2;34022:3;34018:12;34011:19;;33658:382;;;:::o;34050:435::-;34216:4;34258:2;34247:9;34243:18;34235:26;;34311:9;34305:4;34301:20;34297:1;34286:9;34282:17;34275:47;34343:131;34469:4;34343:131;:::i;:::-;34335:139;;34050:435;;;:::o;34495:236::-;34639:34;34635:1;34627:6;34623:14;34616:58;34712:7;34707:2;34699:6;34695:15;34688:32;34495:236;:::o;34741:382::-;34883:3;34908:67;34972:2;34967:3;34908:67;:::i;:::-;34901:74;;34988:93;35077:3;34988:93;:::i;:::-;35110:2;35105:3;35101:12;35094:19;;34741:382;;;:::o;35133:435::-;35299:4;35341:2;35330:9;35326:18;35318:26;;35394:9;35388:4;35384:20;35380:1;35369:9;35365:17;35358:47;35426:131;35552:4;35426:131;:::i;:::-;35418:139;;35133:435;;;:::o;35578:235::-;35722:34;35718:1;35710:6;35706:14;35699:58;35795:6;35790:2;35782:6;35778:15;35771:31;35578:235;:::o;35823:382::-;35965:3;35990:67;36054:2;36049:3;35990:67;:::i;:::-;35983:74;;36070:93;36159:3;36070:93;:::i;:::-;36192:2;36187:3;36183:12;36176:19;;35823:382;;;:::o;36215:435::-;36381:4;36423:2;36412:9;36408:18;36400:26;;36476:9;36470:4;36466:20;36462:1;36451:9;36447:17;36440:47;36508:131;36634:4;36508:131;:::i;:::-;36500:139;;36215:435;;;:::o;36660:211::-;36700:4;36724:20;36742:1;36724:20;:::i;:::-;36719:25;;36762:20;36780:1;36762:20;:::i;:::-;36757:25;;36805:1;36802;36799:8;36796:34;;;36810:18;;:::i;:::-;36796:34;36859:1;36856;36852:9;36844:17;;36660:211;;;;:::o;36881:329::-;36921:3;36944:20;36962:1;36944:20;:::i;:::-;36939:25;;36982:20;37000:1;36982:20;:::i;:::-;36977:25;;37144:1;37076:66;37072:74;37069:1;37066:81;37063:107;;;37150:18;;:::i;:::-;37063:107;37198:1;37195;37191:9;37184:16;;36881:329;;;;:::o;37220:178::-;37364:22;37360:1;37352:6;37348:14;37341:46;37220:178;:::o;37408:382::-;37550:3;37575:67;37639:2;37634:3;37575:67;:::i;:::-;37568:74;;37655:93;37744:3;37655:93;:::i;:::-;37777:2;37772:3;37768:12;37761:19;;37408:382;;;:::o;37800:435::-;37966:4;38008:2;37997:9;37993:18;37985:26;;38061:9;38055:4;38051:20;38047:1;38036:9;38032:17;38025:47;38093:131;38219:4;38093:131;:::i;:::-;38085:139;;37800:435;;;:::o;38245:186::-;38389:30;38385:1;38377:6;38373:14;38366:54;38245:186;:::o;38441:382::-;38583:3;38608:67;38672:2;38667:3;38608:67;:::i;:::-;38601:74;;38688:93;38777:3;38688:93;:::i;:::-;38810:2;38805:3;38801:12;38794:19;;38441:382;;;:::o;38833:435::-;38999:4;39041:2;39030:9;39026:18;39018:26;;39094:9;39088:4;39084:20;39080:1;39069:9;39065:17;39058:47;39126:131;39252:4;39126:131;:::i;:::-;39118:139;;38833:435;;;:::o;39278:183::-;39422:27;39418:1;39410:6;39406:14;39399:51;39278:183;:::o;39471:382::-;39613:3;39638:67;39702:2;39697:3;39638:67;:::i;:::-;39631:74;;39718:93;39807:3;39718:93;:::i;:::-;39840:2;39835:3;39831:12;39824:19;;39471:382;;;:::o;39863:435::-;40029:4;40071:2;40060:9;40056:18;40048:26;;40124:9;40118:4;40114:20;40110:1;40099:9;40095:17;40088:47;40156:131;40282:4;40156:131;:::i;:::-;40148:139;;39863:435;;;:::o;40308:249::-;40452:34;40448:1;40440:6;40436:14;40429:58;40525:20;40520:2;40512:6;40508:15;40501:45;40308:249;:::o;40567:382::-;40709:3;40734:67;40798:2;40793:3;40734:67;:::i;:::-;40727:74;;40814:93;40903:3;40814:93;:::i;:::-;40936:2;40931:3;40927:12;40920:19;;40567:382;;;:::o;40959:435::-;41125:4;41167:2;41156:9;41152:18;41144:26;;41220:9;41214:4;41210:20;41206:1;41195:9;41191:17;41184:47;41252:131;41378:4;41252:131;:::i;:::-;41244:139;;40959:435;;;:::o;41404:196::-;41456:77;41453:1;41446:88;41557:4;41554:1;41547:15;41585:4;41582:1;41575:15;41610:205;41650:1;41671:20;41689:1;41671:20;:::i;:::-;41666:25;;41709:20;41727:1;41709:20;:::i;:::-;41704:25;;41752:1;41742:35;;41757:18;;:::i;:::-;41742:35;41803:1;41800;41796:9;41791:14;;41610:205;;;;:::o;41825:106::-;41876:6;41914:5;41908:12;41898:22;;41825:106;;;:::o;41941:180::-;42024:11;42062:6;42057:3;42050:19;42106:4;42101:3;42097:14;42082:29;;41941:180;;;;:::o;42131:380::-;42217:3;42249:38;42281:5;42249:38;:::i;:::-;42307:70;42370:6;42365:3;42307:70;:::i;:::-;42300:77;;42390:52;42435:6;42430:3;42423:4;42416:5;42412:16;42390:52;:::i;:::-;42471:29;42493:6;42471:29;:::i;:::-;42466:3;42462:39;42455:46;;42221:290;42131:380;;;;:::o;42521:668::-;42716:4;42758:3;42747:9;42743:19;42735:27;;42776:71;42844:1;42833:9;42829:17;42820:6;42776:71;:::i;:::-;42861:72;42929:2;42918:9;42914:18;42905:6;42861:72;:::i;:::-;42947;43015:2;43004:9;43000:18;42991:6;42947:72;:::i;:::-;43070:9;43064:4;43060:20;43055:2;43044:9;43040:18;43033:48;43102:76;43173:4;43164:6;43102:76;:::i;:::-;43094:84;;42521:668;;;;;;;:::o;43199:153::-;43255:5;43290:6;43284:13;43275:22;;43310:32;43336:5;43310:32;:::i;:::-;43199:153;;;;:::o;43362:373::-;43431:6;43484:2;43472:9;43463:7;43459:23;43455:32;43452:119;;;43490:79;;:::i;:::-;43452:119;43618:1;43647:63;43702:7;43693:6;43682:9;43678:22;43647:63;:::i;:::-;43637:73;;43585:139;43362:373;;;;:::o;43745:196::-;43797:77;43794:1;43787:88;43898:4;43895:1;43888:15;43926:4;43923:1;43916:15;43951:190;44095:34;44091:1;44083:6;44079:14;44072:58;43951:190;:::o;44151:382::-;44293:3;44318:67;44382:2;44377:3;44318:67;:::i;:::-;44311:74;;44398:93;44487:3;44398:93;:::i;:::-;44520:2;44515:3;44511:12;44504:19;;44151:382;;;:::o;44543:435::-;44709:4;44751:2;44740:9;44736:18;44728:26;;44804:9;44798:4;44794:20;44790:1;44779:9;44775:17;44768:47;44836:131;44962:4;44836:131;:::i;:::-;44828:139;;44543:435;;;:::o;44988:186::-;45132:30;45128:1;45120:6;45116:14;45109:54;44988:186;:::o;45184:382::-;45326:3;45351:67;45415:2;45410:3;45351:67;:::i;:::-;45344:74;;45431:93;45520:3;45431:93;:::i;:::-;45553:2;45548:3;45544:12;45537:19;;45184:382;;;:::o;45576:435::-;45742:4;45784:2;45773:9;45769:18;45761:26;;45837:9;45831:4;45827:20;45823:1;45812:9;45808:17;45801:47;45869:131;45995:4;45869:131;:::i;:::-;45861:139;;45576:435;;;:::o

Swarm Source

ipfs://dd8514a8986191ca1ab33b4d1c074c850b4d04ddfe850019375d13eef6648557
Loading