Token Baby Alien Mutants

Overview CRC721

Total Supply:
1,049 BAM

Holders:
86 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyAlienMutants

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-15
*/

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


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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);
    }

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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/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: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        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 (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions 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/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: contracts/BAM.sol


pragma solidity ^0.8.0;







contract BabyAlienMutants is ERC721Enumerable, Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _mintCounter;

    uint256 public _mutatePrice = 100000 ether;

    // Base URI for metadata 
    string public _prefixURI;

    //Contracts
    IERC721 public badContract; // 0xB340c91182b9fF831bB36232cB3296eD306c79B2
    IERC20 public glxyToken; // 0xa8652B3f8193002fc15cc8171877158F9709cE67

    mapping (uint256 => bool) hasMutated;

    // Events
    event BurnToken(uint256 tokenID);
    event SetBaseURI(string newURI);
    event ToggleTransferPause(bool paused); 
    event UpdatePrice(uint256 newPrice);
    event Withdraw(uint256 total);
    event WithdrawGLXY(uint256 total);
    event Mutate(uint256[] tokenIDs);
    event Unmutate(uint256[] tokenIDs);

    constructor(IERC721 _badContract, IERC20 _glxyToken) ERC721("Baby Alien Mutants", "BAM") {
        badContract = _badContract;
        glxyToken = _glxyToken;
    }

    ///////////////////
    // URI Functions //
    ///////////////////

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

    function setBaseURI(string memory _uri) public onlyOwner {
        _prefixURI = _uri;
        emit SetBaseURI(_uri);
    }

    function mutate(uint256[] calldata ids) external whenNotPaused {
        require(badContract.isApprovedForAll(msg.sender, address(this)) == true, "mutate: Not approved for all");
        uint256 cost = ids.length * _mutatePrice;
        require(glxyToken.allowance(msg.sender, address(this)) > cost, "mutate: insufficient GLXY allowance");
        require(glxyToken.balanceOf(msg.sender) >= cost, "mutate: insufficient GLXY balance");

        glxyToken.transferFrom(msg.sender, address(this), cost);


        for (uint i = 0; i < ids.length; i++) {
            require(badContract.ownerOf(ids[i]) == msg.sender, "mutate: sender is not owner");
            badContract.safeTransferFrom(msg.sender, address(this), ids[i]);

            if(hasMutated[ids[i]]) {
                IERC721(address(this)).safeTransferFrom(address(this), msg.sender, ids[i]);
            } else {
                _safeMint(msg.sender, ids[i]);
                hasMutated[ids[i]] = true;
            }
        }

        emit Mutate(ids);
    }

    function unmutate(uint256[] calldata ids) external whenNotPaused {
        require(isApprovedForAll(msg.sender, address(this)) == true, "unmutate: Not approved for all");
        uint256 cost = ids.length * _mutatePrice;
        require(glxyToken.allowance(msg.sender, address(this)) > cost, "unmutate: insufficient GLXY allowance");
        require(glxyToken.balanceOf(msg.sender) >= cost, "unmutate: insufficient GLXY balance");
        
        glxyToken.transferFrom(msg.sender, address(this), cost);

        for (uint i = 0; i < ids.length; i++) {
            require(ownerOf(ids[i]) == msg.sender, "unmutate: sender is not owner");
            safeTransferFrom(msg.sender, address(this), ids[i]);
        }

        for (uint i = 0; i < ids.length; i++) {
            require(ownerOf(ids[i]) == address(this), "unmutate: sender is not owner of id");
            badContract.safeTransferFrom(address(this), msg.sender, ids[i]);
        }

        emit Unmutate(ids);
    }

    function burnToken(uint256 tokenId) external virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId), "burnToken: caller is not owner nor approved"); 
        _burn(tokenId);
        emit BurnToken(tokenId);
    }

    function onERC721Received(address, address, uint256, bytes calldata) external pure returns(bytes4) {
        return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
    }

    //////////////////////
    // State management // 
    //////////////////////

    function toggleAllMintPause() external onlyOwner {
        paused() ? _unpause() : _pause();
        emit ToggleTransferPause(paused()); 
    }

    function updateMutateCost(uint256 newCost) external onlyOwner {
        _mutatePrice = newCost;
    }

    function withdrawGLXY() external onlyOwner {
        require(glxyToken.balanceOf(address(this)) > 0, "withdraw: contract balance must be greater than 0"); 
        uint256 balance = glxyToken.balanceOf(address(this));
        glxyToken.transfer(msg.sender, balance);
        emit WithdrawGLXY(balance);
    }

    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); 
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        emit Withdraw(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC721","name":"_badContract","type":"address"},{"internalType":"contract IERC20","name":"_glxyToken","type":"address"}],"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":false,"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"BurnToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"Mutate","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":false,"internalType":"string","name":"newURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"ToggleTransferPause","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":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"Unmutate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"UpdatePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"WithdrawGLXY","type":"event"},{"inputs":[],"name":"_mutatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"badContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glxyToken","outputs":[{"internalType":"contract IERC20","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":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"mutate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","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":"toggleAllMintPause","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"unmutate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"updateMutateCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawGLXY","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405269152d02c7e14af6800000600c553480156200001f57600080fd5b50604051620058c2380380620058c2833981810160405281019062000045919062000356565b6040518060400160405280601281526020017f4261627920416c69656e204d7574616e747300000000000000000000000000008152506040518060400160405280600381526020017f42414d00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c992919062000278565b508060019080519060200190620000e292919062000278565b5050506000600a60006101000a81548160ff0219169083151502179055506200012062000114620001aa60201b60201c565b620001b260201b60201c565b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000497565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028690620003f9565b90600052602060002090601f016020900481019282620002aa5760008555620002f6565b82601f10620002c557805160ff1916838001178555620002f6565b82800160010185558215620002f6579182015b82811115620002f5578251825591602001919060010190620002d8565b5b50905062000305919062000309565b5090565b5b80821115620003245760008160009055506001016200030a565b5090565b600081519050620003398162000463565b92915050565b60008151905062000350816200047d565b92915050565b6000806040838503121562000370576200036f6200045e565b5b600062000380858286016200033f565b9250506020620003938582860162000328565b9150509250929050565b6000620003aa82620003d9565b9050919050565b6000620003be826200039d565b9050919050565b6000620003d2826200039d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200041257607f821691505b602082108114156200042957620004286200042f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200046e81620003b1565b81146200047a57600080fd5b50565b6200048881620003c5565b81146200049457600080fd5b50565b61541b80620004a76000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063b9c193951161007c578063b9c1939514610566578063c87b56dd14610582578063d4a25b4a146105b2578063e985e9c5146105ce578063f2fde38b146105fe576101fb565b806395d89b41146104f257806396bf265c14610510578063a22cb4651461052e578063b88d4fde1461054a576101fb565b80637d212979116100e95780637d2129791461048e5780637fb09a2e146104ac5780638da5cb5b146104b657806391860f78146104d4576101fb565b80636352211e1461040857806370a0823114610438578063715018a6146104685780637b47ec1a14610472576101fb565b8063274a32d3116101925780634c43db6a116101615780634c43db6a146103825780634f6ccce71461039e57806355f804b3146103ce5780635c975abb146103ea576101fb565b8063274a32d3146103225780632f745c591461032c5780633ccfd60b1461035c57806342842e0e14610366576101fb565b806309db3205116101ce57806309db32051461029a578063150b7a02146102b857806318160ddd146102e857806323b872dd14610306576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613be3565b61061a565b6040516102279190614345565b60405180910390f35b610238610694565b60405161024591906143b1565b60405180910390f35b61026860048036038101906102639190613c86565b610726565b6040516102759190614231565b60405180910390f35b61029860048036038101906102939190613b29565b61076c565b005b6102a2610884565b6040516102af9190614753565b60405180910390f35b6102d260048036038101906102cd91906139de565b61088a565b6040516102df9190614360565b60405180910390f35b6102f06108b8565b6040516102fd9190614753565b60405180910390f35b610320600480360381019061031b919061398b565b6108c5565b005b61032a610925565b005b61034660048036038101906103419190613b29565b61098f565b6040516103539190614753565b60405180910390f35b610364610a34565b005b610380600480360381019061037b919061398b565b610b05565b005b61039c60048036038101906103979190613c86565b610b25565b005b6103b860048036038101906103b39190613c86565b610b37565b6040516103c59190614753565b60405180910390f35b6103e860048036038101906103e39190613c3d565b610ba8565b005b6103f2610c01565b6040516103ff9190614345565b60405180910390f35b610422600480360381019061041d9190613c86565b610c18565b60405161042f9190614231565b60405180910390f35b610452600480360381019061044d91906138f1565b610cca565b60405161045f9190614753565b60405180910390f35b610470610d82565b005b61048c60048036038101906104879190613c86565b610d96565b005b610496610e22565b6040516104a39190614396565b60405180910390f35b6104b4610e48565b005b6104be6110d6565b6040516104cb9190614231565b60405180910390f35b6104dc611100565b6040516104e991906143b1565b60405180910390f35b6104fa61118e565b60405161050791906143b1565b60405180910390f35b610518611220565b604051610525919061437b565b60405180910390f35b61054860048036038101906105439190613ae9565b611246565b005b610564600480360381019061055f9190613a66565b61125c565b005b610580600480360381019061057b9190613b69565b6112be565b005b61059c60048036038101906105979190613c86565b6119cb565b6040516105a991906143b1565b60405180910390f35b6105cc60048036038101906105c79190613b69565b611a33565b005b6105e860048036038101906105e3919061394b565b611f9b565b6040516105f59190614345565b60405180910390f35b610618600480360381019061061391906138f1565b61202f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068d575061068c826120b3565b5b9050919050565b6060600080546106a390614a5c565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf90614a5c565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b5050505050905090565b600061073182612195565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077782610c18565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90614653565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108076121e0565b73ffffffffffffffffffffffffffffffffffffffff1614806108365750610835816108306121e0565b611f9b565b5b610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90614593565b60405180910390fd5b61087f83836121e8565b505050565b600c5481565b60007f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f905095945050505050565b6000600880549050905090565b6108d66108d06121e0565b826122a1565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c906146d3565b60405180910390fd5b610920838383612336565b505050565b61092d61259d565b610935610c01565b6109465761094161261b565b61094f565b61094e61267e565b5b7f71aa6dbdf1045ea9e6926a7848dbdd98d55270c4fee88cbc77fd816ccc8d6d2f610978610c01565b6040516109859190614345565b60405180910390a1565b600061099a83610cca565b82106109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d2906143f3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a3c61259d565b60004711610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690614693565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610aca573d6000803e3d6000fd5b507f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d81604051610afa9190614753565b60405180910390a150565b610b208383836040518060200160405280600081525061125c565b505050565b610b2d61259d565b80600c8190555050565b6000610b416108b8565b8210610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b79906146b3565b60405180910390fd5b60088281548110610b9657610b95614bf5565b5b90600052602060002001549050919050565b610bb061259d565b80600d9080519060200190610bc692919061361a565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa81604051610bf691906143b1565b60405180910390a150565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890614633565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290614553565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d8a61259d565b610d9460006126e1565b565b610da033826122a1565b610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690614573565b60405180910390fd5b610de8816127a7565b7f066548819fc4bd1208ea1c8608597593134d5661f459c2ef75cad30918af5a3381604051610e179190614753565b60405180910390a150565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e5061259d565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ead9190614231565b60206040518083038186803b158015610ec557600080fd5b505afa158015610ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efd9190613cb3565b11610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490614693565b60405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f9a9190614231565b60206040518083038186803b158015610fb257600080fd5b505afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea9190613cb3565b9050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110499291906142f8565b602060405180830381600087803b15801561106357600080fd5b505af1158015611077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109b9190613bb6565b507f19b1814119a1c09c79acf48e7ca4daaf2de685e7bdd8d6df968dad7c52f8a8e0816040516110cb9190614753565b60405180910390a150565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d805461110d90614a5c565b80601f016020809104026020016040519081016040528092919081815260200182805461113990614a5c565b80156111865780601f1061115b57610100808354040283529160200191611186565b820191906000526020600020905b81548152906001019060200180831161116957829003601f168201915b505050505081565b60606001805461119d90614a5c565b80601f01602080910402602001604051908101604052809291908181526020018280546111c990614a5c565b80156112165780601f106111eb57610100808354040283529160200191611216565b820191906000526020600020905b8154815290600101906020018083116111f957829003601f168201915b5050505050905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112586112516121e0565b83836128c4565b5050565b61126d6112676121e0565b836122a1565b6112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a3906146d3565b60405180910390fd5b6112b884848484612a31565b50505050565b6112c6612a8d565b60011515600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161132792919061424c565b60206040518083038186803b15801561133f57600080fd5b505afa158015611353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113779190613bb6565b1515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906144f3565b60405180910390fd5b6000600c54838390506113cc91906148d0565b905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161142c92919061424c565b60206040518083038186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c9190613cb3565b116114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b3906146f3565b60405180910390fd5b80600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115189190614231565b60206040518083038186803b15801561153057600080fd5b505afa158015611544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115689190613cb3565b10156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090614713565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161160893929190614275565b602060405180830381600087803b15801561162257600080fd5b505af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a9190613bb6565b5060005b8383905081101561198c573373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8686858181106116d1576116d0614bf5565b5b905060200201356040518263ffffffff1660e01b81526004016116f49190614753565b60206040518083038186803b15801561170c57600080fd5b505afa158015611720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611744919061391e565b73ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614733565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33308787868181106117ed576117ec614bf5565b5b905060200201356040518463ffffffff1660e01b815260040161181293929190614275565b600060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050506010600085858481811061185b5761185a614bf5565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611910573073ffffffffffffffffffffffffffffffffffffffff166342842e0e30338787868181106118b4576118b3614bf5565b5b905060200201356040518463ffffffff1660e01b81526004016118d993929190614275565b600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50505050611979565b6119333385858481811061192757611926614bf5565b5b90506020020135612ad7565b60016010600086868581811061194c5761194b614bf5565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061198490614abf565b91505061165e565b507f3b641cb5b3e4bc88faf66a779a292e930f5424a496564dc7922f48492db2016683836040516119be929190614321565b60405180910390a1505050565b60606119d682612195565b60006119e0612af5565b90506000815111611a005760405180602001604052806000815250611a2b565b80611a0a84612b87565b604051602001611a1b92919061420d565b6040516020818303038152906040525b915050919050565b611a3b612a8d565b60011515611a493330611f9b565b151514611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290614673565b60405180910390fd5b6000600c5483839050611a9e91906148d0565b905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611afe92919061424c565b60206040518083038186803b158015611b1657600080fd5b505afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e9190613cb3565b11611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590614493565b60405180910390fd5b80600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611bea9190614231565b60206040518083038186803b158015611c0257600080fd5b505afa158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190613cb3565b1015611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290614513565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611cda93929190614275565b602060405180830381600087803b158015611cf457600080fd5b505af1158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c9190613bb6565b5060005b83839050811015611e01573373ffffffffffffffffffffffffffffffffffffffff16611d74858584818110611d6857611d67614bf5565b5b90506020020135610c18565b73ffffffffffffffffffffffffffffffffffffffff1614611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc190614613565b60405180910390fd5b611dee3330868685818110611de257611de1614bf5565b5b90506020020135610b05565b8080611df990614abf565b915050611d30565b5060005b83839050811015611f5c573073ffffffffffffffffffffffffffffffffffffffff16611e49858584818110611e3d57611e3c614bf5565b5b90506020020135610c18565b73ffffffffffffffffffffffffffffffffffffffff1614611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e96906145d3565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033878786818110611ef257611ef1614bf5565b5b905060200201356040518463ffffffff1660e01b8152600401611f1793929190614275565b600060405180830381600087803b158015611f3157600080fd5b505af1158015611f45573d6000803e3d6000fd5b505050508080611f5490614abf565b915050611e05565b507fd8f7e36e64c9978cc2a53c8a91ea3b3acfc94cbf24fefb72cd55d80541ebc5068383604051611f8e929190614321565b60405180910390a1505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61203761259d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90614433565b60405180910390fd5b6120b0816126e1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061218e575061218d82612ce8565b5b9050919050565b61219e81612d52565b6121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490614633565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661225b83610c18565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806122ad83610c18565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122ef57506122ee8185611f9b565b5b8061232d57508373ffffffffffffffffffffffffffffffffffffffff1661231584610726565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661235682610c18565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614453565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561241c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612413906144b3565b60405180910390fd5b612427838383612dbe565b6124326000826121e8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612482919061492a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d99190614849565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612598838383612ed2565b505050565b6125a56121e0565b73ffffffffffffffffffffffffffffffffffffffff166125c36110d6565b73ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612610906145f3565b60405180910390fd5b565b612623612a8d565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126676121e0565b6040516126749190614231565b60405180910390a1565b612686612ed7565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126ca6121e0565b6040516126d79190614231565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127b282610c18565b90506127c081600084612dbe565b6127cb6000836121e8565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461281b919061492a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128c081600084612ed2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292a906144d3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a249190614345565b60405180910390a3505050565b612a3c848484612336565b612a4884848484612f20565b612a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7e90614413565b60405180910390fd5b50505050565b612a95610c01565b15612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc90614533565b60405180910390fd5b565b612af18282604051806020016040528060008152506130b7565b5050565b6060600d8054612b0490614a5c565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3090614a5c565b8015612b7d5780601f10612b5257610100808354040283529160200191612b7d565b820191906000526020600020905b815481529060010190602001808311612b6057829003601f168201915b5050505050905090565b60606000821415612bcf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ce3565b600082905060005b60008214612c01578080612bea90614abf565b915050600a82612bfa919061489f565b9150612bd7565b60008167ffffffffffffffff811115612c1d57612c1c614c24565b5b6040519080825280601f01601f191660200182016040528015612c4f5781602001600182028036833780820191505090505b5090505b60008514612cdc57600182612c68919061492a565b9150600a85612c779190614b08565b6030612c839190614849565b60f81b818381518110612c9957612c98614bf5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cd5919061489f565b9450612c53565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612dc9838383613112565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e0c57612e0781613117565b612e4b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e4a57612e498382613160565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e8e57612e89816132cd565b612ecd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ecc57612ecb828261339e565b5b5b505050565b505050565b612edf610c01565b612f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f15906143d3565b60405180910390fd5b565b6000612f418473ffffffffffffffffffffffffffffffffffffffff1661341d565b156130aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f6a6121e0565b8786866040518563ffffffff1660e01b8152600401612f8c94939291906142ac565b602060405180830381600087803b158015612fa657600080fd5b505af1925050508015612fd757506040513d601f19601f82011682018060405250810190612fd49190613c10565b60015b61305a573d8060008114613007576040519150601f19603f3d011682016040523d82523d6000602084013e61300c565b606091505b50600081511415613052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304990614413565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130af565b600190505b949350505050565b6130c18383613440565b6130ce6000848484612f20565b61310d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310490614413565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161316d84610cca565b613177919061492a565b905060006007600084815260200190815260200160002054905081811461325c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132e1919061492a565b905060006009600084815260200190815260200160002054905060006008838154811061331157613310614bf5565b5b90600052602060002001549050806008838154811061333357613332614bf5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061338257613381614bc6565b5b6001900381819060005260206000200160009055905550505050565b60006133a983610cca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a7906145b3565b60405180910390fd5b6134b981612d52565b156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f090614473565b60405180910390fd5b61350560008383612dbe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135559190614849565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461361660008383612ed2565b5050565b82805461362690614a5c565b90600052602060002090601f016020900481019282613648576000855561368f565b82601f1061366157805160ff191683800117855561368f565b8280016001018555821561368f579182015b8281111561368e578251825591602001919060010190613673565b5b50905061369c91906136a0565b5090565b5b808211156136b95760008160009055506001016136a1565b5090565b60006136d06136cb84614793565b61476e565b9050828152602081018484840111156136ec576136eb614c62565b5b6136f7848285614a1a565b509392505050565b600061371261370d846147c4565b61476e565b90508281526020810184848401111561372e5761372d614c62565b5b613739848285614a1a565b509392505050565b60008135905061375081615389565b92915050565b60008151905061376581615389565b92915050565b60008083601f84011261378157613780614c58565b5b8235905067ffffffffffffffff81111561379e5761379d614c53565b5b6020830191508360208202830111156137ba576137b9614c5d565b5b9250929050565b6000813590506137d0816153a0565b92915050565b6000815190506137e5816153a0565b92915050565b6000813590506137fa816153b7565b92915050565b60008151905061380f816153b7565b92915050565b60008083601f84011261382b5761382a614c58565b5b8235905067ffffffffffffffff81111561384857613847614c53565b5b60208301915083600182028301111561386457613863614c5d565b5b9250929050565b600082601f8301126138805761387f614c58565b5b81356138908482602086016136bd565b91505092915050565b600082601f8301126138ae576138ad614c58565b5b81356138be8482602086016136ff565b91505092915050565b6000813590506138d6816153ce565b92915050565b6000815190506138eb816153ce565b92915050565b60006020828403121561390757613906614c71565b5b600061391584828501613741565b91505092915050565b60006020828403121561393457613933614c71565b5b600061394284828501613756565b91505092915050565b6000806040838503121561396257613961614c71565b5b600061397085828601613741565b925050602061398185828601613741565b9150509250929050565b6000806000606084860312156139a4576139a3614c71565b5b60006139b286828701613741565b93505060206139c386828701613741565b92505060406139d4868287016138c7565b9150509250925092565b6000806000806000608086880312156139fa576139f9614c71565b5b6000613a0888828901613741565b9550506020613a1988828901613741565b9450506040613a2a888289016138c7565b935050606086013567ffffffffffffffff811115613a4b57613a4a614c67565b5b613a5788828901613815565b92509250509295509295909350565b60008060008060808587031215613a8057613a7f614c71565b5b6000613a8e87828801613741565b9450506020613a9f87828801613741565b9350506040613ab0878288016138c7565b925050606085013567ffffffffffffffff811115613ad157613ad0614c67565b5b613add8782880161386b565b91505092959194509250565b60008060408385031215613b0057613aff614c71565b5b6000613b0e85828601613741565b9250506020613b1f858286016137c1565b9150509250929050565b60008060408385031215613b4057613b3f614c71565b5b6000613b4e85828601613741565b9250506020613b5f858286016138c7565b9150509250929050565b60008060208385031215613b8057613b7f614c71565b5b600083013567ffffffffffffffff811115613b9e57613b9d614c67565b5b613baa8582860161376b565b92509250509250929050565b600060208284031215613bcc57613bcb614c71565b5b6000613bda848285016137d6565b91505092915050565b600060208284031215613bf957613bf8614c71565b5b6000613c07848285016137eb565b91505092915050565b600060208284031215613c2657613c25614c71565b5b6000613c3484828501613800565b91505092915050565b600060208284031215613c5357613c52614c71565b5b600082013567ffffffffffffffff811115613c7157613c70614c67565b5b613c7d84828501613899565b91505092915050565b600060208284031215613c9c57613c9b614c71565b5b6000613caa848285016138c7565b91505092915050565b600060208284031215613cc957613cc8614c71565b5b6000613cd7848285016138dc565b91505092915050565b613ce98161495e565b82525050565b6000613cfb838561480b565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613d2e57613d2d614c6c565b5b602083029250613d3f838584614a1a565b82840190509392505050565b613d5481614970565b82525050565b613d638161497c565b82525050565b6000613d74826147f5565b613d7e818561481c565b9350613d8e818560208601614a29565b613d9781614c76565b840191505092915050565b613dab816149d2565b82525050565b613dba816149e4565b82525050565b6000613dcb82614800565b613dd5818561482d565b9350613de5818560208601614a29565b613dee81614c76565b840191505092915050565b6000613e0482614800565b613e0e818561483e565b9350613e1e818560208601614a29565b80840191505092915050565b6000613e3760148361482d565b9150613e4282614c87565b602082019050919050565b6000613e5a602b8361482d565b9150613e6582614cb0565b604082019050919050565b6000613e7d60328361482d565b9150613e8882614cff565b604082019050919050565b6000613ea060268361482d565b9150613eab82614d4e565b604082019050919050565b6000613ec360258361482d565b9150613ece82614d9d565b604082019050919050565b6000613ee6601c8361482d565b9150613ef182614dec565b602082019050919050565b6000613f0960258361482d565b9150613f1482614e15565b604082019050919050565b6000613f2c60248361482d565b9150613f3782614e64565b604082019050919050565b6000613f4f60198361482d565b9150613f5a82614eb3565b602082019050919050565b6000613f72601c8361482d565b9150613f7d82614edc565b602082019050919050565b6000613f9560238361482d565b9150613fa082614f05565b604082019050919050565b6000613fb860108361482d565b9150613fc382614f54565b602082019050919050565b6000613fdb60298361482d565b9150613fe682614f7d565b604082019050919050565b6000613ffe602b8361482d565b915061400982614fcc565b604082019050919050565b6000614021603e8361482d565b915061402c8261501b565b604082019050919050565b600061404460208361482d565b915061404f8261506a565b602082019050919050565b600061406760238361482d565b915061407282615093565b604082019050919050565b600061408a60208361482d565b9150614095826150e2565b602082019050919050565b60006140ad601d8361482d565b91506140b88261510b565b602082019050919050565b60006140d060188361482d565b91506140db82615134565b602082019050919050565b60006140f360218361482d565b91506140fe8261515d565b604082019050919050565b6000614116601e8361482d565b9150614121826151ac565b602082019050919050565b600061413960318361482d565b9150614144826151d5565b604082019050919050565b600061415c602c8361482d565b915061416782615224565b604082019050919050565b600061417f602e8361482d565b915061418a82615273565b604082019050919050565b60006141a260238361482d565b91506141ad826152c2565b604082019050919050565b60006141c560218361482d565b91506141d082615311565b604082019050919050565b60006141e8601b8361482d565b91506141f382615360565b602082019050919050565b614207816149c8565b82525050565b60006142198285613df9565b91506142258284613df9565b91508190509392505050565b60006020820190506142466000830184613ce0565b92915050565b60006040820190506142616000830185613ce0565b61426e6020830184613ce0565b9392505050565b600060608201905061428a6000830186613ce0565b6142976020830185613ce0565b6142a460408301846141fe565b949350505050565b60006080820190506142c16000830187613ce0565b6142ce6020830186613ce0565b6142db60408301856141fe565b81810360608301526142ed8184613d69565b905095945050505050565b600060408201905061430d6000830185613ce0565b61431a60208301846141fe565b9392505050565b6000602082019050818103600083015261433c818486613cef565b90509392505050565b600060208201905061435a6000830184613d4b565b92915050565b60006020820190506143756000830184613d5a565b92915050565b60006020820190506143906000830184613da2565b92915050565b60006020820190506143ab6000830184613db1565b92915050565b600060208201905081810360008301526143cb8184613dc0565b905092915050565b600060208201905081810360008301526143ec81613e2a565b9050919050565b6000602082019050818103600083015261440c81613e4d565b9050919050565b6000602082019050818103600083015261442c81613e70565b9050919050565b6000602082019050818103600083015261444c81613e93565b9050919050565b6000602082019050818103600083015261446c81613eb6565b9050919050565b6000602082019050818103600083015261448c81613ed9565b9050919050565b600060208201905081810360008301526144ac81613efc565b9050919050565b600060208201905081810360008301526144cc81613f1f565b9050919050565b600060208201905081810360008301526144ec81613f42565b9050919050565b6000602082019050818103600083015261450c81613f65565b9050919050565b6000602082019050818103600083015261452c81613f88565b9050919050565b6000602082019050818103600083015261454c81613fab565b9050919050565b6000602082019050818103600083015261456c81613fce565b9050919050565b6000602082019050818103600083015261458c81613ff1565b9050919050565b600060208201905081810360008301526145ac81614014565b9050919050565b600060208201905081810360008301526145cc81614037565b9050919050565b600060208201905081810360008301526145ec8161405a565b9050919050565b6000602082019050818103600083015261460c8161407d565b9050919050565b6000602082019050818103600083015261462c816140a0565b9050919050565b6000602082019050818103600083015261464c816140c3565b9050919050565b6000602082019050818103600083015261466c816140e6565b9050919050565b6000602082019050818103600083015261468c81614109565b9050919050565b600060208201905081810360008301526146ac8161412c565b9050919050565b600060208201905081810360008301526146cc8161414f565b9050919050565b600060208201905081810360008301526146ec81614172565b9050919050565b6000602082019050818103600083015261470c81614195565b9050919050565b6000602082019050818103600083015261472c816141b8565b9050919050565b6000602082019050818103600083015261474c816141db565b9050919050565b600060208201905061476860008301846141fe565b92915050565b6000614778614789565b90506147848282614a8e565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ae576147ad614c24565b5b6147b782614c76565b9050602081019050919050565b600067ffffffffffffffff8211156147df576147de614c24565b5b6147e882614c76565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614854826149c8565b915061485f836149c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561489457614893614b39565b5b828201905092915050565b60006148aa826149c8565b91506148b5836149c8565b9250826148c5576148c4614b68565b5b828204905092915050565b60006148db826149c8565b91506148e6836149c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561491f5761491e614b39565b5b828202905092915050565b6000614935826149c8565b9150614940836149c8565b92508282101561495357614952614b39565b5b828203905092915050565b6000614969826149a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149dd826149f6565b9050919050565b60006149ef826149f6565b9050919050565b6000614a0182614a08565b9050919050565b6000614a13826149a8565b9050919050565b82818337600083830152505050565b60005b83811015614a47578082015181840152602081019050614a2c565b83811115614a56576000848401525b50505050565b60006002820490506001821680614a7457607f821691505b60208210811415614a8857614a87614b97565b5b50919050565b614a9782614c76565b810181811067ffffffffffffffff82111715614ab657614ab5614c24565b5b80604052505050565b6000614aca826149c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614afd57614afc614b39565b5b600182019050919050565b6000614b13826149c8565b9150614b1e836149c8565b925082614b2e57614b2d614b68565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f756e6d75746174653a20696e73756666696369656e7420474c585920616c6c6f60008201527f77616e6365000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6d75746174653a204e6f7420617070726f76656420666f7220616c6c00000000600082015250565b7f756e6d75746174653a20696e73756666696369656e7420474c58592062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6275726e546f6b656e3a2063616c6c6572206973206e6f74206f776e6572206e60008201527f6f7220617070726f766564000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f756e6d75746174653a2073656e646572206973206e6f74206f776e6572206f6660008201527f2069640000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f756e6d75746174653a2073656e646572206973206e6f74206f776e6572000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e6d75746174653a204e6f7420617070726f76656420666f7220616c6c0000600082015250565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f6d75746174653a20696e73756666696369656e7420474c585920616c6c6f776160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f6d75746174653a20696e73756666696369656e7420474c58592062616c616e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f6d75746174653a2073656e646572206973206e6f74206f776e65720000000000600082015250565b6153928161495e565b811461539d57600080fd5b50565b6153a981614970565b81146153b457600080fd5b50565b6153c08161497c565b81146153cb57600080fd5b50565b6153d7816149c8565b81146153e257600080fd5b5056fea2646970667358221220dd42f0efa46229ffd121f14998fd7a8e3e2884f82045c3196ceb5fc86486f41e64736f6c63430008070033000000000000000000000000b340c91182b9ff831bb36232cb3296ed306c79b2000000000000000000000000a8652b3f8193002fc15cc8171877158f9709ce67

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

000000000000000000000000b340c91182b9ff831bb36232cb3296ed306c79b2000000000000000000000000a8652b3f8193002fc15cc8171877158f9709ce67

-----Decoded View---------------
Arg [0] : _badContract (address): 0xb340c91182b9ff831bb36232cb3296ed306c79b2
Arg [1] : _glxyToken (address): 0xa8652b3f8193002fc15cc8171877158f9709ce67

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b340c91182b9ff831bb36232cb3296ed306c79b2
Arg [1] : 000000000000000000000000a8652b3f8193002fc15cc8171877158f9709ce67


Deployed ByteCode Sourcemap

53228:4772:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40189:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26923:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28436:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27953:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53388:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56846:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40829:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29136:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57134:146;;;:::i;:::-;;40497:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57720:277;;;:::i;:::-;;29543:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57288:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41019:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54423:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48010:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26634:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26365:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50875:103;;;:::i;:::-;;56611:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53520:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57399:313;;;:::i;:::-;;50227:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53470:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27092:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53599:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28679:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29799:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54556:1042;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27267:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55606:997;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28905:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51133:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40189:224;40291:4;40330:35;40315:50;;;:11;:50;;;;:90;;;;40369:36;40393:11;40369:23;:36::i;:::-;40315:90;40308:97;;40189:224;;;:::o;26923:100::-;26977:13;27010:5;27003:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26923:100;:::o;28436:171::-;28512:7;28532:23;28547:7;28532:14;:23::i;:::-;28575:15;:24;28591:7;28575:24;;;;;;;;;;;;;;;;;;;;;28568:31;;28436:171;;;:::o;27953:417::-;28034:13;28050:23;28065:7;28050:14;:23::i;:::-;28034:39;;28098:5;28092:11;;:2;:11;;;;28084:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28192:5;28176:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28201:37;28218:5;28225:12;:10;:12::i;:::-;28201:16;:37::i;:::-;28176:62;28154:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28341:21;28350:2;28354:7;28341:8;:21::i;:::-;28023:347;27953:417;;:::o;53388:42::-;;;;:::o;56846:193::-;56937:6;56970:60;56956:75;;56846:193;;;;;;;:::o;40829:113::-;40890:7;40917:10;:17;;;;40910:24;;40829:113;:::o;29136:336::-;29331:41;29350:12;:10;:12::i;:::-;29364:7;29331:18;:41::i;:::-;29323:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29436:28;29446:4;29452:2;29456:7;29436:9;:28::i;:::-;29136:336;;;:::o;57134:146::-;50113:13;:11;:13::i;:::-;57194:8:::1;:6;:8::i;:::-;:32;;57218:8;:6;:8::i;:::-;57194:32;;;57205:10;:8;:10::i;:::-;57194:32;57242:29;57262:8;:6;:8::i;:::-;57242:29;;;;;;:::i;:::-;;;;;;;;57134:146::o:0;40497:256::-;40594:7;40630:23;40647:5;40630:16;:23::i;:::-;40622:5;:31;40614:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40719:12;:19;40732:5;40719:19;;;;;;;;;;;;;;;:26;40739:5;40719:26;;;;;;;;;;;;40712:33;;40497:256;;;;:::o;57720:277::-;50113:13;:11;:13::i;:::-;57802:1:::1;57778:21;:25;57770:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57869:15;57887:21;57869:39;;57927:10;57919:28;;:37;57948:7;57919:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57972:17;57981:7;57972:17;;;;;;:::i;:::-;;;;;;;;57759:238;57720:277::o:0;29543:185::-;29681:39;29698:4;29704:2;29708:7;29681:39;;;;;;;;;;;;:16;:39::i;:::-;29543:185;;;:::o;57288:103::-;50113:13;:11;:13::i;:::-;57376:7:::1;57361:12;:22;;;;57288:103:::0;:::o;41019:233::-;41094:7;41130:30;:28;:30::i;:::-;41122:5;:38;41114:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41227:10;41238:5;41227:17;;;;;;;;:::i;:::-;;;;;;;;;;41220:24;;41019:233;;;:::o;54423:125::-;50113:13;:11;:13::i;:::-;54504:4:::1;54491:10;:17;;;;;;;;;;;;:::i;:::-;;54524:16;54535:4;54524:16;;;;;;:::i;:::-;;;;;;;;54423:125:::0;:::o;48010:86::-;48057:4;48081:7;;;;;;;;;;;48074:14;;48010:86;:::o;26634:222::-;26706:7;26726:13;26742:7;:16;26750:7;26742:16;;;;;;;;;;;;;;;;;;;;;26726:32;;26794:1;26777:19;;:5;:19;;;;26769:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26843:5;26836:12;;;26634:222;;;:::o;26365:207::-;26437:7;26482:1;26465:19;;:5;:19;;;;26457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26548:9;:16;26558:5;26548:16;;;;;;;;;;;;;;;;26541:23;;26365:207;;;:::o;50875:103::-;50113:13;:11;:13::i;:::-;50940:30:::1;50967:1;50940:18;:30::i;:::-;50875:103::o:0;56611:227::-;56683:39;56702:10;56714:7;56683:18;:39::i;:::-;56675:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;56782:14;56788:7;56782:5;:14::i;:::-;56812:18;56822:7;56812:18;;;;;;:::i;:::-;;;;;;;;56611:227;:::o;53520:26::-;;;;;;;;;;;;;:::o;57399:313::-;50113:13;:11;:13::i;:::-;57498:1:::1;57461:9;;;;;;;;;;;:19;;;57489:4;57461:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;57453:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;57565:15;57583:9;;;;;;;;;;;:19;;;57611:4;57583:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57565:52;;57628:9;;;;;;;;;;;:18;;;57647:10;57659:7;57628:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57683:21;57696:7;57683:21;;;;;;:::i;:::-;;;;;;;;57442:270;57399:313::o:0;50227:87::-;50273:7;50300:6;;;;;;;;;;;50293:13;;50227:87;:::o;53470:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27092:104::-;27148:13;27181:7;27174:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27092:104;:::o;53599:23::-;;;;;;;;;;;;;:::o;28679:155::-;28774:52;28793:12;:10;:12::i;:::-;28807:8;28817;28774:18;:52::i;:::-;28679:155;;:::o;29799:323::-;29973:41;29992:12;:10;:12::i;:::-;30006:7;29973:18;:41::i;:::-;29965:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30076:38;30090:4;30096:2;30100:7;30109:4;30076:13;:38::i;:::-;29799:323;;;;:::o;54556:1042::-;47615:19;:17;:19::i;:::-;54697:4:::1;54638:63;;:11;;;;;;;;;;;:28;;;54667:10;54687:4;54638:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;;54630:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;54745:12;54773;;54760:3;;:10;;:25;;;;:::i;:::-;54745:40;;54853:4;54804:9;;;;;;;;;;;:19;;;54824:10;54844:4;54804:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;54796:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;54951:4;54916:9;;;;;;;;;;;:19;;;54936:10;54916:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;54908:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55006:9;;;;;;;;;;;:22;;;55029:10;55049:4;55056;55006:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55081:6;55076:486;55097:3;;:10;;55093:1;:14;55076:486;;;55168:10;55137:41;;:11;;;;;;;;;;;:19;;;55157:3;;55161:1;55157:6;;;;;;;:::i;:::-;;;;;;;;55137:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;55129:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55225:11;;;;;;;;;;;:28;;;55254:10;55274:4;55281:3;;55285:1;55281:6;;;;;;;:::i;:::-;;;;;;;;55225:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55308:10;:18;55319:3;;55323:1;55319:6;;;;;;;:::i;:::-;;;;;;;;55308:18;;;;;;;;;;;;;;;;;;;;;55305:246;;;55363:4;55347:39;;;55395:4;55402:10;55414:3;;55418:1;55414:6;;;;;;;:::i;:::-;;;;;;;;55347:74;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55305:246;;;55462:29;55472:10;55484:3;;55488:1;55484:6;;;;;;;:::i;:::-;;;;;;;;55462:9;:29::i;:::-;55531:4;55510:10;:18;55521:3;;55525:1;55521:6;;;;;;;:::i;:::-;;;;;;;;55510:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;55305:246;55109:3;;;;;:::i;:::-;;;;55076:486;;;;55579:11;55586:3;;55579:11;;;;;;;:::i;:::-;;;;;;;;54619:979;54556:1042:::0;;:::o;27267:281::-;27340:13;27366:23;27381:7;27366:14;:23::i;:::-;27402:21;27426:10;:8;:10::i;:::-;27402:34;;27478:1;27460:7;27454:21;:25;:86;;;;;;;;;;;;;;;;;27506:7;27515:18;:7;:16;:18::i;:::-;27489:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27454:86;27447:93;;;27267:281;;;:::o;55606:997::-;47615:19;:17;:19::i;:::-;55737:4:::1;55690:51;;:43;55707:10;55727:4;55690:16;:43::i;:::-;:51;;;55682:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55787:12;55815;;55802:3;;:10;;:25;;;;:::i;:::-;55787:40;;55895:4;55846:9;;;;;;;;;;;:19;;;55866:10;55886:4;55846:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;55838:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55995:4;55960:9;;;;;;;;;;;:19;;;55980:10;55960:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;55952:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56060:9;;;;;;;;;;;:22;;;56083:10;56103:4;56110;56060:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56133:6;56128:202;56149:3;;:10;;56145:1;:14;56128:202;;;56208:10;56189:29;;:15;56197:3;;56201:1;56197:6;;;;;;;:::i;:::-;;;;;;;;56189:7;:15::i;:::-;:29;;;56181:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56267:51;56284:10;56304:4;56311:3;;56315:1;56311:6;;;;;;;:::i;:::-;;;;;;;;56267:16;:51::i;:::-;56161:3;;;;;:::i;:::-;;;;56128:202;;;;56347:6;56342:223;56363:3;;:10;;56359:1;:14;56342:223;;;56430:4;56403:32;;:15;56411:3;;56415:1;56411:6;;;;;;;:::i;:::-;;;;;;;;56403:7;:15::i;:::-;:32;;;56395:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;56490:11;;;;;;;;;;;:28;;;56527:4;56534:10;56546:3;;56550:1;56546:6;;;;;;;:::i;:::-;;;;;;;;56490:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56375:3;;;;;:::i;:::-;;;;56342:223;;;;56582:13;56591:3;;56582:13;;;;;;;:::i;:::-;;;;;;;;55671:932;55606:997:::0;;:::o;28905:164::-;29002:4;29026:18;:25;29045:5;29026:25;;;;;;;;;;;;;;;:35;29052:8;29026:35;;;;;;;;;;;;;;;;;;;;;;;;;29019:42;;28905:164;;;;:::o;51133:201::-;50113:13;:11;:13::i;:::-;51242:1:::1;51222:22;;:8;:22;;;;51214:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51298:28;51317:8;51298:18;:28::i;:::-;51133:201:::0;:::o;25996:305::-;26098:4;26150:25;26135:40;;;:11;:40;;;;:105;;;;26207:33;26192:48;;;:11;:48;;;;26135:105;:158;;;;26257:36;26281:11;26257:23;:36::i;:::-;26135:158;26115:178;;25996:305;;;:::o;36411:135::-;36493:16;36501:7;36493;:16::i;:::-;36485:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36411:135;:::o;24375:98::-;24428:7;24455:10;24448:17;;24375:98;:::o;35690:174::-;35792:2;35765:15;:24;35781:7;35765:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35848:7;35844:2;35810:46;;35819:23;35834:7;35819:14;:23::i;:::-;35810:46;;;;;;;;;;;;35690:174;;:::o;31923:264::-;32016:4;32033:13;32049:23;32064:7;32049:14;:23::i;:::-;32033:39;;32102:5;32091:16;;:7;:16;;;:52;;;;32111:32;32128:5;32135:7;32111:16;:32::i;:::-;32091:52;:87;;;;32171:7;32147:31;;:20;32159:7;32147:11;:20::i;:::-;:31;;;32091:87;32083:96;;;31923:264;;;;:::o;34946:625::-;35105:4;35078:31;;:23;35093:7;35078:14;:23::i;:::-;:31;;;35070:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35184:1;35170:16;;:2;:16;;;;35162:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35240:39;35261:4;35267:2;35271:7;35240:20;:39::i;:::-;35344:29;35361:1;35365:7;35344:8;:29::i;:::-;35405:1;35386:9;:15;35396:4;35386:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35434:1;35417:9;:13;35427:2;35417:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35465:2;35446:7;:16;35454:7;35446:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35504:7;35500:2;35485:27;;35494:4;35485:27;;;;;;;;;;;;35525:38;35545:4;35551:2;35555:7;35525:19;:38::i;:::-;34946:625;;;:::o;50392:132::-;50467:12;:10;:12::i;:::-;50456:23;;:7;:5;:7::i;:::-;:23;;;50448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50392:132::o;48606:118::-;47615:19;:17;:19::i;:::-;48676:4:::1;48666:7;;:14;;;;;;;;;;;;;;;;;;48696:20;48703:12;:10;:12::i;:::-;48696:20;;;;;;:::i;:::-;;;;;;;;48606:118::o:0;48865:120::-;47874:16;:14;:16::i;:::-;48934:5:::1;48924:7;;:15;;;;;;;;;;;;;;;;;;48955:22;48964:12;:10;:12::i;:::-;48955:22;;;;;;:::i;:::-;;;;;;;;48865:120::o:0;51494:191::-;51568:16;51587:6;;;;;;;;;;;51568:25;;51613:8;51604:6;;:17;;;;;;;;;;;;;;;;;;51668:8;51637:40;;51658:8;51637:40;;;;;;;;;;;;51557:128;51494:191;:::o;34189:420::-;34249:13;34265:23;34280:7;34265:14;:23::i;:::-;34249:39;;34301:48;34322:5;34337:1;34341:7;34301:20;:48::i;:::-;34390:29;34407:1;34411:7;34390:8;:29::i;:::-;34452:1;34432:9;:16;34442:5;34432:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34471:7;:16;34479:7;34471:16;;;;;;;;;;;;34464:23;;;;;;;;;;;34533:7;34529:1;34505:36;;34514:5;34505:36;;;;;;;;;;;;34554:47;34574:5;34589:1;34593:7;34554:19;:47::i;:::-;34238:371;34189:420;:::o;36007:315::-;36162:8;36153:17;;:5;:17;;;;36145:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36249:8;36211:18;:25;36230:5;36211:25;;;;;;;;;;;;;;;:35;36237:8;36211:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36295:8;36273:41;;36288:5;36273:41;;;36305:8;36273:41;;;;;;:::i;:::-;;;;;;;;36007:315;;;:::o;31003:313::-;31159:28;31169:4;31175:2;31179:7;31159:9;:28::i;:::-;31206:47;31229:4;31235:2;31239:7;31248:4;31206:22;:47::i;:::-;31198:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31003:313;;;;:::o;48169:108::-;48240:8;:6;:8::i;:::-;48239:9;48231:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48169:108::o;32529:110::-;32605:26;32615:2;32619:7;32605:26;;;;;;;;;;;;:9;:26::i;:::-;32529:110;;:::o;54312:103::-;54364:13;54397:10;54390:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54312:103;:::o;3309:723::-;3365:13;3595:1;3586:5;:10;3582:53;;;3613:10;;;;;;;;;;;;;;;;;;;;;3582:53;3645:12;3660:5;3645:20;;3676:14;3701:78;3716:1;3708:4;:9;3701:78;;3734:8;;;;;:::i;:::-;;;;3765:2;3757:10;;;;;:::i;:::-;;;3701:78;;;3789:19;3821:6;3811:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3789:39;;3839:154;3855:1;3846:5;:10;3839:154;;3883:1;3873:11;;;;;:::i;:::-;;;3950:2;3942:5;:10;;;;:::i;:::-;3929:2;:24;;;;:::i;:::-;3916:39;;3899:6;3906;3899:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3979:2;3970:11;;;;;:::i;:::-;;;3839:154;;;4017:6;4003:21;;;;;3309:723;;;;:::o;16765:157::-;16850:4;16889:25;16874:40;;;:11;:40;;;;16867:47;;16765:157;;;:::o;31629:127::-;31694:4;31746:1;31718:30;;:7;:16;31726:7;31718:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31711:37;;31629:127;;;:::o;41865:589::-;42009:45;42036:4;42042:2;42046:7;42009:26;:45::i;:::-;42087:1;42071:18;;:4;:18;;;42067:187;;;42106:40;42138:7;42106:31;:40::i;:::-;42067:187;;;42176:2;42168:10;;:4;:10;;;42164:90;;42195:47;42228:4;42234:7;42195:32;:47::i;:::-;42164:90;42067:187;42282:1;42268:16;;:2;:16;;;42264:183;;;42301:45;42338:7;42301:36;:45::i;:::-;42264:183;;;42374:4;42368:10;;:2;:10;;;42364:83;;42395:40;42423:2;42427:7;42395:27;:40::i;:::-;42364:83;42264:183;41865:589;;;:::o;39046:125::-;;;;:::o;48354:108::-;48421:8;:6;:8::i;:::-;48413:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48354:108::o;37110:853::-;37264:4;37285:15;:2;:13;;;:15::i;:::-;37281:675;;;37337:2;37321:36;;;37358:12;:10;:12::i;:::-;37372:4;37378:7;37387:4;37321:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37317:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37579:1;37562:6;:13;:18;37558:328;;;37605:60;;;;;;;;;;:::i;:::-;;;;;;;;37558:328;37836:6;37830:13;37821:6;37817:2;37813:15;37806:38;37317:584;37453:41;;;37443:51;;;:6;:51;;;;37436:58;;;;;37281:675;37940:4;37933:11;;37110:853;;;;;;;:::o;32866:319::-;32995:18;33001:2;33005:7;32995:5;:18::i;:::-;33046:53;33077:1;33081:2;33085:7;33094:4;33046:22;:53::i;:::-;33024:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32866:319;;;:::o;38535:126::-;;;;:::o;43177:164::-;43281:10;:17;;;;43254:15;:24;43270:7;43254:24;;;;;;;;;;;:44;;;;43309:10;43325:7;43309:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43177:164;:::o;43968:988::-;44234:22;44284:1;44259:22;44276:4;44259:16;:22::i;:::-;:26;;;;:::i;:::-;44234:51;;44296:18;44317:17;:26;44335:7;44317:26;;;;;;;;;;;;44296:47;;44464:14;44450:10;:28;44446:328;;44495:19;44517:12;:18;44530:4;44517:18;;;;;;;;;;;;;;;:34;44536:14;44517:34;;;;;;;;;;;;44495:56;;44601:11;44568:12;:18;44581:4;44568:18;;;;;;;;;;;;;;;:30;44587:10;44568:30;;;;;;;;;;;:44;;;;44718:10;44685:17;:30;44703:11;44685:30;;;;;;;;;;;:43;;;;44480:294;44446:328;44870:17;:26;44888:7;44870:26;;;;;;;;;;;44863:33;;;44914:12;:18;44927:4;44914:18;;;;;;;;;;;;;;;:34;44933:14;44914:34;;;;;;;;;;;44907:41;;;44049:907;;43968:988;;:::o;45251:1079::-;45504:22;45549:1;45529:10;:17;;;;:21;;;;:::i;:::-;45504:46;;45561:18;45582:15;:24;45598:7;45582:24;;;;;;;;;;;;45561:45;;45933:19;45955:10;45966:14;45955:26;;;;;;;;:::i;:::-;;;;;;;;;;45933:48;;46019:11;45994:10;46005;45994:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46130:10;46099:15;:28;46115:11;46099:28;;;;;;;;;;;:41;;;;46271:15;:24;46287:7;46271:24;;;;;;;;;;;46264:31;;;46306:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45322:1008;;;45251:1079;:::o;42755:221::-;42840:14;42857:20;42874:2;42857:16;:20::i;:::-;42840:37;;42915:7;42888:12;:16;42901:2;42888:16;;;;;;;;;;;;;;;:24;42905:6;42888:24;;;;;;;;;;;:34;;;;42962:6;42933:17;:26;42951:7;42933:26;;;;;;;;;;;:35;;;;42829:147;42755:221;;:::o;6609:326::-;6669:4;6926:1;6904:7;:19;;;:23;6897:30;;6609:326;;;:::o;33521:439::-;33615:1;33601:16;;:2;:16;;;;33593:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33674:16;33682:7;33674;:16::i;:::-;33673:17;33665:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33736:45;33765:1;33769:2;33773:7;33736:20;:45::i;:::-;33811:1;33794:9;:13;33804:2;33794:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33842:2;33823:7;:16;33831:7;33823:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33887:7;33883:2;33862:33;;33879:1;33862:33;;;;;;;;;;;;33908:44;33936:1;33940:2;33944:7;33908:19;:44::i;:::-;33521:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1152:568::-;1225:8;1235:6;1285:3;1278:4;1270:6;1266:17;1262:27;1252:122;;1293:79;;:::i;:::-;1252:122;1406:6;1393:20;1383:30;;1436:18;1428:6;1425:30;1422:117;;;1458:79;;:::i;:::-;1422:117;1572:4;1564:6;1560:17;1548:29;;1626:3;1618:4;1610:6;1606:17;1596:8;1592:32;1589:41;1586:128;;;1633:79;;:::i;:::-;1586:128;1152:568;;;;;:::o;1726:133::-;1769:5;1807:6;1794:20;1785:29;;1823:30;1847:5;1823:30;:::i;:::-;1726:133;;;;:::o;1865:137::-;1919:5;1950:6;1944:13;1935:22;;1966:30;1990:5;1966:30;:::i;:::-;1865:137;;;;:::o;2008:::-;2053:5;2091:6;2078:20;2069:29;;2107:32;2133:5;2107:32;:::i;:::-;2008:137;;;;:::o;2151:141::-;2207:5;2238:6;2232:13;2223:22;;2254:32;2280:5;2254:32;:::i;:::-;2151:141;;;;:::o;2311:552::-;2368:8;2378:6;2428:3;2421:4;2413:6;2409:17;2405:27;2395:122;;2436:79;;:::i;:::-;2395:122;2549:6;2536:20;2526:30;;2579:18;2571:6;2568:30;2565:117;;;2601:79;;:::i;:::-;2565:117;2715:4;2707:6;2703:17;2691:29;;2769:3;2761:4;2753:6;2749:17;2739:8;2735:32;2732:41;2729:128;;;2776:79;;:::i;:::-;2729:128;2311:552;;;;;:::o;2882:338::-;2937:5;2986:3;2979:4;2971:6;2967:17;2963:27;2953:122;;2994:79;;:::i;:::-;2953:122;3111:6;3098:20;3136:78;3210:3;3202:6;3195:4;3187:6;3183:17;3136:78;:::i;:::-;3127:87;;2943:277;2882:338;;;;:::o;3240:340::-;3296:5;3345:3;3338:4;3330:6;3326:17;3322:27;3312:122;;3353:79;;:::i;:::-;3312:122;3470:6;3457:20;3495:79;3570:3;3562:6;3555:4;3547:6;3543:17;3495:79;:::i;:::-;3486:88;;3302:278;3240:340;;;;:::o;3586:139::-;3632:5;3670:6;3657:20;3648:29;;3686:33;3713:5;3686:33;:::i;:::-;3586:139;;;;:::o;3731:143::-;3788:5;3819:6;3813:13;3804:22;;3835:33;3862:5;3835:33;:::i;:::-;3731:143;;;;:::o;3880:329::-;3939:6;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;3880:329;;;;:::o;4215:351::-;4285:6;4334:2;4322:9;4313:7;4309:23;4305:32;4302:119;;;4340:79;;:::i;:::-;4302:119;4460:1;4485:64;4541:7;4532:6;4521:9;4517:22;4485:64;:::i;:::-;4475:74;;4431:128;4215:351;;;;:::o;4572:474::-;4640:6;4648;4697:2;4685:9;4676:7;4672:23;4668:32;4665:119;;;4703:79;;:::i;:::-;4665:119;4823:1;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4794:117;4950:2;4976:53;5021:7;5012:6;5001:9;4997:22;4976:53;:::i;:::-;4966:63;;4921:118;4572:474;;;;;:::o;5052:619::-;5129:6;5137;5145;5194:2;5182:9;5173:7;5169:23;5165:32;5162:119;;;5200:79;;:::i;:::-;5162:119;5320:1;5345:53;5390:7;5381:6;5370:9;5366:22;5345:53;:::i;:::-;5335:63;;5291:117;5447:2;5473:53;5518:7;5509:6;5498:9;5494:22;5473:53;:::i;:::-;5463:63;;5418:118;5575:2;5601:53;5646:7;5637:6;5626:9;5622:22;5601:53;:::i;:::-;5591:63;;5546:118;5052:619;;;;;:::o;5677:963::-;5774:6;5782;5790;5798;5806;5855:3;5843:9;5834:7;5830:23;5826:33;5823:120;;;5862:79;;:::i;:::-;5823:120;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;6237:2;6263:53;6308:7;6299:6;6288:9;6284:22;6263:53;:::i;:::-;6253:63;;6208:118;6393:2;6382:9;6378:18;6365:32;6424:18;6416:6;6413:30;6410:117;;;6446:79;;:::i;:::-;6410:117;6559:64;6615:7;6606:6;6595:9;6591:22;6559:64;:::i;:::-;6541:82;;;;6336:297;5677:963;;;;;;;;:::o;6646:943::-;6741:6;6749;6757;6765;6814:3;6802:9;6793:7;6789:23;6785:33;6782:120;;;6821:79;;:::i;:::-;6782:120;6941:1;6966:53;7011:7;7002:6;6991:9;6987:22;6966:53;:::i;:::-;6956:63;;6912:117;7068:2;7094:53;7139:7;7130:6;7119:9;7115:22;7094:53;:::i;:::-;7084:63;;7039:118;7196:2;7222:53;7267:7;7258:6;7247:9;7243:22;7222:53;:::i;:::-;7212:63;;7167:118;7352:2;7341:9;7337:18;7324:32;7383:18;7375:6;7372:30;7369:117;;;7405:79;;:::i;:::-;7369:117;7510:62;7564:7;7555:6;7544:9;7540:22;7510:62;:::i;:::-;7500:72;;7295:287;6646:943;;;;;;;:::o;7595:468::-;7660:6;7668;7717:2;7705:9;7696:7;7692:23;7688:32;7685:119;;;7723:79;;:::i;:::-;7685:119;7843:1;7868:53;7913:7;7904:6;7893:9;7889:22;7868:53;:::i;:::-;7858:63;;7814:117;7970:2;7996:50;8038:7;8029:6;8018:9;8014:22;7996:50;:::i;:::-;7986:60;;7941:115;7595:468;;;;;:::o;8069:474::-;8137:6;8145;8194:2;8182:9;8173:7;8169:23;8165:32;8162:119;;;8200:79;;:::i;:::-;8162:119;8320:1;8345:53;8390:7;8381:6;8370:9;8366:22;8345:53;:::i;:::-;8335:63;;8291:117;8447:2;8473:53;8518:7;8509:6;8498:9;8494:22;8473:53;:::i;:::-;8463:63;;8418:118;8069:474;;;;;:::o;8549:559::-;8635:6;8643;8692:2;8680:9;8671:7;8667:23;8663:32;8660:119;;;8698:79;;:::i;:::-;8660:119;8846:1;8835:9;8831:17;8818:31;8876:18;8868:6;8865:30;8862:117;;;8898:79;;:::i;:::-;8862:117;9011:80;9083:7;9074:6;9063:9;9059:22;9011:80;:::i;:::-;8993:98;;;;8789:312;8549:559;;;;;:::o;9114:345::-;9181:6;9230:2;9218:9;9209:7;9205:23;9201:32;9198:119;;;9236:79;;:::i;:::-;9198:119;9356:1;9381:61;9434:7;9425:6;9414:9;9410:22;9381:61;:::i;:::-;9371:71;;9327:125;9114:345;;;;:::o;9465:327::-;9523:6;9572:2;9560:9;9551:7;9547:23;9543:32;9540:119;;;9578:79;;:::i;:::-;9540:119;9698:1;9723:52;9767:7;9758:6;9747:9;9743:22;9723:52;:::i;:::-;9713:62;;9669:116;9465:327;;;;:::o;9798:349::-;9867:6;9916:2;9904:9;9895:7;9891:23;9887:32;9884:119;;;9922:79;;:::i;:::-;9884:119;10042:1;10067:63;10122:7;10113:6;10102:9;10098:22;10067:63;:::i;:::-;10057:73;;10013:127;9798:349;;;;:::o;10153:509::-;10222:6;10271:2;10259:9;10250:7;10246:23;10242:32;10239:119;;;10277:79;;:::i;:::-;10239:119;10425:1;10414:9;10410:17;10397:31;10455:18;10447:6;10444:30;10441:117;;;10477:79;;:::i;:::-;10441:117;10582:63;10637:7;10628:6;10617:9;10613:22;10582:63;:::i;:::-;10572:73;;10368:287;10153:509;;;;:::o;10668:329::-;10727:6;10776:2;10764:9;10755:7;10751:23;10747:32;10744:119;;;10782:79;;:::i;:::-;10744:119;10902:1;10927:53;10972:7;10963:6;10952:9;10948:22;10927:53;:::i;:::-;10917:63;;10873:117;10668:329;;;;:::o;11003:351::-;11073:6;11122:2;11110:9;11101:7;11097:23;11093:32;11090:119;;;11128:79;;:::i;:::-;11090:119;11248:1;11273:64;11329:7;11320:6;11309:9;11305:22;11273:64;:::i;:::-;11263:74;;11219:128;11003:351;;;;:::o;11360:118::-;11447:24;11465:5;11447:24;:::i;:::-;11442:3;11435:37;11360:118;;:::o;11514:537::-;11642:3;11663:86;11742:6;11737:3;11663:86;:::i;:::-;11656:93;;11773:66;11765:6;11762:78;11759:165;;;11843:79;;:::i;:::-;11759:165;11955:4;11947:6;11943:17;11933:27;;11970:43;12006:6;12001:3;11994:5;11970:43;:::i;:::-;12038:6;12033:3;12029:16;12022:23;;11514:537;;;;;:::o;12057:109::-;12138:21;12153:5;12138:21;:::i;:::-;12133:3;12126:34;12057:109;;:::o;12172:115::-;12257:23;12274:5;12257:23;:::i;:::-;12252:3;12245:36;12172:115;;:::o;12293:360::-;12379:3;12407:38;12439:5;12407:38;:::i;:::-;12461:70;12524:6;12519:3;12461:70;:::i;:::-;12454:77;;12540:52;12585:6;12580:3;12573:4;12566:5;12562:16;12540:52;:::i;:::-;12617:29;12639:6;12617:29;:::i;:::-;12612:3;12608:39;12601:46;;12383:270;12293:360;;;;:::o;12659:157::-;12759:50;12803:5;12759:50;:::i;:::-;12754:3;12747:63;12659:157;;:::o;12822:161::-;12924:52;12970:5;12924:52;:::i;:::-;12919:3;12912:65;12822:161;;:::o;12989:364::-;13077:3;13105:39;13138:5;13105:39;:::i;:::-;13160:71;13224:6;13219:3;13160:71;:::i;:::-;13153:78;;13240:52;13285:6;13280:3;13273:4;13266:5;13262:16;13240:52;:::i;:::-;13317:29;13339:6;13317:29;:::i;:::-;13312:3;13308:39;13301:46;;13081:272;12989:364;;;;:::o;13359:377::-;13465:3;13493:39;13526:5;13493:39;:::i;:::-;13548:89;13630:6;13625:3;13548:89;:::i;:::-;13541:96;;13646:52;13691:6;13686:3;13679:4;13672:5;13668:16;13646:52;:::i;:::-;13723:6;13718:3;13714:16;13707:23;;13469:267;13359:377;;;;:::o;13742:366::-;13884:3;13905:67;13969:2;13964:3;13905:67;:::i;:::-;13898:74;;13981:93;14070:3;13981:93;:::i;:::-;14099:2;14094:3;14090:12;14083:19;;13742:366;;;:::o;14114:::-;14256:3;14277:67;14341:2;14336:3;14277:67;:::i;:::-;14270:74;;14353:93;14442:3;14353:93;:::i;:::-;14471:2;14466:3;14462:12;14455:19;;14114:366;;;:::o;14486:::-;14628:3;14649:67;14713:2;14708:3;14649:67;:::i;:::-;14642:74;;14725:93;14814:3;14725:93;:::i;:::-;14843:2;14838:3;14834:12;14827:19;;14486:366;;;:::o;14858:::-;15000:3;15021:67;15085:2;15080:3;15021:67;:::i;:::-;15014:74;;15097:93;15186:3;15097:93;:::i;:::-;15215:2;15210:3;15206:12;15199:19;;14858:366;;;:::o;15230:::-;15372:3;15393:67;15457:2;15452:3;15393:67;:::i;:::-;15386:74;;15469:93;15558:3;15469:93;:::i;:::-;15587:2;15582:3;15578:12;15571:19;;15230:366;;;:::o;15602:::-;15744:3;15765:67;15829:2;15824:3;15765:67;:::i;:::-;15758:74;;15841:93;15930:3;15841:93;:::i;:::-;15959:2;15954:3;15950:12;15943:19;;15602:366;;;:::o;15974:::-;16116:3;16137:67;16201:2;16196:3;16137:67;:::i;:::-;16130:74;;16213:93;16302:3;16213:93;:::i;:::-;16331:2;16326:3;16322:12;16315:19;;15974:366;;;:::o;16346:::-;16488:3;16509:67;16573:2;16568:3;16509:67;:::i;:::-;16502:74;;16585:93;16674:3;16585:93;:::i;:::-;16703:2;16698:3;16694:12;16687:19;;16346:366;;;:::o;16718:::-;16860:3;16881:67;16945:2;16940:3;16881:67;:::i;:::-;16874:74;;16957:93;17046:3;16957:93;:::i;:::-;17075:2;17070:3;17066:12;17059:19;;16718:366;;;:::o;17090:::-;17232:3;17253:67;17317:2;17312:3;17253:67;:::i;:::-;17246:74;;17329:93;17418:3;17329:93;:::i;:::-;17447:2;17442:3;17438:12;17431:19;;17090:366;;;:::o;17462:::-;17604:3;17625:67;17689:2;17684:3;17625:67;:::i;:::-;17618:74;;17701:93;17790:3;17701:93;:::i;:::-;17819:2;17814:3;17810:12;17803:19;;17462:366;;;:::o;17834:::-;17976:3;17997:67;18061:2;18056:3;17997:67;:::i;:::-;17990:74;;18073:93;18162:3;18073:93;:::i;:::-;18191:2;18186:3;18182:12;18175:19;;17834:366;;;:::o;18206:::-;18348:3;18369:67;18433:2;18428:3;18369:67;:::i;:::-;18362:74;;18445:93;18534:3;18445:93;:::i;:::-;18563:2;18558:3;18554:12;18547:19;;18206:366;;;:::o;18578:::-;18720:3;18741:67;18805:2;18800:3;18741:67;:::i;:::-;18734:74;;18817:93;18906:3;18817:93;:::i;:::-;18935:2;18930:3;18926:12;18919:19;;18578:366;;;:::o;18950:::-;19092:3;19113:67;19177:2;19172:3;19113:67;:::i;:::-;19106:74;;19189:93;19278:3;19189:93;:::i;:::-;19307:2;19302:3;19298:12;19291:19;;18950:366;;;:::o;19322:::-;19464:3;19485:67;19549:2;19544:3;19485:67;:::i;:::-;19478:74;;19561:93;19650:3;19561:93;:::i;:::-;19679:2;19674:3;19670:12;19663:19;;19322:366;;;:::o;19694:::-;19836:3;19857:67;19921:2;19916:3;19857:67;:::i;:::-;19850:74;;19933:93;20022:3;19933:93;:::i;:::-;20051:2;20046:3;20042:12;20035:19;;19694:366;;;:::o;20066:::-;20208:3;20229:67;20293:2;20288:3;20229:67;:::i;:::-;20222:74;;20305:93;20394:3;20305:93;:::i;:::-;20423:2;20418:3;20414:12;20407:19;;20066:366;;;:::o;20438:::-;20580:3;20601:67;20665:2;20660:3;20601:67;:::i;:::-;20594:74;;20677:93;20766:3;20677:93;:::i;:::-;20795:2;20790:3;20786:12;20779:19;;20438:366;;;:::o;20810:::-;20952:3;20973:67;21037:2;21032:3;20973:67;:::i;:::-;20966:74;;21049:93;21138:3;21049:93;:::i;:::-;21167:2;21162:3;21158:12;21151:19;;20810:366;;;:::o;21182:::-;21324:3;21345:67;21409:2;21404:3;21345:67;:::i;:::-;21338:74;;21421:93;21510:3;21421:93;:::i;:::-;21539:2;21534:3;21530:12;21523:19;;21182:366;;;:::o;21554:::-;21696:3;21717:67;21781:2;21776:3;21717:67;:::i;:::-;21710:74;;21793:93;21882:3;21793:93;:::i;:::-;21911:2;21906:3;21902:12;21895:19;;21554:366;;;:::o;21926:::-;22068:3;22089:67;22153:2;22148:3;22089:67;:::i;:::-;22082:74;;22165:93;22254:3;22165:93;:::i;:::-;22283:2;22278:3;22274:12;22267:19;;21926:366;;;:::o;22298:::-;22440:3;22461:67;22525:2;22520:3;22461:67;:::i;:::-;22454:74;;22537:93;22626:3;22537:93;:::i;:::-;22655:2;22650:3;22646:12;22639:19;;22298:366;;;:::o;22670:::-;22812:3;22833:67;22897:2;22892:3;22833:67;:::i;:::-;22826:74;;22909:93;22998:3;22909:93;:::i;:::-;23027:2;23022:3;23018:12;23011:19;;22670:366;;;:::o;23042:::-;23184:3;23205:67;23269:2;23264:3;23205:67;:::i;:::-;23198:74;;23281:93;23370:3;23281:93;:::i;:::-;23399:2;23394:3;23390:12;23383:19;;23042:366;;;:::o;23414:::-;23556:3;23577:67;23641:2;23636:3;23577:67;:::i;:::-;23570:74;;23653:93;23742:3;23653:93;:::i;:::-;23771:2;23766:3;23762:12;23755:19;;23414:366;;;:::o;23786:::-;23928:3;23949:67;24013:2;24008:3;23949:67;:::i;:::-;23942:74;;24025:93;24114:3;24025:93;:::i;:::-;24143:2;24138:3;24134:12;24127:19;;23786:366;;;:::o;24158:118::-;24245:24;24263:5;24245:24;:::i;:::-;24240:3;24233:37;24158:118;;:::o;24282:435::-;24462:3;24484:95;24575:3;24566:6;24484:95;:::i;:::-;24477:102;;24596:95;24687:3;24678:6;24596:95;:::i;:::-;24589:102;;24708:3;24701:10;;24282:435;;;;;:::o;24723:222::-;24816:4;24854:2;24843:9;24839:18;24831:26;;24867:71;24935:1;24924:9;24920:17;24911:6;24867:71;:::i;:::-;24723:222;;;;:::o;24951:332::-;25072:4;25110:2;25099:9;25095:18;25087:26;;25123:71;25191:1;25180:9;25176:17;25167:6;25123:71;:::i;:::-;25204:72;25272:2;25261:9;25257:18;25248:6;25204:72;:::i;:::-;24951:332;;;;;:::o;25289:442::-;25438:4;25476:2;25465:9;25461:18;25453:26;;25489:71;25557:1;25546:9;25542:17;25533:6;25489:71;:::i;:::-;25570:72;25638:2;25627:9;25623:18;25614:6;25570:72;:::i;:::-;25652;25720:2;25709:9;25705:18;25696:6;25652:72;:::i;:::-;25289:442;;;;;;:::o;25737:640::-;25932:4;25970:3;25959:9;25955:19;25947:27;;25984:71;26052:1;26041:9;26037:17;26028:6;25984:71;:::i;:::-;26065:72;26133:2;26122:9;26118:18;26109:6;26065:72;:::i;:::-;26147;26215:2;26204:9;26200:18;26191:6;26147:72;:::i;:::-;26266:9;26260:4;26256:20;26251:2;26240:9;26236:18;26229:48;26294:76;26365:4;26356:6;26294:76;:::i;:::-;26286:84;;25737:640;;;;;;;:::o;26383:332::-;26504:4;26542:2;26531:9;26527:18;26519:26;;26555:71;26623:1;26612:9;26608:17;26599:6;26555:71;:::i;:::-;26636:72;26704:2;26693:9;26689:18;26680:6;26636:72;:::i;:::-;26383:332;;;;;:::o;26721:393::-;26874:4;26912:2;26901:9;26897:18;26889:26;;26961:9;26955:4;26951:20;26947:1;26936:9;26932:17;26925:47;26989:118;27102:4;27093:6;27085;26989:118;:::i;:::-;26981:126;;26721:393;;;;;:::o;27120:210::-;27207:4;27245:2;27234:9;27230:18;27222:26;;27258:65;27320:1;27309:9;27305:17;27296:6;27258:65;:::i;:::-;27120:210;;;;:::o;27336:218::-;27427:4;27465:2;27454:9;27450:18;27442:26;;27478:69;27544:1;27533:9;27529:17;27520:6;27478:69;:::i;:::-;27336:218;;;;:::o;27560:248::-;27666:4;27704:2;27693:9;27689:18;27681:26;;27717:84;27798:1;27787:9;27783:17;27774:6;27717:84;:::i;:::-;27560:248;;;;:::o;27814:252::-;27922:4;27960:2;27949:9;27945:18;27937:26;;27973:86;28056:1;28045:9;28041:17;28032:6;27973:86;:::i;:::-;27814:252;;;;:::o;28072:313::-;28185:4;28223:2;28212:9;28208:18;28200:26;;28272:9;28266:4;28262:20;28258:1;28247:9;28243:17;28236:47;28300:78;28373:4;28364:6;28300:78;:::i;:::-;28292:86;;28072:313;;;;:::o;28391:419::-;28557:4;28595:2;28584:9;28580:18;28572:26;;28644:9;28638:4;28634:20;28630:1;28619:9;28615:17;28608:47;28672:131;28798:4;28672:131;:::i;:::-;28664:139;;28391:419;;;:::o;28816:::-;28982:4;29020:2;29009:9;29005:18;28997:26;;29069:9;29063:4;29059:20;29055:1;29044:9;29040:17;29033:47;29097:131;29223:4;29097:131;:::i;:::-;29089:139;;28816:419;;;:::o;29241:::-;29407:4;29445:2;29434:9;29430:18;29422:26;;29494:9;29488:4;29484:20;29480:1;29469:9;29465:17;29458:47;29522:131;29648:4;29522:131;:::i;:::-;29514:139;;29241:419;;;:::o;29666:::-;29832:4;29870:2;29859:9;29855:18;29847:26;;29919:9;29913:4;29909:20;29905:1;29894:9;29890:17;29883:47;29947:131;30073:4;29947:131;:::i;:::-;29939:139;;29666:419;;;:::o;30091:::-;30257:4;30295:2;30284:9;30280:18;30272:26;;30344:9;30338:4;30334:20;30330:1;30319:9;30315:17;30308:47;30372:131;30498:4;30372:131;:::i;:::-;30364:139;;30091:419;;;:::o;30516:::-;30682:4;30720:2;30709:9;30705:18;30697:26;;30769:9;30763:4;30759:20;30755:1;30744:9;30740:17;30733:47;30797:131;30923:4;30797:131;:::i;:::-;30789:139;;30516:419;;;:::o;30941:::-;31107:4;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;30941:419;;;:::o;31366:::-;31532:4;31570:2;31559:9;31555:18;31547:26;;31619:9;31613:4;31609:20;31605:1;31594:9;31590:17;31583:47;31647:131;31773:4;31647:131;:::i;:::-;31639:139;;31366:419;;;:::o;31791:::-;31957:4;31995:2;31984:9;31980:18;31972:26;;32044:9;32038:4;32034:20;32030:1;32019:9;32015:17;32008:47;32072:131;32198:4;32072:131;:::i;:::-;32064:139;;31791:419;;;:::o;32216:::-;32382:4;32420:2;32409:9;32405:18;32397:26;;32469:9;32463:4;32459:20;32455:1;32444:9;32440:17;32433:47;32497:131;32623:4;32497:131;:::i;:::-;32489:139;;32216:419;;;:::o;32641:::-;32807:4;32845:2;32834:9;32830:18;32822:26;;32894:9;32888:4;32884:20;32880:1;32869:9;32865:17;32858:47;32922:131;33048:4;32922:131;:::i;:::-;32914:139;;32641:419;;;:::o;33066:::-;33232:4;33270:2;33259:9;33255:18;33247:26;;33319:9;33313:4;33309:20;33305:1;33294:9;33290:17;33283:47;33347:131;33473:4;33347:131;:::i;:::-;33339:139;;33066:419;;;:::o;33491:::-;33657:4;33695:2;33684:9;33680:18;33672:26;;33744:9;33738:4;33734:20;33730:1;33719:9;33715:17;33708:47;33772:131;33898:4;33772:131;:::i;:::-;33764:139;;33491:419;;;:::o;33916:::-;34082:4;34120:2;34109:9;34105:18;34097:26;;34169:9;34163:4;34159:20;34155:1;34144:9;34140:17;34133:47;34197:131;34323:4;34197:131;:::i;:::-;34189:139;;33916:419;;;:::o;34341:::-;34507:4;34545:2;34534:9;34530:18;34522:26;;34594:9;34588:4;34584:20;34580:1;34569:9;34565:17;34558:47;34622:131;34748:4;34622:131;:::i;:::-;34614:139;;34341:419;;;:::o;34766:::-;34932:4;34970:2;34959:9;34955:18;34947:26;;35019:9;35013:4;35009:20;35005:1;34994:9;34990:17;34983:47;35047:131;35173:4;35047:131;:::i;:::-;35039:139;;34766:419;;;:::o;35191:::-;35357:4;35395:2;35384:9;35380:18;35372:26;;35444:9;35438:4;35434:20;35430:1;35419:9;35415:17;35408:47;35472:131;35598:4;35472:131;:::i;:::-;35464:139;;35191:419;;;:::o;35616:::-;35782:4;35820:2;35809:9;35805:18;35797:26;;35869:9;35863:4;35859:20;35855:1;35844:9;35840:17;35833:47;35897:131;36023:4;35897:131;:::i;:::-;35889:139;;35616:419;;;:::o;36041:::-;36207:4;36245:2;36234:9;36230:18;36222:26;;36294:9;36288:4;36284:20;36280:1;36269:9;36265:17;36258:47;36322:131;36448:4;36322:131;:::i;:::-;36314:139;;36041:419;;;:::o;36466:::-;36632:4;36670:2;36659:9;36655:18;36647:26;;36719:9;36713:4;36709:20;36705:1;36694:9;36690:17;36683:47;36747:131;36873:4;36747:131;:::i;:::-;36739:139;;36466:419;;;:::o;36891:::-;37057:4;37095:2;37084:9;37080:18;37072:26;;37144:9;37138:4;37134:20;37130:1;37119:9;37115:17;37108:47;37172:131;37298:4;37172:131;:::i;:::-;37164:139;;36891:419;;;:::o;37316:::-;37482:4;37520:2;37509:9;37505:18;37497:26;;37569:9;37563:4;37559:20;37555:1;37544:9;37540:17;37533:47;37597:131;37723:4;37597:131;:::i;:::-;37589:139;;37316:419;;;:::o;37741:::-;37907:4;37945:2;37934:9;37930:18;37922:26;;37994:9;37988:4;37984:20;37980:1;37969:9;37965:17;37958:47;38022:131;38148:4;38022:131;:::i;:::-;38014:139;;37741:419;;;:::o;38166:::-;38332:4;38370:2;38359:9;38355:18;38347:26;;38419:9;38413:4;38409:20;38405:1;38394:9;38390:17;38383:47;38447:131;38573:4;38447:131;:::i;:::-;38439:139;;38166:419;;;:::o;38591:::-;38757:4;38795:2;38784:9;38780:18;38772:26;;38844:9;38838:4;38834:20;38830:1;38819:9;38815:17;38808:47;38872:131;38998:4;38872:131;:::i;:::-;38864:139;;38591:419;;;:::o;39016:::-;39182:4;39220:2;39209:9;39205:18;39197:26;;39269:9;39263:4;39259:20;39255:1;39244:9;39240:17;39233:47;39297:131;39423:4;39297:131;:::i;:::-;39289:139;;39016:419;;;:::o;39441:::-;39607:4;39645:2;39634:9;39630:18;39622:26;;39694:9;39688:4;39684:20;39680:1;39669:9;39665:17;39658:47;39722:131;39848:4;39722:131;:::i;:::-;39714:139;;39441:419;;;:::o;39866:::-;40032:4;40070:2;40059:9;40055:18;40047:26;;40119:9;40113:4;40109:20;40105:1;40094:9;40090:17;40083:47;40147:131;40273:4;40147:131;:::i;:::-;40139:139;;39866:419;;;:::o;40291:222::-;40384:4;40422:2;40411:9;40407:18;40399:26;;40435:71;40503:1;40492:9;40488:17;40479:6;40435:71;:::i;:::-;40291:222;;;;:::o;40519:129::-;40553:6;40580:20;;:::i;:::-;40570:30;;40609:33;40637:4;40629:6;40609:33;:::i;:::-;40519:129;;;:::o;40654:75::-;40687:6;40720:2;40714:9;40704:19;;40654:75;:::o;40735:307::-;40796:4;40886:18;40878:6;40875:30;40872:56;;;40908:18;;:::i;:::-;40872:56;40946:29;40968:6;40946:29;:::i;:::-;40938:37;;41030:4;41024;41020:15;41012:23;;40735:307;;;:::o;41048:308::-;41110:4;41200:18;41192:6;41189:30;41186:56;;;41222:18;;:::i;:::-;41186:56;41260:29;41282:6;41260:29;:::i;:::-;41252:37;;41344:4;41338;41334:15;41326:23;;41048:308;;;:::o;41362:98::-;41413:6;41447:5;41441:12;41431:22;;41362:98;;;:::o;41466:99::-;41518:6;41552:5;41546:12;41536:22;;41466:99;;;:::o;41571:184::-;41670:11;41704:6;41699:3;41692:19;41744:4;41739:3;41735:14;41720:29;;41571:184;;;;:::o;41761:168::-;41844:11;41878:6;41873:3;41866:19;41918:4;41913:3;41909:14;41894:29;;41761:168;;;;:::o;41935:169::-;42019:11;42053:6;42048:3;42041:19;42093:4;42088:3;42084:14;42069:29;;41935:169;;;;:::o;42110:148::-;42212:11;42249:3;42234:18;;42110:148;;;;:::o;42264:305::-;42304:3;42323:20;42341:1;42323:20;:::i;:::-;42318:25;;42357:20;42375:1;42357:20;:::i;:::-;42352:25;;42511:1;42443:66;42439:74;42436:1;42433:81;42430:107;;;42517:18;;:::i;:::-;42430:107;42561:1;42558;42554:9;42547:16;;42264:305;;;;:::o;42575:185::-;42615:1;42632:20;42650:1;42632:20;:::i;:::-;42627:25;;42666:20;42684:1;42666:20;:::i;:::-;42661:25;;42705:1;42695:35;;42710:18;;:::i;:::-;42695:35;42752:1;42749;42745:9;42740:14;;42575:185;;;;:::o;42766:348::-;42806:7;42829:20;42847:1;42829:20;:::i;:::-;42824:25;;42863:20;42881:1;42863:20;:::i;:::-;42858:25;;43051:1;42983:66;42979:74;42976:1;42973:81;42968:1;42961:9;42954:17;42950:105;42947:131;;;43058:18;;:::i;:::-;42947:131;43106:1;43103;43099:9;43088:20;;42766:348;;;;:::o;43120:191::-;43160:4;43180:20;43198:1;43180:20;:::i;:::-;43175:25;;43214:20;43232:1;43214:20;:::i;:::-;43209:25;;43253:1;43250;43247:8;43244:34;;;43258:18;;:::i;:::-;43244:34;43303:1;43300;43296:9;43288:17;;43120:191;;;;:::o;43317:96::-;43354:7;43383:24;43401:5;43383:24;:::i;:::-;43372:35;;43317:96;;;:::o;43419:90::-;43453:7;43496:5;43489:13;43482:21;43471:32;;43419:90;;;:::o;43515:149::-;43551:7;43591:66;43584:5;43580:78;43569:89;;43515:149;;;:::o;43670:126::-;43707:7;43747:42;43740:5;43736:54;43725:65;;43670:126;;;:::o;43802:77::-;43839:7;43868:5;43857:16;;43802:77;;;:::o;43885:139::-;43948:9;43981:37;44012:5;43981:37;:::i;:::-;43968:50;;43885:139;;;:::o;44030:141::-;44095:9;44128:37;44159:5;44128:37;:::i;:::-;44115:50;;44030:141;;;:::o;44177:126::-;44227:9;44260:37;44291:5;44260:37;:::i;:::-;44247:50;;44177:126;;;:::o;44309:113::-;44359:9;44392:24;44410:5;44392:24;:::i;:::-;44379:37;;44309:113;;;:::o;44428:154::-;44512:6;44507:3;44502;44489:30;44574:1;44565:6;44560:3;44556:16;44549:27;44428:154;;;:::o;44588:307::-;44656:1;44666:113;44680:6;44677:1;44674:13;44666:113;;;44765:1;44760:3;44756:11;44750:18;44746:1;44741:3;44737:11;44730:39;44702:2;44699:1;44695:10;44690:15;;44666:113;;;44797:6;44794:1;44791:13;44788:101;;;44877:1;44868:6;44863:3;44859:16;44852:27;44788:101;44637:258;44588:307;;;:::o;44901:320::-;44945:6;44982:1;44976:4;44972:12;44962:22;;45029:1;45023:4;45019:12;45050:18;45040:81;;45106:4;45098:6;45094:17;45084:27;;45040:81;45168:2;45160:6;45157:14;45137:18;45134:38;45131:84;;;45187:18;;:::i;:::-;45131:84;44952:269;44901:320;;;:::o;45227:281::-;45310:27;45332:4;45310:27;:::i;:::-;45302:6;45298:40;45440:6;45428:10;45425:22;45404:18;45392:10;45389:34;45386:62;45383:88;;;45451:18;;:::i;:::-;45383:88;45491:10;45487:2;45480:22;45270:238;45227:281;;:::o;45514:233::-;45553:3;45576:24;45594:5;45576:24;:::i;:::-;45567:33;;45622:66;45615:5;45612:77;45609:103;;;45692:18;;:::i;:::-;45609:103;45739:1;45732:5;45728:13;45721:20;;45514:233;;;:::o;45753:176::-;45785:1;45802:20;45820:1;45802:20;:::i;:::-;45797:25;;45836:20;45854:1;45836:20;:::i;:::-;45831:25;;45875:1;45865:35;;45880:18;;:::i;:::-;45865:35;45921:1;45918;45914:9;45909:14;;45753:176;;;;:::o;45935:180::-;45983:77;45980:1;45973:88;46080:4;46077:1;46070:15;46104:4;46101:1;46094:15;46121:180;46169:77;46166:1;46159:88;46266:4;46263:1;46256:15;46290:4;46287:1;46280:15;46307:180;46355:77;46352:1;46345:88;46452:4;46449:1;46442:15;46476:4;46473:1;46466:15;46493:180;46541:77;46538:1;46531:88;46638:4;46635:1;46628:15;46662:4;46659:1;46652:15;46679:180;46727:77;46724:1;46717:88;46824:4;46821:1;46814:15;46848:4;46845:1;46838:15;46865:180;46913:77;46910:1;46903:88;47010:4;47007:1;47000:15;47034:4;47031:1;47024:15;47051:117;47160:1;47157;47150:12;47174:117;47283:1;47280;47273:12;47297:117;47406:1;47403;47396:12;47420:117;47529:1;47526;47519:12;47543:117;47652:1;47649;47642:12;47666:117;47775:1;47772;47765:12;47789:117;47898:1;47895;47888:12;47912:102;47953:6;48004:2;48000:7;47995:2;47988:5;47984:14;47980:28;47970:38;;47912:102;;;:::o;48020:170::-;48160:22;48156:1;48148:6;48144:14;48137:46;48020:170;:::o;48196:230::-;48336:34;48332:1;48324:6;48320:14;48313:58;48405:13;48400:2;48392:6;48388:15;48381:38;48196:230;:::o;48432:237::-;48572:34;48568:1;48560:6;48556:14;48549:58;48641:20;48636:2;48628:6;48624:15;48617:45;48432:237;:::o;48675:225::-;48815:34;48811:1;48803:6;48799:14;48792:58;48884:8;48879:2;48871:6;48867:15;48860:33;48675:225;:::o;48906:224::-;49046:34;49042:1;49034:6;49030:14;49023:58;49115:7;49110:2;49102:6;49098:15;49091:32;48906:224;:::o;49136:178::-;49276:30;49272:1;49264:6;49260:14;49253:54;49136:178;:::o;49320:224::-;49460:34;49456:1;49448:6;49444:14;49437:58;49529:7;49524:2;49516:6;49512:15;49505:32;49320:224;:::o;49550:223::-;49690:34;49686:1;49678:6;49674:14;49667:58;49759:6;49754:2;49746:6;49742:15;49735:31;49550:223;:::o;49779:175::-;49919:27;49915:1;49907:6;49903:14;49896:51;49779:175;:::o;49960:178::-;50100:30;50096:1;50088:6;50084:14;50077:54;49960:178;:::o;50144:222::-;50284:34;50280:1;50272:6;50268:14;50261:58;50353:5;50348:2;50340:6;50336:15;50329:30;50144:222;:::o;50372:166::-;50512:18;50508:1;50500:6;50496:14;50489:42;50372:166;:::o;50544:228::-;50684:34;50680:1;50672:6;50668:14;50661:58;50753:11;50748:2;50740:6;50736:15;50729:36;50544:228;:::o;50778:230::-;50918:34;50914:1;50906:6;50902:14;50895:58;50987:13;50982:2;50974:6;50970:15;50963:38;50778:230;:::o;51014:249::-;51154:34;51150:1;51142:6;51138:14;51131:58;51223:32;51218:2;51210:6;51206:15;51199:57;51014:249;:::o;51269:182::-;51409:34;51405:1;51397:6;51393:14;51386:58;51269:182;:::o;51457:222::-;51597:34;51593:1;51585:6;51581:14;51574:58;51666:5;51661:2;51653:6;51649:15;51642:30;51457:222;:::o;51685:182::-;51825:34;51821:1;51813:6;51809:14;51802:58;51685:182;:::o;51873:179::-;52013:31;52009:1;52001:6;51997:14;51990:55;51873:179;:::o;52058:174::-;52198:26;52194:1;52186:6;52182:14;52175:50;52058:174;:::o;52238:220::-;52378:34;52374:1;52366:6;52362:14;52355:58;52447:3;52442:2;52434:6;52430:15;52423:28;52238:220;:::o;52464:180::-;52604:32;52600:1;52592:6;52588:14;52581:56;52464:180;:::o;52650:236::-;52790:34;52786:1;52778:6;52774:14;52767:58;52859:19;52854:2;52846:6;52842:15;52835:44;52650:236;:::o;52892:231::-;53032:34;53028:1;53020:6;53016:14;53009:58;53101:14;53096:2;53088:6;53084:15;53077:39;52892:231;:::o;53129:233::-;53269:34;53265:1;53257:6;53253:14;53246:58;53338:16;53333:2;53325:6;53321:15;53314:41;53129:233;:::o;53368:222::-;53508:34;53504:1;53496:6;53492:14;53485:58;53577:5;53572:2;53564:6;53560:15;53553:30;53368:222;:::o;53596:220::-;53736:34;53732:1;53724:6;53720:14;53713:58;53805:3;53800:2;53792:6;53788:15;53781:28;53596:220;:::o;53822:177::-;53962:29;53958:1;53950:6;53946:14;53939:53;53822:177;:::o;54005:122::-;54078:24;54096:5;54078:24;:::i;:::-;54071:5;54068:35;54058:63;;54117:1;54114;54107:12;54058:63;54005:122;:::o;54133:116::-;54203:21;54218:5;54203:21;:::i;:::-;54196:5;54193:32;54183:60;;54239:1;54236;54229:12;54183:60;54133:116;:::o;54255:120::-;54327:23;54344:5;54327:23;:::i;:::-;54320:5;54317:34;54307:62;;54365:1;54362;54355:12;54307:62;54255:120;:::o;54381:122::-;54454:24;54472:5;54454:24;:::i;:::-;54447:5;54444:35;54434:63;;54493:1;54490;54483:12;54434:63;54381:122;:::o

Swarm Source

ipfs://dd42f0efa46229ffd121f14998fd7a8e3e2884f82045c3196ceb5fc86486f41e
Loading