ETH Price: $3,269.19 (-4.29%)
Gas: 8 Gwei

Token

Divine Weapons (WEAP)
 

Overview

Max Total Supply

979 WEAP

Holders

369

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WEAP
0xcaf58872e16aa63f2f30f79c236e92eef2810d89
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DivineWeapons

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-10-13
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

/**
 * @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/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved');

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer');
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own');
        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);
    }

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

// File @openzeppelin/contracts/security/[email protected]

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

// File @openzeppelin/contracts/access/[email protected]

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721Burnable: caller is not owner nor approved');
        _burn(tokenId);
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}

pragma solidity ^0.8.0;

contract DivineWeapons is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 public maxSupply = 4444;
    uint256 public price = 0;
    uint256 public maxMintAmount = 40;
    bool public saleOpen = false;
    bool public presaleOpen = false;
    string public baseURI;

    mapping(address => uint256) public allowlist;

    receive() external payable {}

    constructor() ERC721('Divine Weapons', 'WEAP') {}

    function reserveMints(address to) public onlyOwner {
        for (uint256 i = 0; i < 35; i++) internalMint(to);
    }

    function seedAllowlist(address[] memory addresses, uint256[] memory numSlots)
    external
    onlyOwner
    {
        require(
            addresses.length == numSlots.length,
            "addresses does not match numSlots length"
        );
        for (uint256 i = 0; i < addresses.length; i++) {
            allowlist[addresses[i]] = numSlots[i];
        }
    }

    function withdraw() public onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }

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

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

    function toggleSale() public onlyOwner {
        saleOpen = !saleOpen;
    }

    function togglePresale() public onlyOwner {
        presaleOpen = !presaleOpen;
    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

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

    function internalMint(address to) internal {
        require(totalSupply() < maxSupply, 'supply depleted');
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(address to) public onlyOwner {
        internalMint(to);
    }

    function mintReserved(
        address _to,
        uint256 _mintAmount

        ) public {

            uint256 supply = totalSupply();
            require(saleOpen, "Sale is not open ");
            require(_mintAmount > 0, "Mint amount must be greater than 0");
            require(_mintAmount <= maxMintAmount, "Mint amount exceeds max per transaction");
            require(supply + _mintAmount <= maxSupply, "Mint amount exceeds max supply");

            require(allowlist[msg.sender] > 0, "not eligible for allowlist mint");
            require(allowlist[msg.sender] <= _mintAmount, "can't mint that many");

            for (uint256 i = 1; i <= _mintAmount; i++) {
                allowlist[msg.sender]--;
                // use one weapon per minted token
                _safeMint(_to, supply + i);
            }
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

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

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserveMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"numSlots","type":"uint256[]"}],"name":"seedAllowlist","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261115c600d556000600e556028600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200005757600080fd5b506040518060400160405280600e81526020017f446976696e6520576561706f6e730000000000000000000000000000000000008152506040518060400160405280600481526020017f57454150000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000dc929190620001d2565b508060019080519060200190620000f5929190620001d2565b5050506000600b60006101000a81548160ff021916908315150217905550600062000125620001ca60201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002e7565b600033905090565b828054620001e09062000282565b90600052602060002090601f01602090048101928262000204576000855562000250565b82601f106200021f57805160ff191683800117855562000250565b8280016001018555821562000250579182015b828111156200024f57825182559160200191906001019062000232565b5b5090506200025f919062000263565b5090565b5b808211156200027e57600081600090555060010162000264565b5090565b600060028204905060018216806200029b57607f821691505b60208210811415620002b257620002b1620002b8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61513880620002f76000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd146107e6578063d5abeb0114610823578063da5f68431461084e578063e985e9c514610877578063f2fde38b146108b45761023b565b8063a22cb46514610703578063a7cd52cb1461072c578063b05863d514610769578063b88d4fde14610792578063bee6348a146107bb5761023b565b80638da5cb5b116100f25780638da5cb5b1461062e57806391b7f5ed1461065957806395d89b411461068257806399288dbb146106ad578063a035b1fe146106d85761023b565b806370a0823114610583578063715018a6146105c05780637d8966e4146105d75780637de55fe1146105ee5780638456cb59146106175761023b565b80633ccfd60b116101bc5780634f6ccce7116101805780634f6ccce71461048a57806355f804b3146104c75780635c975abb146104f05780636352211e1461051b5780636c0360eb146105585761023b565b80633ccfd60b146103e15780633f4ba83a146103f857806340d097c31461040f57806342842e0e1461043857806342966c68146104615761023b565b806318160ddd1161020357806318160ddd1461030e578063239c70ae1461033957806323b872dd146103645780632f745c591461038d57806334393743146103ca5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613be5565b6108dd565b604051610274919061484e565b60405180910390f35b34801561028957600080fd5b506102926108ef565b60405161029f9190614869565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613c78565b610981565b6040516102dc91906147e7565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613b3d565b610a06565b005b34801561031a57600080fd5b50610323610b1e565b6040516103309190614c4b565b60405180910390f35b34801561034557600080fd5b5061034e610b2b565b60405161035b9190614c4b565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613a37565b610b31565b005b34801561039957600080fd5b506103b460048036038101906103af9190613b3d565b610b91565b6040516103c19190614c4b565b60405180910390f35b3480156103d657600080fd5b506103df610c36565b005b3480156103ed57600080fd5b506103f6610cde565b005b34801561040457600080fd5b5061040d610da1565b005b34801561041b57600080fd5b50610436600480360381019061043191906139d2565b610e27565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613a37565b610eaf565b005b34801561046d57600080fd5b5061048860048036038101906104839190613c78565b610ecf565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613c78565b610f2b565b6040516104be9190614c4b565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190613c37565b610fc2565b005b3480156104fc57600080fd5b50610505611058565b604051610512919061484e565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613c78565b61106f565b60405161054f91906147e7565b60405180910390f35b34801561056457600080fd5b5061056d611121565b60405161057a9190614869565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a591906139d2565b6111af565b6040516105b79190614c4b565b60405180910390f35b3480156105cc57600080fd5b506105d5611267565b005b3480156105e357600080fd5b506105ec6113a4565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613b3d565b61144c565b005b34801561062357600080fd5b5061062c611714565b005b34801561063a57600080fd5b5061064361179a565b60405161065091906147e7565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613c78565b6117c4565b005b34801561068e57600080fd5b5061069761184a565b6040516106a49190614869565b60405180910390f35b3480156106b957600080fd5b506106c26118dc565b6040516106cf919061484e565b60405180910390f35b3480156106e457600080fd5b506106ed6118ef565b6040516106fa9190614c4b565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613b01565b6118f5565b005b34801561073857600080fd5b50610753600480360381019061074e91906139d2565b611a76565b6040516107609190614c4b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b79565b611a8e565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613a86565b611c36565b005b3480156107c757600080fd5b506107d0611c98565b6040516107dd919061484e565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613c78565b611cab565b60405161081a9190614869565b60405180910390f35b34801561082f57600080fd5b50610838611cbd565b6040516108459190614c4b565b60405180910390f35b34801561085a57600080fd5b50610875600480360381019061087091906139d2565b611cc3565b005b34801561088357600080fd5b5061089e600480360381019061089991906139fb565b611d6b565b6040516108ab919061484e565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906139d2565b611dff565b005b60006108e882611fab565b9050919050565b6060600080546108fe90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90614f2d565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505050905090565b600061098c82612025565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614b0b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a118261106f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7990614b8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa1612091565b73ffffffffffffffffffffffffffffffffffffffff161480610ad05750610acf81610aca612091565b611d6b565b5b610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0690614a0b565b60405180910390fd5b610b198383612099565b505050565b6000600880549050905090565b600f5481565b610b42610b3c612091565b82612152565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614bab565b60405180910390fd5b610b8c838383612230565b505050565b6000610b9c836111af565b8210610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd4906148cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c3e612091565b73ffffffffffffffffffffffffffffffffffffffff16610c5c61179a565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614b2b565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610ce6612091565b73ffffffffffffffffffffffffffffffffffffffff16610d0461179a565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614b2b565b60405180910390fd5b610d62612091565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610d9f57600080fd5b565b610da9612091565b73ffffffffffffffffffffffffffffffffffffffff16610dc761179a565b73ffffffffffffffffffffffffffffffffffffffff1614610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490614b2b565b60405180910390fd5b610e2561248c565b565b610e2f612091565b73ffffffffffffffffffffffffffffffffffffffff16610e4d61179a565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614b2b565b60405180910390fd5b610eac8161252e565b50565b610eca83838360405180602001604052806000815250611c36565b505050565b610ee0610eda612091565b82612152565b610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690614c0b565b60405180910390fd5b610f2881612599565b50565b6000610f35610b1e565b8210610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614bcb565b60405180910390fd5b60088281548110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fca612091565b73ffffffffffffffffffffffffffffffffffffffff16610fe861179a565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614b2b565b60405180910390fd5b806011908051906020019061105492919061368a565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90614a4b565b60405180910390fd5b80915050919050565b6011805461112e90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461115a90614f2d565b80156111a75780601f1061117c576101008083540402835291602001916111a7565b820191906000526020600020905b81548152906001019060200180831161118a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614a2b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126f612091565b73ffffffffffffffffffffffffffffffffffffffff1661128d61179a565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90614b2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113ac612091565b73ffffffffffffffffffffffffffffffffffffffff166113ca61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614b2b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000611456610b1e565b9050601060009054906101000a900460ff166114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e9061494b565b60405180910390fd5b600082116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614a6b565b60405180910390fd5b600f5482111561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906149eb565b60405180910390fd5b600d54828261153e9190614d92565b111561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614a8b565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890614aeb565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90614beb565b60405180910390fd5b6000600190505b82811161170e57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116e190614f03565b91905055506116fb8482846116f69190614d92565b6125a5565b808061170690614f5f565b91505061168a565b50505050565b61171c612091565b73ffffffffffffffffffffffffffffffffffffffff1661173a61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178790614b2b565b60405180910390fd5b6117986125c3565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117cc612091565b73ffffffffffffffffffffffffffffffffffffffff166117ea61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614b2b565b60405180910390fd5b80600e8190555050565b60606001805461185990614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461188590614f2d565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b601060009054906101000a900460ff1681565b600e5481565b6118fd612091565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061498b565b60405180910390fd5b8060056000611978612091565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a25612091565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6a919061484e565b60405180910390a35050565b60126020528060005260406000206000915090505481565b611a96612091565b73ffffffffffffffffffffffffffffffffffffffff16611ab461179a565b73ffffffffffffffffffffffffffffffffffffffff1614611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614b2b565b60405180910390fd5b8051825114611b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4590614c2b565b60405180910390fd5b60005b8251811015611c3157818181518110611b93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160126000858481518110611bd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c2990614f5f565b915050611b51565b505050565b611c47611c41612091565b83612152565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614bab565b60405180910390fd5b611c9284848484612666565b50505050565b601060019054906101000a900460ff1681565b6060611cb6826126c2565b9050919050565b600d5481565b611ccb612091565b73ffffffffffffffffffffffffffffffffffffffff16611ce961179a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614b2b565b60405180910390fd5b60005b6023811015611d6757611d548261252e565b8080611d5f90614f5f565b915050611d42565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e07612091565b73ffffffffffffffffffffffffffffffffffffffff16611e2561179a565b73ffffffffffffffffffffffffffffffffffffffff1614611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614b2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee29061490b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201e575061201d82612814565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210c8361106f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061215d82612025565b61219c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612193906149ab565b60405180910390fd5b60006121a78361106f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061221657508373ffffffffffffffffffffffffffffffffffffffff166121fe84610981565b73ffffffffffffffffffffffffffffffffffffffff16145b8061222757506122268185611d6b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122508261106f565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614b4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d9061496b565b60405180910390fd5b6123218383836128f6565b61232c600082612099565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237c9190614e19565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d39190614d92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612494611058565b6124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca9061488b565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612517612091565b60405161252491906147e7565b60405180910390a1565b600d54612539610b1e565b10612579576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612570906148ab565b60405180910390fd5b61258c81612587600c61294e565b6125a5565b612596600c61295c565b50565b6125a281612972565b50565b6125bf8282604051806020016040528060008152506129c5565b5050565b6125cb611058565b1561260b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612602906149cb565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861264f612091565b60405161265c91906147e7565b60405180910390a1565b612671848484612230565b61267d84848484612a20565b6126bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b3906148eb565b60405180910390fd5b50505050565b60606126cd82612025565b61270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390614acb565b60405180910390fd5b6000600a6000848152602001908152602001600020805461272c90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461275890614f2d565b80156127a55780601f1061277a576101008083540402835291602001916127a5565b820191906000526020600020905b81548152906001019060200180831161278857829003601f168201915b5050505050905060006127b6612bb7565b90506000815114156127cc57819250505061280f565b6000825111156128015780826040516020016127e99291906147c3565b6040516020818303038152906040529250505061280f565b61280a84612c49565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ef57506128ee82612cf0565b5b9050919050565b6128fe611058565b1561293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906149cb565b60405180910390fd5b612949838383612d5a565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61297b81612e6e565b6000600a6000838152602001908152602001600020805461299b90614f2d565b9050146129c257600a600082815260200190815260200160002060006129c19190613710565b5b50565b6129cf8383612f7f565b6129dc6000848484612a20565b612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a12906148eb565b60405180910390fd5b505050565b6000612a418473ffffffffffffffffffffffffffffffffffffffff1661314d565b15612baa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a6a612091565b8786866040518563ffffffff1660e01b8152600401612a8c9493929190614802565b602060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ad757506040513d601f19601f82011682018060405250810190612ad49190613c0e565b60015b612b5a573d8060008114612b07576040519150601f19603f3d011682016040523d82523d6000602084013e612b0c565b606091505b50600081511415612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b49906148eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612baf565b600190505b949350505050565b606060118054612bc690614f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf290614f2d565b8015612c3f5780601f10612c1457610100808354040283529160200191612c3f565b820191906000526020600020905b815481529060010190602001808311612c2257829003601f168201915b5050505050905090565b6060612c5482612025565b612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614b6b565b60405180910390fd5b6000612c9d612bb7565b90506000815111612cbd5760405180602001604052806000815250612ce8565b80612cc784613160565b604051602001612cd89291906147c3565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d6583838361330d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da857612da381613312565b612de7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de657612de5838261335b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2a57612e25816134c8565b612e69565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6857612e67828261360b565b5b5b505050565b6000612e798261106f565b9050612e87816000846128f6565b612e92600083612099565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ee29190614e19565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe690614aab565b60405180910390fd5b612ff881612025565b15613038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302f9061492b565b60405180910390fd5b613044600083836128f6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130949190614d92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156131a8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613308565b600082905060005b600082146131da5780806131c390614f5f565b915050600a826131d39190614de8565b91506131b0565b60008167ffffffffffffffff81111561321c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561324e5781602001600182028036833780820191505090505b5090505b60008514613301576001826132679190614e19565b9150600a856132769190614fa8565b60306132829190614d92565b60f81b8183815181106132be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132fa9190614de8565b9450613252565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613368846111af565b6133729190614e19565b9050600060076000848152602001908152602001600020549050818114613457576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134dc9190614e19565b9050600060096000848152602001908152602001600020549050600060088381548110613532577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061357a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806135ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613616836111af565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461369690614f2d565b90600052602060002090601f0160209004810192826136b857600085556136ff565b82601f106136d157805160ff19168380011785556136ff565b828001600101855582156136ff579182015b828111156136fe5782518255916020019190600101906136e3565b5b50905061370c9190613750565b5090565b50805461371c90614f2d565b6000825580601f1061372e575061374d565b601f01602090049060005260206000209081019061374c9190613750565b5b50565b5b80821115613769576000816000905550600101613751565b5090565b600061378061377b84614c97565b614c66565b9050808382526020820190508285602086028201111561379f57600080fd5b60005b858110156137cf57816137b588826138c1565b8452602084019350602083019250506001810190506137a2565b5050509392505050565b60006137ec6137e784614cc3565b614c66565b9050808382526020820190508285602086028201111561380b57600080fd5b60005b8581101561383b578161382188826139bd565b84526020840193506020830192505060018101905061380e565b5050509392505050565b600061385861385384614cef565b614c66565b90508281526020810184848401111561387057600080fd5b61387b848285614ec1565b509392505050565b600061389661389184614d1f565b614c66565b9050828152602081018484840111156138ae57600080fd5b6138b9848285614ec1565b509392505050565b6000813590506138d0816150a6565b92915050565b600082601f8301126138e757600080fd5b81356138f784826020860161376d565b91505092915050565b600082601f83011261391157600080fd5b81356139218482602086016137d9565b91505092915050565b600081359050613939816150bd565b92915050565b60008135905061394e816150d4565b92915050565b600081519050613963816150d4565b92915050565b600082601f83011261397a57600080fd5b813561398a848260208601613845565b91505092915050565b600082601f8301126139a457600080fd5b81356139b4848260208601613883565b91505092915050565b6000813590506139cc816150eb565b92915050565b6000602082840312156139e457600080fd5b60006139f2848285016138c1565b91505092915050565b60008060408385031215613a0e57600080fd5b6000613a1c858286016138c1565b9250506020613a2d858286016138c1565b9150509250929050565b600080600060608486031215613a4c57600080fd5b6000613a5a868287016138c1565b9350506020613a6b868287016138c1565b9250506040613a7c868287016139bd565b9150509250925092565b60008060008060808587031215613a9c57600080fd5b6000613aaa878288016138c1565b9450506020613abb878288016138c1565b9350506040613acc878288016139bd565b925050606085013567ffffffffffffffff811115613ae957600080fd5b613af587828801613969565b91505092959194509250565b60008060408385031215613b1457600080fd5b6000613b22858286016138c1565b9250506020613b338582860161392a565b9150509250929050565b60008060408385031215613b5057600080fd5b6000613b5e858286016138c1565b9250506020613b6f858286016139bd565b9150509250929050565b60008060408385031215613b8c57600080fd5b600083013567ffffffffffffffff811115613ba657600080fd5b613bb2858286016138d6565b925050602083013567ffffffffffffffff811115613bcf57600080fd5b613bdb85828601613900565b9150509250929050565b600060208284031215613bf757600080fd5b6000613c058482850161393f565b91505092915050565b600060208284031215613c2057600080fd5b6000613c2e84828501613954565b91505092915050565b600060208284031215613c4957600080fd5b600082013567ffffffffffffffff811115613c6357600080fd5b613c6f84828501613993565b91505092915050565b600060208284031215613c8a57600080fd5b6000613c98848285016139bd565b91505092915050565b613caa81614e4d565b82525050565b613cb981614e5f565b82525050565b6000613cca82614d4f565b613cd48185614d65565b9350613ce4818560208601614ed0565b613ced81615095565b840191505092915050565b6000613d0382614d5a565b613d0d8185614d76565b9350613d1d818560208601614ed0565b613d2681615095565b840191505092915050565b6000613d3c82614d5a565b613d468185614d87565b9350613d56818560208601614ed0565b80840191505092915050565b6000613d6f601483614d76565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613daf600f83614d76565b91507f737570706c79206465706c6574656400000000000000000000000000000000006000830152602082019050919050565b6000613def602b83614d76565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e55603283614d76565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ebb602683614d76565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f21601c83614d76565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f61601183614d76565b91507f53616c65206973206e6f74206f70656e200000000000000000000000000000006000830152602082019050919050565b6000613fa1602483614d76565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614007601983614d76565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614047602c83614d76565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140ad601083614d76565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006140ed602783614d76565b91507f4d696e7420616d6f756e742065786365656473206d617820706572207472616e60008301527f73616374696f6e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614153603883614d76565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006141b9602a83614d76565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061421f602983614d76565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614285602283614d76565b91507f4d696e7420616d6f756e74206d7573742062652067726561746572207468616e60008301527f20300000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142eb601e83614d76565b91507f4d696e7420616d6f756e742065786365656473206d617820737570706c7900006000830152602082019050919050565b600061432b602083614d76565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061436b603183614d76565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b60006143d1601f83614d76565b91507f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e74006000830152602082019050919050565b6000614411602c83614d76565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614477602083614d76565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006144b7602983614d76565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d602f83614d76565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614583602183614d76565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e9603183614d76565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061464f602c83614d76565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006146b5601483614d76565b91507f63616e2774206d696e742074686174206d616e790000000000000000000000006000830152602082019050919050565b60006146f5603083614d76565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061475b602883614d76565b91507f61646472657373657320646f6573206e6f74206d61746368206e756d536c6f7460008301527f73206c656e6774680000000000000000000000000000000000000000000000006020830152604082019050919050565b6147bd81614eb7565b82525050565b60006147cf8285613d31565b91506147db8284613d31565b91508190509392505050565b60006020820190506147fc6000830184613ca1565b92915050565b60006080820190506148176000830187613ca1565b6148246020830186613ca1565b61483160408301856147b4565b81810360608301526148438184613cbf565b905095945050505050565b60006020820190506148636000830184613cb0565b92915050565b600060208201905081810360008301526148838184613cf8565b905092915050565b600060208201905081810360008301526148a481613d62565b9050919050565b600060208201905081810360008301526148c481613da2565b9050919050565b600060208201905081810360008301526148e481613de2565b9050919050565b6000602082019050818103600083015261490481613e48565b9050919050565b6000602082019050818103600083015261492481613eae565b9050919050565b6000602082019050818103600083015261494481613f14565b9050919050565b6000602082019050818103600083015261496481613f54565b9050919050565b6000602082019050818103600083015261498481613f94565b9050919050565b600060208201905081810360008301526149a481613ffa565b9050919050565b600060208201905081810360008301526149c48161403a565b9050919050565b600060208201905081810360008301526149e4816140a0565b9050919050565b60006020820190508181036000830152614a04816140e0565b9050919050565b60006020820190508181036000830152614a2481614146565b9050919050565b60006020820190508181036000830152614a44816141ac565b9050919050565b60006020820190508181036000830152614a6481614212565b9050919050565b60006020820190508181036000830152614a8481614278565b9050919050565b60006020820190508181036000830152614aa4816142de565b9050919050565b60006020820190508181036000830152614ac48161431e565b9050919050565b60006020820190508181036000830152614ae48161435e565b9050919050565b60006020820190508181036000830152614b04816143c4565b9050919050565b60006020820190508181036000830152614b2481614404565b9050919050565b60006020820190508181036000830152614b448161446a565b9050919050565b60006020820190508181036000830152614b64816144aa565b9050919050565b60006020820190508181036000830152614b8481614510565b9050919050565b60006020820190508181036000830152614ba481614576565b9050919050565b60006020820190508181036000830152614bc4816145dc565b9050919050565b60006020820190508181036000830152614be481614642565b9050919050565b60006020820190508181036000830152614c04816146a8565b9050919050565b60006020820190508181036000830152614c24816146e8565b9050919050565b60006020820190508181036000830152614c448161474e565b9050919050565b6000602082019050614c6060008301846147b4565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614c8d57614c8c615066565b5b8060405250919050565b600067ffffffffffffffff821115614cb257614cb1615066565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cde57614cdd615066565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d0a57614d09615066565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d3a57614d39615066565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d9d82614eb7565b9150614da883614eb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ddd57614ddc614fd9565b5b828201905092915050565b6000614df382614eb7565b9150614dfe83614eb7565b925082614e0e57614e0d615008565b5b828204905092915050565b6000614e2482614eb7565b9150614e2f83614eb7565b925082821015614e4257614e41614fd9565b5b828203905092915050565b6000614e5882614e97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614eee578082015181840152602081019050614ed3565b83811115614efd576000848401525b50505050565b6000614f0e82614eb7565b91506000821415614f2257614f21614fd9565b5b600182039050919050565b60006002820490506001821680614f4557607f821691505b60208210811415614f5957614f58615037565b5b50919050565b6000614f6a82614eb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9d57614f9c614fd9565b5b600182019050919050565b6000614fb382614eb7565b9150614fbe83614eb7565b925082614fce57614fcd615008565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6150af81614e4d565b81146150ba57600080fd5b50565b6150c681614e5f565b81146150d157600080fd5b50565b6150dd81614e6b565b81146150e857600080fd5b50565b6150f481614eb7565b81146150ff57600080fd5b5056fea264697066735822122001217d2d91eb62efa00bbdf48f4ab633c121c3699d12d2c94b2578256d105e8e64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102345760003560e01c806370a082311161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd146107e6578063d5abeb0114610823578063da5f68431461084e578063e985e9c514610877578063f2fde38b146108b45761023b565b8063a22cb46514610703578063a7cd52cb1461072c578063b05863d514610769578063b88d4fde14610792578063bee6348a146107bb5761023b565b80638da5cb5b116100f25780638da5cb5b1461062e57806391b7f5ed1461065957806395d89b411461068257806399288dbb146106ad578063a035b1fe146106d85761023b565b806370a0823114610583578063715018a6146105c05780637d8966e4146105d75780637de55fe1146105ee5780638456cb59146106175761023b565b80633ccfd60b116101bc5780634f6ccce7116101805780634f6ccce71461048a57806355f804b3146104c75780635c975abb146104f05780636352211e1461051b5780636c0360eb146105585761023b565b80633ccfd60b146103e15780633f4ba83a146103f857806340d097c31461040f57806342842e0e1461043857806342966c68146104615761023b565b806318160ddd1161020357806318160ddd1461030e578063239c70ae1461033957806323b872dd146103645780632f745c591461038d57806334393743146103ca5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613be5565b6108dd565b604051610274919061484e565b60405180910390f35b34801561028957600080fd5b506102926108ef565b60405161029f9190614869565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613c78565b610981565b6040516102dc91906147e7565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613b3d565b610a06565b005b34801561031a57600080fd5b50610323610b1e565b6040516103309190614c4b565b60405180910390f35b34801561034557600080fd5b5061034e610b2b565b60405161035b9190614c4b565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613a37565b610b31565b005b34801561039957600080fd5b506103b460048036038101906103af9190613b3d565b610b91565b6040516103c19190614c4b565b60405180910390f35b3480156103d657600080fd5b506103df610c36565b005b3480156103ed57600080fd5b506103f6610cde565b005b34801561040457600080fd5b5061040d610da1565b005b34801561041b57600080fd5b50610436600480360381019061043191906139d2565b610e27565b005b34801561044457600080fd5b5061045f600480360381019061045a9190613a37565b610eaf565b005b34801561046d57600080fd5b5061048860048036038101906104839190613c78565b610ecf565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613c78565b610f2b565b6040516104be9190614c4b565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190613c37565b610fc2565b005b3480156104fc57600080fd5b50610505611058565b604051610512919061484e565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613c78565b61106f565b60405161054f91906147e7565b60405180910390f35b34801561056457600080fd5b5061056d611121565b60405161057a9190614869565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a591906139d2565b6111af565b6040516105b79190614c4b565b60405180910390f35b3480156105cc57600080fd5b506105d5611267565b005b3480156105e357600080fd5b506105ec6113a4565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613b3d565b61144c565b005b34801561062357600080fd5b5061062c611714565b005b34801561063a57600080fd5b5061064361179a565b60405161065091906147e7565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613c78565b6117c4565b005b34801561068e57600080fd5b5061069761184a565b6040516106a49190614869565b60405180910390f35b3480156106b957600080fd5b506106c26118dc565b6040516106cf919061484e565b60405180910390f35b3480156106e457600080fd5b506106ed6118ef565b6040516106fa9190614c4b565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613b01565b6118f5565b005b34801561073857600080fd5b50610753600480360381019061074e91906139d2565b611a76565b6040516107609190614c4b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b79565b611a8e565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613a86565b611c36565b005b3480156107c757600080fd5b506107d0611c98565b6040516107dd919061484e565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613c78565b611cab565b60405161081a9190614869565b60405180910390f35b34801561082f57600080fd5b50610838611cbd565b6040516108459190614c4b565b60405180910390f35b34801561085a57600080fd5b50610875600480360381019061087091906139d2565b611cc3565b005b34801561088357600080fd5b5061089e600480360381019061089991906139fb565b611d6b565b6040516108ab919061484e565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906139d2565b611dff565b005b60006108e882611fab565b9050919050565b6060600080546108fe90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90614f2d565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505050905090565b600061098c82612025565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614b0b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a118261106f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7990614b8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa1612091565b73ffffffffffffffffffffffffffffffffffffffff161480610ad05750610acf81610aca612091565b611d6b565b5b610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0690614a0b565b60405180910390fd5b610b198383612099565b505050565b6000600880549050905090565b600f5481565b610b42610b3c612091565b82612152565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614bab565b60405180910390fd5b610b8c838383612230565b505050565b6000610b9c836111af565b8210610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd4906148cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c3e612091565b73ffffffffffffffffffffffffffffffffffffffff16610c5c61179a565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614b2b565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610ce6612091565b73ffffffffffffffffffffffffffffffffffffffff16610d0461179a565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614b2b565b60405180910390fd5b610d62612091565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610d9f57600080fd5b565b610da9612091565b73ffffffffffffffffffffffffffffffffffffffff16610dc761179a565b73ffffffffffffffffffffffffffffffffffffffff1614610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490614b2b565b60405180910390fd5b610e2561248c565b565b610e2f612091565b73ffffffffffffffffffffffffffffffffffffffff16610e4d61179a565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614b2b565b60405180910390fd5b610eac8161252e565b50565b610eca83838360405180602001604052806000815250611c36565b505050565b610ee0610eda612091565b82612152565b610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690614c0b565b60405180910390fd5b610f2881612599565b50565b6000610f35610b1e565b8210610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614bcb565b60405180910390fd5b60088281548110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fca612091565b73ffffffffffffffffffffffffffffffffffffffff16610fe861179a565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614b2b565b60405180910390fd5b806011908051906020019061105492919061368a565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90614a4b565b60405180910390fd5b80915050919050565b6011805461112e90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461115a90614f2d565b80156111a75780601f1061117c576101008083540402835291602001916111a7565b820191906000526020600020905b81548152906001019060200180831161118a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614a2b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126f612091565b73ffffffffffffffffffffffffffffffffffffffff1661128d61179a565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90614b2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113ac612091565b73ffffffffffffffffffffffffffffffffffffffff166113ca61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614b2b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000611456610b1e565b9050601060009054906101000a900460ff166114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e9061494b565b60405180910390fd5b600082116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614a6b565b60405180910390fd5b600f5482111561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611526906149eb565b60405180910390fd5b600d54828261153e9190614d92565b111561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614a8b565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890614aeb565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90614beb565b60405180910390fd5b6000600190505b82811161170e57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116e190614f03565b91905055506116fb8482846116f69190614d92565b6125a5565b808061170690614f5f565b91505061168a565b50505050565b61171c612091565b73ffffffffffffffffffffffffffffffffffffffff1661173a61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178790614b2b565b60405180910390fd5b6117986125c3565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117cc612091565b73ffffffffffffffffffffffffffffffffffffffff166117ea61179a565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614b2b565b60405180910390fd5b80600e8190555050565b60606001805461185990614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461188590614f2d565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b601060009054906101000a900460ff1681565b600e5481565b6118fd612091565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061498b565b60405180910390fd5b8060056000611978612091565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a25612091565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6a919061484e565b60405180910390a35050565b60126020528060005260406000206000915090505481565b611a96612091565b73ffffffffffffffffffffffffffffffffffffffff16611ab461179a565b73ffffffffffffffffffffffffffffffffffffffff1614611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614b2b565b60405180910390fd5b8051825114611b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4590614c2b565b60405180910390fd5b60005b8251811015611c3157818181518110611b93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160126000858481518110611bd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c2990614f5f565b915050611b51565b505050565b611c47611c41612091565b83612152565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614bab565b60405180910390fd5b611c9284848484612666565b50505050565b601060019054906101000a900460ff1681565b6060611cb6826126c2565b9050919050565b600d5481565b611ccb612091565b73ffffffffffffffffffffffffffffffffffffffff16611ce961179a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614b2b565b60405180910390fd5b60005b6023811015611d6757611d548261252e565b8080611d5f90614f5f565b915050611d42565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e07612091565b73ffffffffffffffffffffffffffffffffffffffff16611e2561179a565b73ffffffffffffffffffffffffffffffffffffffff1614611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614b2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee29061490b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201e575061201d82612814565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210c8361106f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061215d82612025565b61219c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612193906149ab565b60405180910390fd5b60006121a78361106f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061221657508373ffffffffffffffffffffffffffffffffffffffff166121fe84610981565b73ffffffffffffffffffffffffffffffffffffffff16145b8061222757506122268185611d6b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122508261106f565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614b4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d9061496b565b60405180910390fd5b6123218383836128f6565b61232c600082612099565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461237c9190614e19565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d39190614d92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612494611058565b6124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca9061488b565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612517612091565b60405161252491906147e7565b60405180910390a1565b600d54612539610b1e565b10612579576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612570906148ab565b60405180910390fd5b61258c81612587600c61294e565b6125a5565b612596600c61295c565b50565b6125a281612972565b50565b6125bf8282604051806020016040528060008152506129c5565b5050565b6125cb611058565b1561260b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612602906149cb565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861264f612091565b60405161265c91906147e7565b60405180910390a1565b612671848484612230565b61267d84848484612a20565b6126bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b3906148eb565b60405180910390fd5b50505050565b60606126cd82612025565b61270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270390614acb565b60405180910390fd5b6000600a6000848152602001908152602001600020805461272c90614f2d565b80601f016020809104026020016040519081016040528092919081815260200182805461275890614f2d565b80156127a55780601f1061277a576101008083540402835291602001916127a5565b820191906000526020600020905b81548152906001019060200180831161278857829003601f168201915b5050505050905060006127b6612bb7565b90506000815114156127cc57819250505061280f565b6000825111156128015780826040516020016127e99291906147c3565b6040516020818303038152906040529250505061280f565b61280a84612c49565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ef57506128ee82612cf0565b5b9050919050565b6128fe611058565b1561293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906149cb565b60405180910390fd5b612949838383612d5a565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61297b81612e6e565b6000600a6000838152602001908152602001600020805461299b90614f2d565b9050146129c257600a600082815260200190815260200160002060006129c19190613710565b5b50565b6129cf8383612f7f565b6129dc6000848484612a20565b612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a12906148eb565b60405180910390fd5b505050565b6000612a418473ffffffffffffffffffffffffffffffffffffffff1661314d565b15612baa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a6a612091565b8786866040518563ffffffff1660e01b8152600401612a8c9493929190614802565b602060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ad757506040513d601f19601f82011682018060405250810190612ad49190613c0e565b60015b612b5a573d8060008114612b07576040519150601f19603f3d011682016040523d82523d6000602084013e612b0c565b606091505b50600081511415612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b49906148eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612baf565b600190505b949350505050565b606060118054612bc690614f2d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf290614f2d565b8015612c3f5780601f10612c1457610100808354040283529160200191612c3f565b820191906000526020600020905b815481529060010190602001808311612c2257829003601f168201915b5050505050905090565b6060612c5482612025565b612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614b6b565b60405180910390fd5b6000612c9d612bb7565b90506000815111612cbd5760405180602001604052806000815250612ce8565b80612cc784613160565b604051602001612cd89291906147c3565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d6583838361330d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da857612da381613312565b612de7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de657612de5838261335b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2a57612e25816134c8565b612e69565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6857612e67828261360b565b5b5b505050565b6000612e798261106f565b9050612e87816000846128f6565b612e92600083612099565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ee29190614e19565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe690614aab565b60405180910390fd5b612ff881612025565b15613038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302f9061492b565b60405180910390fd5b613044600083836128f6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130949190614d92565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156131a8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613308565b600082905060005b600082146131da5780806131c390614f5f565b915050600a826131d39190614de8565b91506131b0565b60008167ffffffffffffffff81111561321c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561324e5781602001600182028036833780820191505090505b5090505b60008514613301576001826132679190614e19565b9150600a856132769190614fa8565b60306132829190614d92565b60f81b8183815181106132be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132fa9190614de8565b9450613252565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613368846111af565b6133729190614e19565b9050600060076000848152602001908152602001600020549050818114613457576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134dc9190614e19565b9050600060096000848152602001908152602001600020549050600060088381548110613532577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061357a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806135ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613616836111af565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461369690614f2d565b90600052602060002090601f0160209004810192826136b857600085556136ff565b82601f106136d157805160ff19168380011785556136ff565b828001600101855582156136ff579182015b828111156136fe5782518255916020019190600101906136e3565b5b50905061370c9190613750565b5090565b50805461371c90614f2d565b6000825580601f1061372e575061374d565b601f01602090049060005260206000209081019061374c9190613750565b5b50565b5b80821115613769576000816000905550600101613751565b5090565b600061378061377b84614c97565b614c66565b9050808382526020820190508285602086028201111561379f57600080fd5b60005b858110156137cf57816137b588826138c1565b8452602084019350602083019250506001810190506137a2565b5050509392505050565b60006137ec6137e784614cc3565b614c66565b9050808382526020820190508285602086028201111561380b57600080fd5b60005b8581101561383b578161382188826139bd565b84526020840193506020830192505060018101905061380e565b5050509392505050565b600061385861385384614cef565b614c66565b90508281526020810184848401111561387057600080fd5b61387b848285614ec1565b509392505050565b600061389661389184614d1f565b614c66565b9050828152602081018484840111156138ae57600080fd5b6138b9848285614ec1565b509392505050565b6000813590506138d0816150a6565b92915050565b600082601f8301126138e757600080fd5b81356138f784826020860161376d565b91505092915050565b600082601f83011261391157600080fd5b81356139218482602086016137d9565b91505092915050565b600081359050613939816150bd565b92915050565b60008135905061394e816150d4565b92915050565b600081519050613963816150d4565b92915050565b600082601f83011261397a57600080fd5b813561398a848260208601613845565b91505092915050565b600082601f8301126139a457600080fd5b81356139b4848260208601613883565b91505092915050565b6000813590506139cc816150eb565b92915050565b6000602082840312156139e457600080fd5b60006139f2848285016138c1565b91505092915050565b60008060408385031215613a0e57600080fd5b6000613a1c858286016138c1565b9250506020613a2d858286016138c1565b9150509250929050565b600080600060608486031215613a4c57600080fd5b6000613a5a868287016138c1565b9350506020613a6b868287016138c1565b9250506040613a7c868287016139bd565b9150509250925092565b60008060008060808587031215613a9c57600080fd5b6000613aaa878288016138c1565b9450506020613abb878288016138c1565b9350506040613acc878288016139bd565b925050606085013567ffffffffffffffff811115613ae957600080fd5b613af587828801613969565b91505092959194509250565b60008060408385031215613b1457600080fd5b6000613b22858286016138c1565b9250506020613b338582860161392a565b9150509250929050565b60008060408385031215613b5057600080fd5b6000613b5e858286016138c1565b9250506020613b6f858286016139bd565b9150509250929050565b60008060408385031215613b8c57600080fd5b600083013567ffffffffffffffff811115613ba657600080fd5b613bb2858286016138d6565b925050602083013567ffffffffffffffff811115613bcf57600080fd5b613bdb85828601613900565b9150509250929050565b600060208284031215613bf757600080fd5b6000613c058482850161393f565b91505092915050565b600060208284031215613c2057600080fd5b6000613c2e84828501613954565b91505092915050565b600060208284031215613c4957600080fd5b600082013567ffffffffffffffff811115613c6357600080fd5b613c6f84828501613993565b91505092915050565b600060208284031215613c8a57600080fd5b6000613c98848285016139bd565b91505092915050565b613caa81614e4d565b82525050565b613cb981614e5f565b82525050565b6000613cca82614d4f565b613cd48185614d65565b9350613ce4818560208601614ed0565b613ced81615095565b840191505092915050565b6000613d0382614d5a565b613d0d8185614d76565b9350613d1d818560208601614ed0565b613d2681615095565b840191505092915050565b6000613d3c82614d5a565b613d468185614d87565b9350613d56818560208601614ed0565b80840191505092915050565b6000613d6f601483614d76565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613daf600f83614d76565b91507f737570706c79206465706c6574656400000000000000000000000000000000006000830152602082019050919050565b6000613def602b83614d76565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e55603283614d76565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ebb602683614d76565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f21601c83614d76565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f61601183614d76565b91507f53616c65206973206e6f74206f70656e200000000000000000000000000000006000830152602082019050919050565b6000613fa1602483614d76565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614007601983614d76565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614047602c83614d76565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006140ad601083614d76565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006140ed602783614d76565b91507f4d696e7420616d6f756e742065786365656473206d617820706572207472616e60008301527f73616374696f6e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614153603883614d76565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006141b9602a83614d76565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061421f602983614d76565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614285602283614d76565b91507f4d696e7420616d6f756e74206d7573742062652067726561746572207468616e60008301527f20300000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142eb601e83614d76565b91507f4d696e7420616d6f756e742065786365656473206d617820737570706c7900006000830152602082019050919050565b600061432b602083614d76565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061436b603183614d76565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b60006143d1601f83614d76565b91507f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e74006000830152602082019050919050565b6000614411602c83614d76565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614477602083614d76565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006144b7602983614d76565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d602f83614d76565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614583602183614d76565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e9603183614d76565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061464f602c83614d76565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006146b5601483614d76565b91507f63616e2774206d696e742074686174206d616e790000000000000000000000006000830152602082019050919050565b60006146f5603083614d76565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061475b602883614d76565b91507f61646472657373657320646f6573206e6f74206d61746368206e756d536c6f7460008301527f73206c656e6774680000000000000000000000000000000000000000000000006020830152604082019050919050565b6147bd81614eb7565b82525050565b60006147cf8285613d31565b91506147db8284613d31565b91508190509392505050565b60006020820190506147fc6000830184613ca1565b92915050565b60006080820190506148176000830187613ca1565b6148246020830186613ca1565b61483160408301856147b4565b81810360608301526148438184613cbf565b905095945050505050565b60006020820190506148636000830184613cb0565b92915050565b600060208201905081810360008301526148838184613cf8565b905092915050565b600060208201905081810360008301526148a481613d62565b9050919050565b600060208201905081810360008301526148c481613da2565b9050919050565b600060208201905081810360008301526148e481613de2565b9050919050565b6000602082019050818103600083015261490481613e48565b9050919050565b6000602082019050818103600083015261492481613eae565b9050919050565b6000602082019050818103600083015261494481613f14565b9050919050565b6000602082019050818103600083015261496481613f54565b9050919050565b6000602082019050818103600083015261498481613f94565b9050919050565b600060208201905081810360008301526149a481613ffa565b9050919050565b600060208201905081810360008301526149c48161403a565b9050919050565b600060208201905081810360008301526149e4816140a0565b9050919050565b60006020820190508181036000830152614a04816140e0565b9050919050565b60006020820190508181036000830152614a2481614146565b9050919050565b60006020820190508181036000830152614a44816141ac565b9050919050565b60006020820190508181036000830152614a6481614212565b9050919050565b60006020820190508181036000830152614a8481614278565b9050919050565b60006020820190508181036000830152614aa4816142de565b9050919050565b60006020820190508181036000830152614ac48161431e565b9050919050565b60006020820190508181036000830152614ae48161435e565b9050919050565b60006020820190508181036000830152614b04816143c4565b9050919050565b60006020820190508181036000830152614b2481614404565b9050919050565b60006020820190508181036000830152614b448161446a565b9050919050565b60006020820190508181036000830152614b64816144aa565b9050919050565b60006020820190508181036000830152614b8481614510565b9050919050565b60006020820190508181036000830152614ba481614576565b9050919050565b60006020820190508181036000830152614bc4816145dc565b9050919050565b60006020820190508181036000830152614be481614642565b9050919050565b60006020820190508181036000830152614c04816146a8565b9050919050565b60006020820190508181036000830152614c24816146e8565b9050919050565b60006020820190508181036000830152614c448161474e565b9050919050565b6000602082019050614c6060008301846147b4565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614c8d57614c8c615066565b5b8060405250919050565b600067ffffffffffffffff821115614cb257614cb1615066565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cde57614cdd615066565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d0a57614d09615066565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d3a57614d39615066565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d9d82614eb7565b9150614da883614eb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ddd57614ddc614fd9565b5b828201905092915050565b6000614df382614eb7565b9150614dfe83614eb7565b925082614e0e57614e0d615008565b5b828204905092915050565b6000614e2482614eb7565b9150614e2f83614eb7565b925082821015614e4257614e41614fd9565b5b828203905092915050565b6000614e5882614e97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614eee578082015181840152602081019050614ed3565b83811115614efd576000848401525b50505050565b6000614f0e82614eb7565b91506000821415614f2257614f21614fd9565b5b600182039050919050565b60006002820490506001821680614f4557607f821691505b60208210811415614f5957614f58615037565b5b50919050565b6000614f6a82614eb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9d57614f9c614fd9565b5b600182019050919050565b6000614fb382614eb7565b9150614fbe83614eb7565b925082614fce57614fcd615008565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6150af81614e4d565b81146150ba57600080fd5b50565b6150c681614e5f565b81146150d157600080fd5b50565b6150dd81614e6b565b81146150e857600080fd5b50565b6150f481614eb7565b81146150ff57600080fd5b5056fea264697066735822122001217d2d91eb62efa00bbdf48f4ab633c121c3699d12d2c94b2578256d105e8e64736f6c63430008000033

Deployed Bytecode Sourcemap

49716:3762:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53304:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22006:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23417:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22977:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35672:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49987:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24307:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35340:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51139:87;;;;;;;;;;;;;:::i;:::-;;50789:114;;;;;;;;;;;;;:::i;:::-;;50980:65;;;;;;;;;;;;;:::i;:::-;;51760:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24717:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48119:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35862:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51234:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44178:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21700:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50100:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21430:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47110:148;;;;;;;;;;;;;:::i;:::-;;51053:78;;;;;;;;;;;;;:::i;:::-;;51850:849;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50911:61;;;;;;;;;;;;;:::i;:::-;;46459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51344:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22175:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50027:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49956:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23710:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50130:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50404:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24973:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50062:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53141:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49918:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50277:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24076:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47413:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53304:171;53407:4;53431:36;53455:11;53431:23;:36::i;:::-;53424:43;;53304:171;;;:::o;22006:100::-;22060:13;22093:5;22086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22006:100;:::o;23417:221::-;23493:7;23521:16;23529:7;23521;:16::i;:::-;23513:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23606:15;:24;23622:7;23606:24;;;;;;;;;;;;;;;;;;;;;23599:31;;23417:221;;;:::o;22977:374::-;23058:13;23074:23;23089:7;23074:14;:23::i;:::-;23058:39;;23122:5;23116:11;;:2;:11;;;;23108:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23202:5;23186:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23211:37;23228:5;23235:12;:10;:12::i;:::-;23211:16;:37::i;:::-;23186:62;23178:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;23322:21;23331:2;23335:7;23322:8;:21::i;:::-;22977:374;;;:::o;35672:113::-;35733:7;35760:10;:17;;;;35753:24;;35672:113;:::o;49987:33::-;;;;:::o;24307:339::-;24502:41;24521:12;:10;:12::i;:::-;24535:7;24502:18;:41::i;:::-;24494:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24610:28;24620:4;24626:2;24630:7;24610:9;:28::i;:::-;24307:339;;;:::o;35340:256::-;35437:7;35473:23;35490:5;35473:16;:23::i;:::-;35465:5;:31;35457:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35562:12;:19;35575:5;35562:19;;;;;;;;;;;;;;;:26;35582:5;35562:26;;;;;;;;;;;;35555:33;;35340:256;;;;:::o;51139:87::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51207:11:::1;;;;;;;;;;;51206:12;51192:11;;:26;;;;;;;;;;;;;;;;;;51139:87::o:0;50789:114::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50853:12:::1;:10;:12::i;:::-;50845:26;;:49;50872:21;50845:49;;;;;;;;;;;;;;;;;;;;;;;50837:58;;;::::0;::::1;;50789:114::o:0;50980:65::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51027:10:::1;:8;:10::i;:::-;50980:65::o:0;51760:82::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51818:16:::1;51831:2;51818:12;:16::i;:::-;51760:82:::0;:::o;24717:185::-;24855:39;24872:4;24878:2;24882:7;24855:39;;;;;;;;;;;;:16;:39::i;:::-;24717:185;;;:::o;48119:245::-;48237:41;48256:12;:10;:12::i;:::-;48270:7;48237:18;:41::i;:::-;48229:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;48342:14;48348:7;48342:5;:14::i;:::-;48119:245;:::o;35862:233::-;35937:7;35973:30;:28;:30::i;:::-;35965:5;:38;35957:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:10;36081:5;36070:17;;;;;;;;;;;;;;;;;;;;;;;;36063:24;;35862:233;;;:::o;51234:102::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51318:10:::1;51308:7;:20;;;;;;;;;;;;:::i;:::-;;51234:102:::0;:::o;44178:86::-;44225:4;44249:7;;;;;;;;;;;44242:14;;44178:86;:::o;21700:239::-;21772:7;21792:13;21808:7;:16;21816:7;21808:16;;;;;;;;;;;;;;;;;;;;;21792:32;;21860:1;21843:19;;:5;:19;;;;21835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21926:5;21919:12;;;21700:239;;;:::o;50100:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21430:208::-;21502:7;21547:1;21530:19;;:5;:19;;;;21522:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21614:9;:16;21624:5;21614:16;;;;;;;;;;;;;;;;21607:23;;21430:208;;;:::o;47110:148::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47217:1:::1;47180:40;;47201:6;;;;;;;;;;;47180:40;;;;;;;;;;;;47248:1;47231:6;;:19;;;;;;;;;;;;;;;;;;47110:148::o:0;51053:78::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51115:8:::1;;;;;;;;;;;51114:9;51103:8;;:20;;;;;;;;;;;;;;;;;;51053:78::o:0;51850:849::-;51961:14;51978:13;:11;:13::i;:::-;51961:30;;52014:8;;;;;;;;;;;52006:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52081:1;52067:11;:15;52059:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52159:13;;52144:11;:28;;52136:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52263:9;;52248:11;52239:6;:20;;;;:::i;:::-;:33;;52231:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52356:1;52332:9;:21;52342:10;52332:21;;;;;;;;;;;;;;;;:25;52324:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52441:11;52416:9;:21;52426:10;52416:21;;;;;;;;;;;;;;;;:36;;52408:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52499:9;52511:1;52499:13;;52494:198;52519:11;52514:1;:16;52494:198;;52556:9;:21;52566:10;52556:21;;;;;;;;;;;;;;;;:23;;;;;;;;;:::i;:::-;;;;;;52650:26;52660:3;52674:1;52665:6;:10;;;;:::i;:::-;52650:9;:26::i;:::-;52532:3;;;;;:::i;:::-;;;;52494:198;;;;51850:849;;;:::o;50911:61::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50956:8:::1;:6;:8::i;:::-;50911:61::o:0;46459:87::-;46505:7;46532:6;;;;;;;;;;;46525:13;;46459:87;:::o;51344:88::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51416:8:::1;51408:5;:16;;;;51344:88:::0;:::o;22175:104::-;22231:13;22264:7;22257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22175:104;:::o;50027:28::-;;;;;;;;;;;;;:::o;49956:24::-;;;;:::o;23710:295::-;23825:12;:10;:12::i;:::-;23813:24;;:8;:24;;;;23805:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23925:8;23880:18;:32;23899:12;:10;:12::i;:::-;23880:32;;;;;;;;;;;;;;;:42;23913:8;23880:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23978:8;23949:48;;23964:12;:10;:12::i;:::-;23949:48;;;23988:8;23949:48;;;;;;:::i;:::-;;;;;;;;23710:295;;:::o;50130:44::-;;;;;;;;;;;;;;;;;:::o;50404:377::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50569:8:::1;:15;50549:9;:16;:35;50527:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;50668:9;50663:111;50687:9;:16;50683:1;:20;50663:111;;;50751:8;50760:1;50751:11;;;;;;;;;;;;;;;;;;;;;;50725:9;:23;50735:9;50745:1;50735:12;;;;;;;;;;;;;;;;;;;;;;50725:23;;;;;;;;;;;;;;;:37;;;;50705:3;;;;;:::i;:::-;;;;50663:111;;;;50404:377:::0;;:::o;24973:328::-;25148:41;25167:12;:10;:12::i;:::-;25181:7;25148:18;:41::i;:::-;25140:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25254:39;25268:4;25274:2;25278:7;25287:5;25254:13;:39::i;:::-;24973:328;;;;:::o;50062:31::-;;;;;;;;;;;;;:::o;53141:155::-;53232:13;53265:23;53280:7;53265:14;:23::i;:::-;53258:30;;53141:155;;;:::o;49918:31::-;;;;:::o;50277:119::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50344:9:::1;50339:49;50363:2;50359:1;:6;50339:49;;;50372:16;50385:2;50372:12;:16::i;:::-;50367:3;;;;;:::i;:::-;;;;50339:49;;;;50277:119:::0;:::o;24076:164::-;24173:4;24197:18;:25;24216:5;24197:25;;;;;;;;;;;;;;;:35;24223:8;24197:35;;;;;;;;;;;;;;;;;;;;;;;;;24190:42;;24076:164;;;;:::o;47413:244::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47522:1:::1;47502:22;;:8;:22;;;;47494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47612:8;47583:38;;47604:6;;;;;;;;;;;47583:38;;;;;;;;;;;;47641:8;47632:6;;:17;;;;;;;;;;;;;;;;;;47413:244:::0;:::o;35032:224::-;35134:4;35173:35;35158:50;;;:11;:50;;;;:90;;;;35212:36;35236:11;35212:23;:36::i;:::-;35158:90;35151:97;;35032:224;;;:::o;26811:127::-;26876:4;26928:1;26900:30;;:7;:16;26908:7;26900:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26893:37;;26811:127;;;:::o;16406:98::-;16459:7;16486:10;16479:17;;16406:98;:::o;30756:174::-;30858:2;30831:15;:24;30847:7;30831:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30914:7;30910:2;30876:46;;30885:23;30900:7;30885:14;:23::i;:::-;30876:46;;;;;;;;;;;;30756:174;;:::o;27105:348::-;27198:4;27223:16;27231:7;27223;:16::i;:::-;27215:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27299:13;27315:23;27330:7;27315:14;:23::i;:::-;27299:39;;27368:5;27357:16;;:7;:16;;;:51;;;;27401:7;27377:31;;:20;27389:7;27377:11;:20::i;:::-;:31;;;27357:51;:87;;;;27412:32;27429:5;27436:7;27412:16;:32::i;:::-;27357:87;27349:96;;;27105:348;;;;:::o;30060:578::-;30219:4;30192:31;;:23;30207:7;30192:14;:23::i;:::-;:31;;;30184:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30302:1;30288:16;;:2;:16;;;;30280:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30358:39;30379:4;30385:2;30389:7;30358:20;:39::i;:::-;30462:29;30479:1;30483:7;30462:8;:29::i;:::-;30523:1;30504:9;:15;30514:4;30504:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30552:1;30535:9;:13;30545:2;30535:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30583:2;30564:7;:16;30572:7;30564:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30622:7;30618:2;30603:27;;30612:4;30603:27;;;;;;;;;;;;30060:578;;;:::o;45237:120::-;44781:8;:6;:8::i;:::-;44773:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45306:5:::1;45296:7;;:15;;;;;;;;;;;;;;;;;;45327:22;45336:12;:10;:12::i;:::-;45327:22;;;;;;:::i;:::-;;;;;;;;45237:120::o:0;51548:204::-;51626:9;;51610:13;:11;:13::i;:::-;:25;51602:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51666:40;51676:2;51680:25;:15;:23;:25::i;:::-;51666:9;:40::i;:::-;51717:27;:15;:25;:27::i;:::-;51548:204;:::o;53018:115::-;53105:20;53117:7;53105:11;:20::i;:::-;53018:115;:::o;27795:110::-;27871:26;27881:2;27885:7;27871:26;;;;;;;;;;;;:9;:26::i;:::-;27795:110;;:::o;44978:118::-;44504:8;:6;:8::i;:::-;44503:9;44495:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45048:4:::1;45038:7;;:14;;;;;;;;;;;;;;;;;;45068:20;45075:12;:10;:12::i;:::-;45068:20;;;;;;:::i;:::-;;;;;;;;44978:118::o:0;26183:315::-;26340:28;26350:4;26356:2;26360:7;26340:9;:28::i;:::-;26387:48;26410:4;26416:2;26420:7;26429:5;26387:22;:48::i;:::-;26379:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26183:315;;;;:::o;41610:679::-;41683:13;41717:16;41725:7;41717;:16::i;:::-;41709:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41800:23;41826:10;:19;41837:7;41826:19;;;;;;;;;;;41800:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41856:18;41877:10;:8;:10::i;:::-;41856:31;;41985:1;41969:4;41963:18;:23;41959:72;;;42010:9;42003:16;;;;;;41959:72;42161:1;42141:9;42135:23;:27;42131:108;;;42210:4;42216:9;42193:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42179:48;;;;;;42131:108;42258:23;42273:7;42258:14;:23::i;:::-;42251:30;;;;41610:679;;;;:::o;21100:266::-;21202:4;21241:25;21226:40;;;:11;:40;;;;:92;;;;21285:33;21270:48;;;:11;:48;;;;21226:92;:132;;;;21322:36;21346:11;21322:23;:36::i;:::-;21226:132;21219:139;;21100:266;;;:::o;52711:229::-;44504:8;:6;:8::i;:::-;44503:9;44495:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52887:45:::1;52914:4;52920:2;52924:7;52887:26;:45::i;:::-;52711:229:::0;;;:::o;49190:114::-;49255:7;49282;:14;;;49275:21;;49190:114;;;:::o;49312:127::-;49419:1;49401:7;:14;;;:19;;;;;;;;;;;49312:127;:::o;42891:206::-;42960:20;42972:7;42960:11;:20::i;:::-;43034:1;43003:10;:19;43014:7;43003:19;;;;;;;;;;;42997:33;;;;;:::i;:::-;;;:38;42993:97;;43059:10;:19;43070:7;43059:19;;;;;;;;;;;;43052:26;;;;:::i;:::-;42993:97;42891:206;:::o;28132:284::-;28262:18;28268:2;28272:7;28262:5;:18::i;:::-;28299:54;28330:1;28334:2;28338:7;28347:5;28299:22;:54::i;:::-;28291:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;28132:284;;;:::o;31495:872::-;31650:4;31671:15;:2;:13;;;:15::i;:::-;31667:693;;;31723:2;31707:36;;;31744:12;:10;:12::i;:::-;31758:4;31764:7;31773:5;31707:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31703:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31970:1;31953:6;:13;:18;31949:341;;;31996:60;;;;;;;;;;:::i;:::-;;;;;;;;31949:341;32240:6;32234:13;32225:6;32221:2;32217:15;32210:38;31703:602;31840:45;;;31830:55;;;:6;:55;;;;31823:62;;;;;31667:693;32344:4;32337:11;;31495:872;;;;;;;:::o;51440:100::-;51492:13;51525:7;51518:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51440:100;:::o;22350:334::-;22423:13;22457:16;22465:7;22457;:16::i;:::-;22449:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22538:21;22562:10;:8;:10::i;:::-;22538:34;;22614:1;22596:7;22590:21;:25;:86;;;;;;;;;;;;;;;;;22642:7;22651:18;:7;:16;:18::i;:::-;22625:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22590:86;22583:93;;;22350:334;;;:::o;19616:157::-;19701:4;19740:25;19725:40;;;:11;:40;;;;19718:47;;19616:157;;;:::o;36708:589::-;36852:45;36879:4;36885:2;36889:7;36852:26;:45::i;:::-;36930:1;36914:18;;:4;:18;;;36910:187;;;36949:40;36981:7;36949:31;:40::i;:::-;36910:187;;;37019:2;37011:10;;:4;:10;;;37007:90;;37038:47;37071:4;37077:7;37038:32;:47::i;:::-;37007:90;36910:187;37125:1;37111:16;;:2;:16;;;37107:183;;;37144:45;37181:7;37144:36;:45::i;:::-;37107:183;;;37217:4;37211:10;;:2;:10;;;37207:83;;37238:40;37266:2;37270:7;37238:27;:40::i;:::-;37207:83;37107:183;36708:589;;;:::o;29363:360::-;29423:13;29439:23;29454:7;29439:14;:23::i;:::-;29423:39;;29475:48;29496:5;29511:1;29515:7;29475:20;:48::i;:::-;29564:29;29581:1;29585:7;29564:8;:29::i;:::-;29626:1;29606:9;:16;29616:5;29606:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29645:7;:16;29653:7;29645:16;;;;;;;;;;;;29638:23;;;;;;;;;;;29707:7;29703:1;29679:36;;29688:5;29679:36;;;;;;;;;;;;29363:360;;:::o;28752:382::-;28846:1;28832:16;;:2;:16;;;;28824:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28905:16;28913:7;28905;:16::i;:::-;28904:17;28896:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28967:45;28996:1;29000:2;29004:7;28967:20;:45::i;:::-;29042:1;29025:9;:13;29035:2;29025:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29073:2;29054:7;:16;29062:7;29054:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29118:7;29114:2;29093:33;;29110:1;29093:33;;;;;;;;;;;;28752:382;;:::o;8287:444::-;8347:4;8555:12;8679:7;8667:20;8659:28;;8722:1;8715:4;:8;8708:15;;;8287:444;;;:::o;17063:723::-;17119:13;17349:1;17340:5;:10;17336:53;;;17367:10;;;;;;;;;;;;;;;;;;;;;17336:53;17399:12;17414:5;17399:20;;17430:14;17455:78;17470:1;17462:4;:9;17455:78;;17488:8;;;;;:::i;:::-;;;;17519:2;17511:10;;;;;:::i;:::-;;;17455:78;;;17543:19;17575:6;17565:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17543:39;;17593:154;17609:1;17600:5;:10;17593:154;;17637:1;17627:11;;;;;:::i;:::-;;;17704:2;17696:5;:10;;;;:::i;:::-;17683:2;:24;;;;:::i;:::-;17670:39;;17653:6;17660;17653:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17733:2;17724:11;;;;;:::i;:::-;;;17593:154;;;17771:6;17757:21;;;;;17063:723;;;;:::o;32980:126::-;;;;:::o;38020:164::-;38124:10;:17;;;;38097:15;:24;38113:7;38097:24;;;;;;;;;;;:44;;;;38152:10;38168:7;38152:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38020:164;:::o;38811:988::-;39077:22;39127:1;39102:22;39119:4;39102:16;:22::i;:::-;:26;;;;:::i;:::-;39077:51;;39139:18;39160:17;:26;39178:7;39160:26;;;;;;;;;;;;39139:47;;39307:14;39293:10;:28;39289:328;;39338:19;39360:12;:18;39373:4;39360:18;;;;;;;;;;;;;;;:34;39379:14;39360:34;;;;;;;;;;;;39338:56;;39444:11;39411:12;:18;39424:4;39411:18;;;;;;;;;;;;;;;:30;39430:10;39411:30;;;;;;;;;;;:44;;;;39561:10;39528:17;:30;39546:11;39528:30;;;;;;;;;;;:43;;;;39289:328;;39713:17;:26;39731:7;39713:26;;;;;;;;;;;39706:33;;;39757:12;:18;39770:4;39757:18;;;;;;;;;;;;;;;:34;39776:14;39757:34;;;;;;;;;;;39750:41;;;38811:988;;;;:::o;40094:1079::-;40347:22;40392:1;40372:10;:17;;;;:21;;;;:::i;:::-;40347:46;;40404:18;40425:15;:24;40441:7;40425:24;;;;;;;;;;;;40404:45;;40776:19;40798:10;40809:14;40798:26;;;;;;;;;;;;;;;;;;;;;;;;40776:48;;40862:11;40837:10;40848;40837:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40973:10;40942:15;:28;40958:11;40942:28;;;;;;;;;;;:41;;;;41114:15;:24;41130:7;41114:24;;;;;;;;;;;41107:31;;;41149:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40094:1079;;;;:::o;37598:221::-;37683:14;37700:20;37717:2;37700:16;:20::i;:::-;37683:37;;37758:7;37731:12;:16;37744:2;37731:16;;;;;;;;;;;;;;;:24;37748:6;37731:24;;;;;;;;;;;:34;;;;37805:6;37776:17;:26;37794:7;37776:26;;;;;;;;;;;:35;;;;37598:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2157:303::-;;2277:3;2270:4;2262:6;2258:17;2254:27;2244:2;;2295:1;2292;2285:12;2244:2;2335:6;2322:20;2360:94;2450:3;2442:6;2435:4;2427:6;2423:17;2360:94;:::i;:::-;2351:103;;2234:226;;;;;:::o;2483:303::-;;2603:3;2596:4;2588:6;2584:17;2580:27;2570:2;;2621:1;2618;2611:12;2570:2;2661:6;2648:20;2686:94;2776:3;2768:6;2761:4;2753:6;2749:17;2686:94;:::i;:::-;2677:103;;2560:226;;;;;:::o;2792:133::-;;2873:6;2860:20;2851:29;;2889:30;2913:5;2889:30;:::i;:::-;2841:84;;;;:::o;2931:137::-;;3014:6;3001:20;2992:29;;3030:32;3056:5;3030:32;:::i;:::-;2982:86;;;;:::o;3074:141::-;;3161:6;3155:13;3146:22;;3177:32;3203:5;3177:32;:::i;:::-;3136:79;;;;:::o;3234:271::-;;3338:3;3331:4;3323:6;3319:17;3315:27;3305:2;;3356:1;3353;3346:12;3305:2;3396:6;3383:20;3421:78;3495:3;3487:6;3480:4;3472:6;3468:17;3421:78;:::i;:::-;3412:87;;3295:210;;;;;:::o;3525:273::-;;3630:3;3623:4;3615:6;3611:17;3607:27;3597:2;;3648:1;3645;3638:12;3597:2;3688:6;3675:20;3713:79;3788:3;3780:6;3773:4;3765:6;3761:17;3713:79;:::i;:::-;3704:88;;3587:211;;;;;:::o;3804:139::-;;3888:6;3875:20;3866:29;;3904:33;3931:5;3904:33;:::i;:::-;3856:87;;;;:::o;3949:262::-;;4057:2;4045:9;4036:7;4032:23;4028:32;4025:2;;;4073:1;4070;4063:12;4025:2;4116:1;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4087:117;4015:196;;;;:::o;4217:407::-;;;4342:2;4330:9;4321:7;4317:23;4313:32;4310:2;;;4358:1;4355;4348:12;4310:2;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4300:324;;;;;:::o;4630:552::-;;;;4772:2;4760:9;4751:7;4747:23;4743:32;4740:2;;;4788:1;4785;4778:12;4740:2;4831:1;4856:53;4901:7;4892:6;4881:9;4877:22;4856:53;:::i;:::-;4846:63;;4802:117;4958:2;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4929:118;5086:2;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5057:118;4730:452;;;;;:::o;5188:809::-;;;;;5356:3;5344:9;5335:7;5331:23;5327:33;5324:2;;;5373:1;5370;5363:12;5324:2;5416:1;5441:53;5486:7;5477:6;5466:9;5462:22;5441:53;:::i;:::-;5431:63;;5387:117;5543:2;5569:53;5614:7;5605:6;5594:9;5590:22;5569:53;:::i;:::-;5559:63;;5514:118;5671:2;5697:53;5742:7;5733:6;5722:9;5718:22;5697:53;:::i;:::-;5687:63;;5642:118;5827:2;5816:9;5812:18;5799:32;5858:18;5850:6;5847:30;5844:2;;;5890:1;5887;5880:12;5844:2;5918:62;5972:7;5963:6;5952:9;5948:22;5918:62;:::i;:::-;5908:72;;5770:220;5314:683;;;;;;;:::o;6003:401::-;;;6125:2;6113:9;6104:7;6100:23;6096:32;6093:2;;;6141:1;6138;6131:12;6093:2;6184:1;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6155:117;6311:2;6337:50;6379:7;6370:6;6359:9;6355:22;6337:50;:::i;:::-;6327:60;;6282:115;6083:321;;;;;:::o;6410:407::-;;;6535:2;6523:9;6514:7;6510:23;6506:32;6503:2;;;6551:1;6548;6541:12;6503:2;6594:1;6619:53;6664:7;6655:6;6644:9;6640:22;6619:53;:::i;:::-;6609:63;;6565:117;6721:2;6747:53;6792:7;6783:6;6772:9;6768:22;6747:53;:::i;:::-;6737:63;;6692:118;6493:324;;;;;:::o;6823:693::-;;;6998:2;6986:9;6977:7;6973:23;6969:32;6966:2;;;7014:1;7011;7004:12;6966:2;7085:1;7074:9;7070:17;7057:31;7115:18;7107:6;7104:30;7101:2;;;7147:1;7144;7137:12;7101:2;7175:78;7245:7;7236:6;7225:9;7221:22;7175:78;:::i;:::-;7165:88;;7028:235;7330:2;7319:9;7315:18;7302:32;7361:18;7353:6;7350:30;7347:2;;;7393:1;7390;7383:12;7347:2;7421:78;7491:7;7482:6;7471:9;7467:22;7421:78;:::i;:::-;7411:88;;7273:236;6956:560;;;;;:::o;7522:260::-;;7629:2;7617:9;7608:7;7604:23;7600:32;7597:2;;;7645:1;7642;7635:12;7597:2;7688:1;7713:52;7757:7;7748:6;7737:9;7733:22;7713:52;:::i;:::-;7703:62;;7659:116;7587:195;;;;:::o;7788:282::-;;7906:2;7894:9;7885:7;7881:23;7877:32;7874:2;;;7922:1;7919;7912:12;7874:2;7965:1;7990:63;8045:7;8036:6;8025:9;8021:22;7990:63;:::i;:::-;7980:73;;7936:127;7864:206;;;;:::o;8076:375::-;;8194:2;8182:9;8173:7;8169:23;8165:32;8162:2;;;8210:1;8207;8200:12;8162:2;8281:1;8270:9;8266:17;8253:31;8311:18;8303:6;8300:30;8297:2;;;8343:1;8340;8333:12;8297:2;8371:63;8426:7;8417:6;8406:9;8402:22;8371:63;:::i;:::-;8361:73;;8224:220;8152:299;;;;:::o;8457:262::-;;8565:2;8553:9;8544:7;8540:23;8536:32;8533:2;;;8581:1;8578;8571:12;8533:2;8624:1;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8595:117;8523:196;;;;:::o;8725:118::-;8812:24;8830:5;8812:24;:::i;:::-;8807:3;8800:37;8790:53;;:::o;8849:109::-;8930:21;8945:5;8930:21;:::i;:::-;8925:3;8918:34;8908:50;;:::o;8964:360::-;;9078:38;9110:5;9078:38;:::i;:::-;9132:70;9195:6;9190:3;9132:70;:::i;:::-;9125:77;;9211:52;9256:6;9251:3;9244:4;9237:5;9233:16;9211:52;:::i;:::-;9288:29;9310:6;9288:29;:::i;:::-;9283:3;9279:39;9272:46;;9054:270;;;;;:::o;9330:364::-;;9446:39;9479:5;9446:39;:::i;:::-;9501:71;9565:6;9560:3;9501:71;:::i;:::-;9494:78;;9581:52;9626:6;9621:3;9614:4;9607:5;9603:16;9581:52;:::i;:::-;9658:29;9680:6;9658:29;:::i;:::-;9653:3;9649:39;9642:46;;9422:272;;;;;:::o;9700:377::-;;9834:39;9867:5;9834:39;:::i;:::-;9889:89;9971:6;9966:3;9889:89;:::i;:::-;9882:96;;9987:52;10032:6;10027:3;10020:4;10013:5;10009:16;9987:52;:::i;:::-;10064:6;10059:3;10055:16;10048:23;;9810:267;;;;;:::o;10083:318::-;;10246:67;10310:2;10305:3;10246:67;:::i;:::-;10239:74;;10343:22;10339:1;10334:3;10330:11;10323:43;10392:2;10387:3;10383:12;10376:19;;10229:172;;;:::o;10407:313::-;;10570:67;10634:2;10629:3;10570:67;:::i;:::-;10563:74;;10667:17;10663:1;10658:3;10654:11;10647:38;10711:2;10706:3;10702:12;10695:19;;10553:167;;;:::o;10726:375::-;;10889:67;10953:2;10948:3;10889:67;:::i;:::-;10882:74;;10986:34;10982:1;10977:3;10973:11;10966:55;11052:13;11047:2;11042:3;11038:12;11031:35;11092:2;11087:3;11083:12;11076:19;;10872:229;;;:::o;11107:382::-;;11270:67;11334:2;11329:3;11270:67;:::i;:::-;11263:74;;11367:34;11363:1;11358:3;11354:11;11347:55;11433:20;11428:2;11423:3;11419:12;11412:42;11480:2;11475:3;11471:12;11464:19;;11253:236;;;:::o;11495:370::-;;11658:67;11722:2;11717:3;11658:67;:::i;:::-;11651:74;;11755:34;11751:1;11746:3;11742:11;11735:55;11821:8;11816:2;11811:3;11807:12;11800:30;11856:2;11851:3;11847:12;11840:19;;11641:224;;;:::o;11871:326::-;;12034:67;12098:2;12093:3;12034:67;:::i;:::-;12027:74;;12131:30;12127:1;12122:3;12118:11;12111:51;12188:2;12183:3;12179:12;12172:19;;12017:180;;;:::o;12203:315::-;;12366:67;12430:2;12425:3;12366:67;:::i;:::-;12359:74;;12463:19;12459:1;12454:3;12450:11;12443:40;12509:2;12504:3;12500:12;12493:19;;12349:169;;;:::o;12524:368::-;;12687:67;12751:2;12746:3;12687:67;:::i;:::-;12680:74;;12784:34;12780:1;12775:3;12771:11;12764:55;12850:6;12845:2;12840:3;12836:12;12829:28;12883:2;12878:3;12874:12;12867:19;;12670:222;;;:::o;12898:323::-;;13061:67;13125:2;13120:3;13061:67;:::i;:::-;13054:74;;13158:27;13154:1;13149:3;13145:11;13138:48;13212:2;13207:3;13203:12;13196:19;;13044:177;;;:::o;13227:376::-;;13390:67;13454:2;13449:3;13390:67;:::i;:::-;13383:74;;13487:34;13483:1;13478:3;13474:11;13467:55;13553:14;13548:2;13543:3;13539:12;13532:36;13594:2;13589:3;13585:12;13578:19;;13373:230;;;:::o;13609:314::-;;13772:67;13836:2;13831:3;13772:67;:::i;:::-;13765:74;;13869:18;13865:1;13860:3;13856:11;13849:39;13914:2;13909:3;13905:12;13898:19;;13755:168;;;:::o;13929:371::-;;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14189:34;14185:1;14180:3;14176:11;14169:55;14255:9;14250:2;14245:3;14241:12;14234:31;14291:2;14286:3;14282:12;14275:19;;14075:225;;;:::o;14306:388::-;;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14566:34;14562:1;14557:3;14553:11;14546:55;14632:26;14627:2;14622:3;14618:12;14611:48;14685:2;14680:3;14676:12;14669:19;;14452:242;;;:::o;14700:374::-;;14863:67;14927:2;14922:3;14863:67;:::i;:::-;14856:74;;14960:34;14956:1;14951:3;14947:11;14940:55;15026:12;15021:2;15016:3;15012:12;15005:34;15065:2;15060:3;15056:12;15049:19;;14846:228;;;:::o;15080:373::-;;15243:67;15307:2;15302:3;15243:67;:::i;:::-;15236:74;;15340:34;15336:1;15331:3;15327:11;15320:55;15406:11;15401:2;15396:3;15392:12;15385:33;15444:2;15439:3;15435:12;15428:19;;15226:227;;;:::o;15459:366::-;;15622:67;15686:2;15681:3;15622:67;:::i;:::-;15615:74;;15719:34;15715:1;15710:3;15706:11;15699:55;15785:4;15780:2;15775:3;15771:12;15764:26;15816:2;15811:3;15807:12;15800:19;;15605:220;;;:::o;15831:328::-;;15994:67;16058:2;16053:3;15994:67;:::i;:::-;15987:74;;16091:32;16087:1;16082:3;16078:11;16071:53;16150:2;16145:3;16141:12;16134:19;;15977:182;;;:::o;16165:330::-;;16328:67;16392:2;16387:3;16328:67;:::i;:::-;16321:74;;16425:34;16421:1;16416:3;16412:11;16405:55;16486:2;16481:3;16477:12;16470:19;;16311:184;;;:::o;16501:381::-;;16664:67;16728:2;16723:3;16664:67;:::i;:::-;16657:74;;16761:34;16757:1;16752:3;16748:11;16741:55;16827:19;16822:2;16817:3;16813:12;16806:41;16873:2;16868:3;16864:12;16857:19;;16647:235;;;:::o;16888:329::-;;17051:67;17115:2;17110:3;17051:67;:::i;:::-;17044:74;;17148:33;17144:1;17139:3;17135:11;17128:54;17208:2;17203:3;17199:12;17192:19;;17034:183;;;:::o;17223:376::-;;17386:67;17450:2;17445:3;17386:67;:::i;:::-;17379:74;;17483:34;17479:1;17474:3;17470:11;17463:55;17549:14;17544:2;17539:3;17535:12;17528:36;17590:2;17585:3;17581:12;17574:19;;17369:230;;;:::o;17605:330::-;;17768:67;17832:2;17827:3;17768:67;:::i;:::-;17761:74;;17865:34;17861:1;17856:3;17852:11;17845:55;17926:2;17921:3;17917:12;17910:19;;17751:184;;;:::o;17941:373::-;;18104:67;18168:2;18163:3;18104:67;:::i;:::-;18097:74;;18201:34;18197:1;18192:3;18188:11;18181:55;18267:11;18262:2;18257:3;18253:12;18246:33;18305:2;18300:3;18296:12;18289:19;;18087:227;;;:::o;18320:379::-;;18483:67;18547:2;18542:3;18483:67;:::i;:::-;18476:74;;18580:34;18576:1;18571:3;18567:11;18560:55;18646:17;18641:2;18636:3;18632:12;18625:39;18690:2;18685:3;18681:12;18674:19;;18466:233;;;:::o;18705:365::-;;18868:67;18932:2;18927:3;18868:67;:::i;:::-;18861:74;;18965:34;18961:1;18956:3;18952:11;18945:55;19031:3;19026:2;19021:3;19017:12;19010:25;19061:2;19056:3;19052:12;19045:19;;18851:219;;;:::o;19076:381::-;;19239:67;19303:2;19298:3;19239:67;:::i;:::-;19232:74;;19336:34;19332:1;19327:3;19323:11;19316:55;19402:19;19397:2;19392:3;19388:12;19381:41;19448:2;19443:3;19439:12;19432:19;;19222:235;;;:::o;19463:376::-;;19626:67;19690:2;19685:3;19626:67;:::i;:::-;19619:74;;19723:34;19719:1;19714:3;19710:11;19703:55;19789:14;19784:2;19779:3;19775:12;19768:36;19830:2;19825:3;19821:12;19814:19;;19609:230;;;:::o;19845:318::-;;20008:67;20072:2;20067:3;20008:67;:::i;:::-;20001:74;;20105:22;20101:1;20096:3;20092:11;20085:43;20154:2;20149:3;20145:12;20138:19;;19991:172;;;:::o;20169:380::-;;20332:67;20396:2;20391:3;20332:67;:::i;:::-;20325:74;;20429:34;20425:1;20420:3;20416:11;20409:55;20495:18;20490:2;20485:3;20481:12;20474:40;20540:2;20535:3;20531:12;20524:19;;20315:234;;;:::o;20555:372::-;;20718:67;20782:2;20777:3;20718:67;:::i;:::-;20711:74;;20815:34;20811:1;20806:3;20802:11;20795:55;20881:10;20876:2;20871:3;20867:12;20860:32;20918:2;20913:3;20909:12;20902:19;;20701:226;;;:::o;20933:118::-;21020:24;21038:5;21020:24;:::i;:::-;21015:3;21008:37;20998:53;;:::o;21057:435::-;;21259:95;21350:3;21341:6;21259:95;:::i;:::-;21252:102;;21371:95;21462:3;21453:6;21371:95;:::i;:::-;21364:102;;21483:3;21476:10;;21241:251;;;;;:::o;21498:222::-;;21629:2;21618:9;21614:18;21606:26;;21642:71;21710:1;21699:9;21695:17;21686:6;21642:71;:::i;:::-;21596:124;;;;:::o;21726:640::-;;21959:3;21948:9;21944:19;21936:27;;21973:71;22041:1;22030:9;22026:17;22017:6;21973:71;:::i;:::-;22054:72;22122:2;22111:9;22107:18;22098:6;22054:72;:::i;:::-;22136;22204:2;22193:9;22189:18;22180:6;22136:72;:::i;:::-;22255:9;22249:4;22245:20;22240:2;22229:9;22225:18;22218:48;22283:76;22354:4;22345:6;22283:76;:::i;:::-;22275:84;;21926:440;;;;;;;:::o;22372:210::-;;22497:2;22486:9;22482:18;22474:26;;22510:65;22572:1;22561:9;22557:17;22548:6;22510:65;:::i;:::-;22464:118;;;;:::o;22588:313::-;;22739:2;22728:9;22724:18;22716:26;;22788:9;22782:4;22778:20;22774:1;22763:9;22759:17;22752:47;22816:78;22889:4;22880:6;22816:78;:::i;:::-;22808:86;;22706:195;;;;:::o;22907:419::-;;23111:2;23100:9;23096:18;23088:26;;23160:9;23154:4;23150:20;23146:1;23135:9;23131:17;23124:47;23188:131;23314:4;23188:131;:::i;:::-;23180:139;;23078:248;;;:::o;23332:419::-;;23536:2;23525:9;23521:18;23513:26;;23585:9;23579:4;23575:20;23571:1;23560:9;23556:17;23549:47;23613:131;23739:4;23613:131;:::i;:::-;23605:139;;23503:248;;;:::o;23757:419::-;;23961:2;23950:9;23946:18;23938:26;;24010:9;24004:4;24000:20;23996:1;23985:9;23981:17;23974:47;24038:131;24164:4;24038:131;:::i;:::-;24030:139;;23928:248;;;:::o;24182:419::-;;24386:2;24375:9;24371:18;24363:26;;24435:9;24429:4;24425:20;24421:1;24410:9;24406:17;24399:47;24463:131;24589:4;24463:131;:::i;:::-;24455:139;;24353:248;;;:::o;24607:419::-;;24811:2;24800:9;24796:18;24788:26;;24860:9;24854:4;24850:20;24846:1;24835:9;24831:17;24824:47;24888:131;25014:4;24888:131;:::i;:::-;24880:139;;24778:248;;;:::o;25032:419::-;;25236:2;25225:9;25221:18;25213:26;;25285:9;25279:4;25275:20;25271:1;25260:9;25256:17;25249:47;25313:131;25439:4;25313:131;:::i;:::-;25305:139;;25203:248;;;:::o;25457:419::-;;25661:2;25650:9;25646:18;25638:26;;25710:9;25704:4;25700:20;25696:1;25685:9;25681:17;25674:47;25738:131;25864:4;25738:131;:::i;:::-;25730:139;;25628:248;;;:::o;25882:419::-;;26086:2;26075:9;26071:18;26063:26;;26135:9;26129:4;26125:20;26121:1;26110:9;26106:17;26099:47;26163:131;26289:4;26163:131;:::i;:::-;26155:139;;26053:248;;;:::o;26307:419::-;;26511:2;26500:9;26496:18;26488:26;;26560:9;26554:4;26550:20;26546:1;26535:9;26531:17;26524:47;26588:131;26714:4;26588:131;:::i;:::-;26580:139;;26478:248;;;:::o;26732:419::-;;26936:2;26925:9;26921:18;26913:26;;26985:9;26979:4;26975:20;26971:1;26960:9;26956:17;26949:47;27013:131;27139:4;27013:131;:::i;:::-;27005:139;;26903:248;;;:::o;27157:419::-;;27361:2;27350:9;27346:18;27338:26;;27410:9;27404:4;27400:20;27396:1;27385:9;27381:17;27374:47;27438:131;27564:4;27438:131;:::i;:::-;27430:139;;27328:248;;;:::o;27582:419::-;;27786:2;27775:9;27771:18;27763:26;;27835:9;27829:4;27825:20;27821:1;27810:9;27806:17;27799:47;27863:131;27989:4;27863:131;:::i;:::-;27855:139;;27753:248;;;:::o;28007:419::-;;28211:2;28200:9;28196:18;28188:26;;28260:9;28254:4;28250:20;28246:1;28235:9;28231:17;28224:47;28288:131;28414:4;28288:131;:::i;:::-;28280:139;;28178:248;;;:::o;28432:419::-;;28636:2;28625:9;28621:18;28613:26;;28685:9;28679:4;28675:20;28671:1;28660:9;28656:17;28649:47;28713:131;28839:4;28713:131;:::i;:::-;28705:139;;28603:248;;;:::o;28857:419::-;;29061:2;29050:9;29046:18;29038:26;;29110:9;29104:4;29100:20;29096:1;29085:9;29081:17;29074:47;29138:131;29264:4;29138:131;:::i;:::-;29130:139;;29028:248;;;:::o;29282:419::-;;29486:2;29475:9;29471:18;29463:26;;29535:9;29529:4;29525:20;29521:1;29510:9;29506:17;29499:47;29563:131;29689:4;29563:131;:::i;:::-;29555:139;;29453:248;;;:::o;29707:419::-;;29911:2;29900:9;29896:18;29888:26;;29960:9;29954:4;29950:20;29946:1;29935:9;29931:17;29924:47;29988:131;30114:4;29988:131;:::i;:::-;29980:139;;29878:248;;;:::o;30132:419::-;;30336:2;30325:9;30321:18;30313:26;;30385:9;30379:4;30375:20;30371:1;30360:9;30356:17;30349:47;30413:131;30539:4;30413:131;:::i;:::-;30405:139;;30303:248;;;:::o;30557:419::-;;30761:2;30750:9;30746:18;30738:26;;30810:9;30804:4;30800:20;30796:1;30785:9;30781:17;30774:47;30838:131;30964:4;30838:131;:::i;:::-;30830:139;;30728:248;;;:::o;30982:419::-;;31186:2;31175:9;31171:18;31163:26;;31235:9;31229:4;31225:20;31221:1;31210:9;31206:17;31199:47;31263:131;31389:4;31263:131;:::i;:::-;31255:139;;31153:248;;;:::o;31407:419::-;;31611:2;31600:9;31596:18;31588:26;;31660:9;31654:4;31650:20;31646:1;31635:9;31631:17;31624:47;31688:131;31814:4;31688:131;:::i;:::-;31680:139;;31578:248;;;:::o;31832:419::-;;32036:2;32025:9;32021:18;32013:26;;32085:9;32079:4;32075:20;32071:1;32060:9;32056:17;32049:47;32113:131;32239:4;32113:131;:::i;:::-;32105:139;;32003:248;;;:::o;32257:419::-;;32461:2;32450:9;32446:18;32438:26;;32510:9;32504:4;32500:20;32496:1;32485:9;32481:17;32474:47;32538:131;32664:4;32538:131;:::i;:::-;32530:139;;32428:248;;;:::o;32682:419::-;;32886:2;32875:9;32871:18;32863:26;;32935:9;32929:4;32925:20;32921:1;32910:9;32906:17;32899:47;32963:131;33089:4;32963:131;:::i;:::-;32955:139;;32853:248;;;:::o;33107:419::-;;33311:2;33300:9;33296:18;33288:26;;33360:9;33354:4;33350:20;33346:1;33335:9;33331:17;33324:47;33388:131;33514:4;33388:131;:::i;:::-;33380:139;;33278:248;;;:::o;33532:419::-;;33736:2;33725:9;33721:18;33713:26;;33785:9;33779:4;33775:20;33771:1;33760:9;33756:17;33749:47;33813:131;33939:4;33813:131;:::i;:::-;33805:139;;33703:248;;;:::o;33957:419::-;;34161:2;34150:9;34146:18;34138:26;;34210:9;34204:4;34200:20;34196:1;34185:9;34181:17;34174:47;34238:131;34364:4;34238:131;:::i;:::-;34230:139;;34128:248;;;:::o;34382:419::-;;34586:2;34575:9;34571:18;34563:26;;34635:9;34629:4;34625:20;34621:1;34610:9;34606:17;34599:47;34663:131;34789:4;34663:131;:::i;:::-;34655:139;;34553:248;;;:::o;34807:419::-;;35011:2;35000:9;34996:18;34988:26;;35060:9;35054:4;35050:20;35046:1;35035:9;35031:17;35024:47;35088:131;35214:4;35088:131;:::i;:::-;35080:139;;34978:248;;;:::o;35232:419::-;;35436:2;35425:9;35421:18;35413:26;;35485:9;35479:4;35475:20;35471:1;35460:9;35456:17;35449:47;35513:131;35639:4;35513:131;:::i;:::-;35505:139;;35403:248;;;:::o;35657:222::-;;35788:2;35777:9;35773:18;35765:26;;35801:71;35869:1;35858:9;35854:17;35845:6;35801:71;:::i;:::-;35755:124;;;;:::o;35885:283::-;;35951:2;35945:9;35935:19;;35993:4;35985:6;35981:17;36100:6;36088:10;36085:22;36064:18;36052:10;36049:34;36046:62;36043:2;;;36111:18;;:::i;:::-;36043:2;36151:10;36147:2;36140:22;35925:243;;;;:::o;36174:311::-;;36341:18;36333:6;36330:30;36327:2;;;36363:18;;:::i;:::-;36327:2;36413:4;36405:6;36401:17;36393:25;;36473:4;36467;36463:15;36455:23;;36256:229;;;:::o;36491:311::-;;36658:18;36650:6;36647:30;36644:2;;;36680:18;;:::i;:::-;36644:2;36730:4;36722:6;36718:17;36710:25;;36790:4;36784;36780:15;36772:23;;36573:229;;;:::o;36808:331::-;;36959:18;36951:6;36948:30;36945:2;;;36981:18;;:::i;:::-;36945:2;37066:4;37062:9;37055:4;37047:6;37043:17;37039:33;37031:41;;37127:4;37121;37117:15;37109:23;;36874:265;;;:::o;37145:332::-;;37297:18;37289:6;37286:30;37283:2;;;37319:18;;:::i;:::-;37283:2;37404:4;37400:9;37393:4;37385:6;37381:17;37377:33;37369:41;;37465:4;37459;37455:15;37447:23;;37212:265;;;:::o;37483:98::-;;37568:5;37562:12;37552:22;;37541:40;;;:::o;37587:99::-;;37673:5;37667:12;37657:22;;37646:40;;;:::o;37692:168::-;;37809:6;37804:3;37797:19;37849:4;37844:3;37840:14;37825:29;;37787:73;;;;:::o;37866:169::-;;37984:6;37979:3;37972:19;38024:4;38019:3;38015:14;38000:29;;37962:73;;;;:::o;38041:148::-;;38180:3;38165:18;;38155:34;;;;:::o;38195:305::-;;38254:20;38272:1;38254:20;:::i;:::-;38249:25;;38288:20;38306:1;38288:20;:::i;:::-;38283:25;;38442:1;38374:66;38370:74;38367:1;38364:81;38361:2;;;38448:18;;:::i;:::-;38361:2;38492:1;38489;38485:9;38478:16;;38239:261;;;;:::o;38506:185::-;;38563:20;38581:1;38563:20;:::i;:::-;38558:25;;38597:20;38615:1;38597:20;:::i;:::-;38592:25;;38636:1;38626:2;;38641:18;;:::i;:::-;38626:2;38683:1;38680;38676:9;38671:14;;38548:143;;;;:::o;38697:191::-;;38757:20;38775:1;38757:20;:::i;:::-;38752:25;;38791:20;38809:1;38791:20;:::i;:::-;38786:25;;38830:1;38827;38824:8;38821:2;;;38835:18;;:::i;:::-;38821:2;38880:1;38877;38873:9;38865:17;;38742:146;;;;:::o;38894:96::-;;38960:24;38978:5;38960:24;:::i;:::-;38949:35;;38939:51;;;:::o;38996:90::-;;39073:5;39066:13;39059:21;39048:32;;39038:48;;;:::o;39092:149::-;;39168:66;39161:5;39157:78;39146:89;;39136:105;;;:::o;39247:126::-;;39324:42;39317:5;39313:54;39302:65;;39292:81;;;:::o;39379:77::-;;39445:5;39434:16;;39424:32;;;:::o;39462:154::-;39546:6;39541:3;39536;39523:30;39608:1;39599:6;39594:3;39590:16;39583:27;39513:103;;;:::o;39622:307::-;39690:1;39700:113;39714:6;39711:1;39708:13;39700:113;;;39799:1;39794:3;39790:11;39784:18;39780:1;39775:3;39771:11;39764:39;39736:2;39733:1;39729:10;39724:15;;39700:113;;;39831:6;39828:1;39825:13;39822:2;;;39911:1;39902:6;39897:3;39893:16;39886:27;39822:2;39671:258;;;;:::o;39935:171::-;;39997:24;40015:5;39997:24;:::i;:::-;39988:33;;40043:4;40036:5;40033:15;40030:2;;;40051:18;;:::i;:::-;40030:2;40098:1;40091:5;40087:13;40080:20;;39978:128;;;:::o;40112:320::-;;40193:1;40187:4;40183:12;40173:22;;40240:1;40234:4;40230:12;40261:18;40251:2;;40317:4;40309:6;40305:17;40295:27;;40251:2;40379;40371:6;40368:14;40348:18;40345:38;40342:2;;;40398:18;;:::i;:::-;40342:2;40163:269;;;;:::o;40438:233::-;;40500:24;40518:5;40500:24;:::i;:::-;40491:33;;40546:66;40539:5;40536:77;40533:2;;;40616:18;;:::i;:::-;40533:2;40663:1;40656:5;40652:13;40645:20;;40481:190;;;:::o;40677:176::-;;40726:20;40744:1;40726:20;:::i;:::-;40721:25;;40760:20;40778:1;40760:20;:::i;:::-;40755:25;;40799:1;40789:2;;40804:18;;:::i;:::-;40789:2;40845:1;40842;40838:9;40833:14;;40711:142;;;;:::o;40859:180::-;40907:77;40904:1;40897:88;41004:4;41001:1;40994:15;41028:4;41025:1;41018:15;41045:180;41093:77;41090:1;41083:88;41190:4;41187:1;41180:15;41214:4;41211:1;41204:15;41231:180;41279:77;41276:1;41269:88;41376:4;41373:1;41366:15;41400:4;41397:1;41390:15;41417:180;41465:77;41462:1;41455:88;41562:4;41559:1;41552:15;41586:4;41583:1;41576:15;41603:102;;41695:2;41691:7;41686:2;41679:5;41675:14;41671:28;41661:38;;41651:54;;;:::o;41711:122::-;41784:24;41802:5;41784:24;:::i;:::-;41777:5;41774:35;41764:2;;41823:1;41820;41813:12;41764:2;41754:79;:::o;41839:116::-;41909:21;41924:5;41909:21;:::i;:::-;41902:5;41899:32;41889:2;;41945:1;41942;41935:12;41889:2;41879:76;:::o;41961:120::-;42033:23;42050:5;42033:23;:::i;:::-;42026:5;42023:34;42013:2;;42071:1;42068;42061:12;42013:2;42003:78;:::o;42087:122::-;42160:24;42178:5;42160:24;:::i;:::-;42153:5;42150:35;42140:2;;42199:1;42196;42189:12;42140:2;42130:79;:::o

Swarm Source

ipfs://01217d2d91eb62efa00bbdf48f4ab633c121c3699d12d2c94b2578256d105e8e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.