ETH Price: $3,151.84 (+2.93%)

Token

Apes Run The World (ARTW)
 

Overview

Max Total Supply

5,555 ARTW

Holders

975

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Apes Run The World is a hand-drawn generative collection of gender-inclusive Apes donating to Girls Who Code and other charities decided by the community.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ARTW

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-07
*/

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/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) {
        return msg.data;
    }
}


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



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// 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/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() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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

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

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

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

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

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

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

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

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

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

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File contracts/ARTW.sol


pragma solidity ^0.8.0;



contract ARTW is ERC721Enumerable, Ownable, PaymentSplitter {

    using Strings for uint256;

    uint256 private _price = 0.026 ether;

    string public _baseTokenURI = '';
    
    string public APE_PROVENANCE = '';

    uint256 public MAX_TOKENS_PER_TRANSACTION = 20;

    uint256 public MAX_SUPPLY = 8888;

    uint256 public _startTime = 1631124000;
    uint256 public _presaleStartTime = 1631037600;

    uint256 public _supplyLimit = 0;

    string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS

    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    mapping(uint => string) private _owners;

    event licenseisLocked(string _licenseText);

    address[] private _presaleAccessList;
    mapping(address => bool) private _hasPresaleAccess;

    // Withdrawal addresses
    address t1 = 0xda73C4DFa2F04B189A7f8EafB586501b4D0B73dC; // Team
    address t2 = 0xA6e091846f2a8bb6a56f43a0aDce07Ccd7eb4E24; // Charity

    address[] addressList = [t1, t2];
    uint256[] shareList = [90, 10];

    constructor()
    ERC721("Apes Run The World", "ARTW")
    PaymentSplitter(addressList, shareList)  {}

    function mint(uint256 _count) public payable {
        uint256 supply = totalSupply();
        require( block.timestamp >= _presaleStartTime,                           "Presale has not started yet" );
        require( block.timestamp >= _startTime || _hasPresaleAccess[msg.sender], "General sale has not started yet" );
        require( _count <= MAX_TOKENS_PER_TRANSACTION,                           "You can mint a maximum of 20 Apes per transaction" );
        require( supply + _count <= _supplyLimit,                                "Exceeds current Ape supply limit" );
        require( msg.value >= _price * _count,                                   "Ether sent is not correct" );

        for(uint256 i; i < _count; i++){
            _safeMint( msg.sender, supply + i );
        }
    }

    function airdrop(address _wallet, uint256 _count) public onlyOwner {
        uint256 supply = totalSupply();
        require(supply + _count <= MAX_SUPPLY, "Exceeds maximum Ape supply");
        
        for(uint256 i; i < _count; i++){
            _safeMint(_wallet, supply + i );
        }
    }

    // Just in case Eth does some crazy stuff
    function setPrice(uint256 _newPrice) public onlyOwner {
        _price = _newPrice;
    }

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

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        _baseTokenURI = _newBaseURI;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function setProvenanceHash(string memory _provenanceHash) public onlyOwner {
        APE_PROVENANCE = _provenanceHash;
    }
    
    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "Invalid ID");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function setStartTime(uint256 _newStartTime) public onlyOwner {
        _startTime = _newStartTime;
    }
    
    function setPresaleStartTime(uint256 _newStartTime) public onlyOwner {
        _presaleStartTime = _newStartTime;
    }

    function setSupplyLimit(uint256 _newSupplyLimit) public onlyOwner {
        require( _newSupplyLimit <= MAX_SUPPLY, "Exceeds maximum Ape supply" );
        _supplyLimit = _newSupplyLimit;
    }

    function setPresaleAccessList(address[] memory _addressList) public onlyOwner {
        for(uint256 i; i < _addressList.length; i++){
            _hasPresaleAccess[_addressList[i]] = true;
        }

        _presaleAccessList = _addressList;
    }

    function getPresaleAccessList() public onlyOwner view returns(address[] memory) {
        return _presaleAccessList;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"APE_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleAccessList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"}],"name":"setPresaleAccessList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"setPresaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupplyLimit","type":"uint256"}],"name":"setSupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052665c5edcbc29000060105560405180602001604052806000815250601190805190602001906200003692919062000818565b5060405180602001604052806000815250601290805190602001906200005e92919062000818565b5060146013556122b8601455636138fa20601555636137a8a060165560006017556040518060200160405280600081525060189080519060200190620000a692919062000818565b506000601960006101000a81548160ff02191690831515021790555073da73c4dfa2f04b189a7f8eafb586501b4d0b73dc601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a6e091846f2a8bb6a56f43a0adce07ccd7eb4e24601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601f9060026200022f929190620008a9565b506040518060400160405280605a60ff168152602001600a60ff1681525060209060026200025f92919062000938565b503480156200026d57600080fd5b50601f805480602002602001604051908101604052809291908181526020018280548015620002f257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620002a7575b505050505060208054806020026020016040519081016040528092919081815260200182805480156200034557602002820191906000526020600020905b81548152602001906001019080831162000330575b50505050506040518060400160405280601281526020017f417065732052756e2054686520576f726c6400000000000000000000000000008152506040518060400160405280600481526020017f41525457000000000000000000000000000000000000000000000000000000008152508160009080519060200190620003ce92919062000818565b508060019080519060200190620003e792919062000818565b5050506200040a620003fe6200051060201b60201c565b6200051860201b60201c565b805182511462000451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004489062000ae2565b60405180910390fd5b600082511162000498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200048f9062000b26565b60405180910390fd5b60005b82518110156200050757620004f1838281518110620004bf57620004be62000cf8565b5b6020026020010151838381518110620004dd57620004dc62000cf8565b5b6020026020010151620005de60201b60201c565b8080620004fe9062000c4c565b9150506200049b565b50505062000e66565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006489062000ac0565b60405180910390fd5b6000811162000697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068e9062000b48565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200071c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007139062000b04565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b54620007d3919062000b7b565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200080c92919062000a93565b60405180910390a15050565b828054620008269062000c16565b90600052602060002090601f0160209004810192826200084a576000855562000896565b82601f106200086557805160ff191683800117855562000896565b8280016001018555821562000896579182015b828111156200089557825182559160200191906001019062000878565b5b509050620008a591906200098f565b5090565b82805482825590600052602060002090810192821562000925579160200282015b82811115620009245782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620008ca565b5b5090506200093491906200098f565b5090565b8280548282559060005260206000209081019282156200097c579160200282015b828111156200097b578251829060ff1690559160200191906001019062000959565b5b5090506200098b91906200098f565b5090565b5b80821115620009aa57600081600090555060010162000990565b5090565b620009b98162000bd8565b82525050565b6000620009ce602c8362000b6a565b9150620009db8262000d27565b604082019050919050565b6000620009f560328362000b6a565b915062000a028262000d76565b604082019050919050565b600062000a1c602b8362000b6a565b915062000a298262000dc5565b604082019050919050565b600062000a43601a8362000b6a565b915062000a508262000e14565b602082019050919050565b600062000a6a601d8362000b6a565b915062000a778262000e3d565b602082019050919050565b62000a8d8162000c0c565b82525050565b600060408201905062000aaa6000830185620009ae565b62000ab9602083018462000a82565b9392505050565b6000602082019050818103600083015262000adb81620009bf565b9050919050565b6000602082019050818103600083015262000afd81620009e6565b9050919050565b6000602082019050818103600083015262000b1f8162000a0d565b9050919050565b6000602082019050818103600083015262000b418162000a34565b9050919050565b6000602082019050818103600083015262000b638162000a5b565b9050919050565b600082825260208201905092915050565b600062000b888262000c0c565b915062000b958362000c0c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000bcd5762000bcc62000c9a565b5b828201905092915050565b600062000be58262000bec565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000c2f57607f821691505b6020821081141562000c465762000c4562000cc9565b5b50919050565b600062000c598262000c0c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c8f5762000c8e62000c9a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6159cf8062000e766000396000f3fe6080604052600436106102975760003560e01c80638af8535f1161015a578063a91b9b2a116100c1578063cfc86f7b1161007a578063cfc86f7b14610a62578063d9b137b214610a8d578063e33b7de314610aca578063e985e9c514610af5578063f2fde38b14610b32578063fa1acb5c14610b5b576102de565b8063a91b9b2a14610954578063b09904b51461097f578063b88d4fde146109a8578063bf4702fc146109d1578063c87b56dd146109e8578063ce7c2ac214610a25576102de565b806395d89b411161011357806395d89b41146108515780639852595c1461087c57806398d5fdca146108b95780639c3e72bd146108e4578063a0712d681461090f578063a22cb4651461092b576102de565b80638af8535f146107415780638b83209b1461076c5780638ba4cc3c146107a95780638d6a1357146107d25780638da5cb5b146107fd57806391b7f5ed14610828576102de565b8063361fab25116101fe5780634fce1de3116101b75780634fce1de31461063157806351573f791461065c57806355f804b3146106875780636352211e146106b057806370a08231146106ed578063715018a61461072a576102de565b8063361fab25146105115780633a98ef391461053a5780633e0a322d1461056557806342842e0e1461058e578063438b6300146105b75780634f6ccce7146105f4576102de565b80631916558711610250578063191655871461040557806323b872dd1461042e578063296cab55146104575780632f745c591461048057806332cb6b0c146104bd57806334131cd3146104e8576102de565b806301ffc9a7146102e357806306fdde0314610320578063081812fc1461034b578063095ea7b31461038857806310969523146103b157806318160ddd146103da576102de565b366102de577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102c5610b86565b346040516102d4929190614746565b60405180910390a1005b600080fd5b3480156102ef57600080fd5b5061030a60048036038101906103059190613f07565b610b8e565b60405161031791906147b3565b60405180910390f35b34801561032c57600080fd5b50610335610c08565b60405161034291906147ce565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613faa565b610c9a565b60405161037f91906146b6565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613e7e565b610d1f565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613f61565b610e37565b005b3480156103e657600080fd5b506103ef610ecd565b6040516103fc9190614bd2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613cfb565b610eda565b005b34801561043a57600080fd5b5061045560048036038101906104509190613d68565b611142565b005b34801561046357600080fd5b5061047e60048036038101906104799190613faa565b6111a2565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613e7e565b611228565b6040516104b49190614bd2565b60405180910390f35b3480156104c957600080fd5b506104d26112cd565b6040516104df9190614bd2565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613ebe565b6112d3565b005b34801561051d57600080fd5b5061053860048036038101906105339190613faa565b6113fb565b005b34801561054657600080fd5b5061054f6114c6565b60405161055c9190614bd2565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613faa565b6114d0565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613d68565b611556565b005b3480156105c357600080fd5b506105de60048036038101906105d99190613cce565b611576565b6040516105eb9190614791565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613faa565b611624565b6040516106289190614bd2565b60405180910390f35b34801561063d57600080fd5b50610646611695565b6040516106539190614bd2565b60405180910390f35b34801561066857600080fd5b5061067161169b565b60405161067e9190614bd2565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190613f61565b6116a1565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190613faa565b611737565b6040516106e491906146b6565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190613cce565b6117e9565b6040516107219190614bd2565b60405180910390f35b34801561073657600080fd5b5061073f6118a1565b005b34801561074d57600080fd5b50610756611929565b60405161076391906147ce565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613faa565b6119b7565b6040516107a091906146b6565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613e7e565b6119ff565b005b3480156107de57600080fd5b506107e7611b10565b6040516107f4919061476f565b60405180910390f35b34801561080957600080fd5b50610812611c1a565b60405161081f91906146b6565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613faa565b611c44565b005b34801561085d57600080fd5b50610866611cca565b60405161087391906147ce565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613cce565b611d5c565b6040516108b09190614bd2565b60405180910390f35b3480156108c557600080fd5b506108ce611da5565b6040516108db9190614bd2565b60405180910390f35b3480156108f057600080fd5b506108f9611daf565b60405161090691906147ce565b60405180910390f35b61092960048036038101906109249190613faa565b611e3d565b005b34801561093757600080fd5b50610952600480360381019061094d9190613e3e565b612044565b005b34801561096057600080fd5b506109696121c5565b6040516109769190614bd2565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190613f61565b6121cb565b005b3480156109b457600080fd5b506109cf60048036038101906109ca9190613dbb565b6122b7565b005b3480156109dd57600080fd5b506109e6612319565b005b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613faa565b6123ea565b604051610a1c91906147ce565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190613cce565b612491565b604051610a599190614bd2565b60405180910390f35b348015610a6e57600080fd5b50610a776124da565b604051610a8491906147ce565b60405180910390f35b348015610a9957600080fd5b50610ab46004803603810190610aaf9190613faa565b612568565b604051610ac191906147ce565b60405180910390f35b348015610ad657600080fd5b50610adf612645565b604051610aec9190614bd2565b60405180910390f35b348015610b0157600080fd5b50610b1c6004803603810190610b179190613d28565b61264f565b604051610b2991906147b3565b60405180910390f35b348015610b3e57600080fd5b50610b596004803603810190610b549190613cce565b6126e3565b005b348015610b6757600080fd5b50610b706127db565b604051610b7d9190614bd2565b60405180910390f35b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c015750610c00826127e1565b5b9050919050565b606060008054610c1790614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390614f88565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b5050505050905090565b6000610ca5826128c3565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90614a52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2a82611737565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290614b12565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dba610b86565b73ffffffffffffffffffffffffffffffffffffffff161480610de95750610de881610de3610b86565b61264f565b5b610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906149b2565b60405180910390fd5b610e32838361292f565b505050565b610e3f610b86565b73ffffffffffffffffffffffffffffffffffffffff16610e5d611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90614a92565b60405180910390fd5b8060129080519060200190610ec99291906139a5565b5050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614892565b60405180910390fd5b6000600c5447610f6c9190614d75565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610ffe9190614dfc565b6110089190614dcb565b6110129190614e56565b90506000811415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614972565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110a39190614d75565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546110f49190614d75565b600c8190555061110483826129e8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111359291906146d1565b60405180910390a1505050565b61115361114d610b86565b82612adc565b611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614b72565b60405180910390fd5b61119d838383612bba565b505050565b6111aa610b86565b73ffffffffffffffffffffffffffffffffffffffff166111c8611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614a92565b60405180910390fd5b8060168190555050565b6000611233836117e9565b8210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614812565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60145481565b6112db610b86565b73ffffffffffffffffffffffffffffffffffffffff166112f9611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614a92565b60405180910390fd5b60005b81518110156113e0576001601c600084848151811061137457611373615121565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113d890614feb565b915050611352565b5080601b90805190602001906113f7929190613a2b565b5050565b611403610b86565b73ffffffffffffffffffffffffffffffffffffffff16611421611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614a92565b60405180910390fd5b6014548111156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390614af2565b60405180910390fd5b8060178190555050565b6000600b54905090565b6114d8610b86565b73ffffffffffffffffffffffffffffffffffffffff166114f6611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614a92565b60405180910390fd5b8060158190555050565b611571838383604051806020016040528060008152506122b7565b505050565b60606000611583836117e9565b905060008167ffffffffffffffff8111156115a1576115a0615150565b5b6040519080825280602002602001820160405280156115cf5781602001602082028036833780820191505090505b50905060005b82811015611619576115e78582611228565b8282815181106115fa576115f9615121565b5b602002602001018181525050808061161190614feb565b9150506115d5565b508092505050919050565b600061162e610ecd565b821061166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690614b92565b60405180910390fd5b6008828154811061168357611682615121565b5b90600052602060002001549050919050565b60135481565b60175481565b6116a9610b86565b73ffffffffffffffffffffffffffffffffffffffff166116c7611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614a92565b60405180910390fd5b80601190805190602001906117339291906139a5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906149f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611851906149d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118a9610b86565b73ffffffffffffffffffffffffffffffffffffffff166118c7611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490614a92565b60405180910390fd5b6119276000612e16565b565b6012805461193690614f88565b80601f016020809104026020016040519081016040528092919081815260200182805461196290614f88565b80156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b505050505081565b6000600f82815481106119cd576119cc615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a07610b86565b73ffffffffffffffffffffffffffffffffffffffff16611a25611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290614a92565b60405180910390fd5b6000611a85610ecd565b90506014548282611a969190614d75565b1115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614af2565b60405180910390fd5b60005b82811015611b0a57611af7848284611af29190614d75565b612edc565b8080611b0290614feb565b915050611ada565b50505050565b6060611b1a610b86565b73ffffffffffffffffffffffffffffffffffffffff16611b38611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590614a92565b60405180910390fd5b601b805480602002602001604051908101604052809291908181526020018280548015611c1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611bc6575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c4c610b86565b73ffffffffffffffffffffffffffffffffffffffff16611c6a611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614a92565b60405180910390fd5b8060108190555050565b606060018054611cd990614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0590614f88565b8015611d525780601f10611d2757610100808354040283529160200191611d52565b820191906000526020600020905b815481529060010190602001808311611d3557829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601054905090565b60188054611dbc90614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890614f88565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b505050505081565b6000611e47610ecd565b9050601654421015611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590614a72565b60405180910390fd5b60155442101580611ee85750601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906148f2565b60405180910390fd5b601354821115611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390614992565b60405180910390fd5b6017548282611f7b9190614d75565b1115611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390614bb2565b60405180910390fd5b81601054611fca9190614dfc565b34101561200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200390614b32565b60405180910390fd5b60005b8281101561203f5761202c3382846120279190614d75565b612edc565b808061203790614feb565b91505061200f565b505050565b61204c610b86565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b1906148d2565b60405180910390fd5b80600560006120c7610b86565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612174610b86565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b991906147b3565b60405180910390a35050565b60165481565b6121d3610b86565b73ffffffffffffffffffffffffffffffffffffffff166121f1611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614a92565b60405180910390fd5b60001515601960009054906101000a900460ff1615151461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490614b52565b60405180910390fd5b80601890805190602001906122b39291906139a5565b5050565b6122c86122c2610b86565b83612adc565b612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614b72565b60405180910390fd5b61231384848484612efa565b50505050565b612321610b86565b73ffffffffffffffffffffffffffffffffffffffff1661233f611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90614a92565b60405180910390fd5b6001601960006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b060186040516123e091906147f0565b60405180910390a1565b60606123f5826128c3565b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614ad2565b60405180910390fd5b600061243e612f56565b9050600081511161245e5760405180602001604052806000815250612489565b8061246884612fe8565b60405160200161247992919061467d565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601180546124e790614f88565b80601f016020809104026020016040519081016040528092919081815260200182805461251390614f88565b80156125605780601f1061253557610100808354040283529160200191612560565b820191906000526020600020905b81548152906001019060200180831161254357829003601f168201915b505050505081565b6060612572610ecd565b82106125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614a12565b60405180910390fd5b601880546125c090614f88565b80601f01602080910402602001604051908101604052809291908181526020018280546125ec90614f88565b80156126395780601f1061260e57610100808354040283529160200191612639565b820191906000526020600020905b81548152906001019060200180831161261c57829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126eb610b86565b73ffffffffffffffffffffffffffffffffffffffff16612709611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690614a92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614852565b60405180910390fd5b6127d881612e16565b50565b60155481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128bc57506128bb82613149565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a283611737565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2290614932565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612a51906146a1565b60006040518083038185875af1925050503d8060008114612a8e576040519150601f19603f3d011682016040523d82523d6000602084013e612a93565b606091505b5050905080612ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ace90614912565b60405180910390fd5b505050565b6000612ae7826128c3565b612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614952565b60405180910390fd5b6000612b3183611737565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ba057508373ffffffffffffffffffffffffffffffffffffffff16612b8884610c9a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bb15750612bb0818561264f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bda82611737565b73ffffffffffffffffffffffffffffffffffffffff1614612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790614ab2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c97906148b2565b60405180910390fd5b612cab8383836131b3565b612cb660008261292f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d069190614e56565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5d9190614d75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ef68282604051806020016040528060008152506132c7565b5050565b612f05848484612bba565b612f1184848484613322565b612f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4790614832565b60405180910390fd5b50505050565b606060118054612f6590614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9190614f88565b8015612fde5780601f10612fb357610100808354040283529160200191612fde565b820191906000526020600020905b815481529060010190602001808311612fc157829003601f168201915b5050505050905090565b60606000821415613030576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613144565b600082905060005b6000821461306257808061304b90614feb565b915050600a8261305b9190614dcb565b9150613038565b60008167ffffffffffffffff81111561307e5761307d615150565b5b6040519080825280601f01601f1916602001820160405280156130b05781602001600182028036833780820191505090505b5090505b6000851461313d576001826130c99190614e56565b9150600a856130d89190615034565b60306130e49190614d75565b60f81b8183815181106130fa576130f9615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131369190614dcb565b94506130b4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131be8383836134b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613201576131fc816134be565b613240565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461323f5761323e8382613507565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132835761327e81613674565b6132c2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132c1576132c08282613745565b5b5b505050565b6132d183836137c4565b6132de6000848484613322565b61331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331490614832565b60405180910390fd5b505050565b60006133438473ffffffffffffffffffffffffffffffffffffffff16613992565b156134ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261336c610b86565b8786866040518563ffffffff1660e01b815260040161338e94939291906146fa565b602060405180830381600087803b1580156133a857600080fd5b505af19250505080156133d957506040513d601f19601f820116820180604052508101906133d69190613f34565b60015b61345c573d8060008114613409576040519150601f19603f3d011682016040523d82523d6000602084013e61340e565b606091505b50600081511415613454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344b90614832565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134b1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613514846117e9565b61351e9190614e56565b9050600060076000848152602001908152602001600020549050818114613603576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136889190614e56565b90506000600960008481526020019081526020016000205490506000600883815481106136b8576136b7615121565b5b9060005260206000200154905080600883815481106136da576136d9615121565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613729576137286150f2565b5b6001900381819060005260206000200160009055905550505050565b6000613750836117e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382b90614a32565b60405180910390fd5b61383d816128c3565b1561387d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387490614872565b60405180910390fd5b613889600083836131b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138d99190614d75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546139b190614f88565b90600052602060002090601f0160209004810192826139d35760008555613a1a565b82601f106139ec57805160ff1916838001178555613a1a565b82800160010185558215613a1a579182015b82811115613a195782518255916020019190600101906139fe565b5b509050613a279190613ab5565b5090565b828054828255906000526020600020908101928215613aa4579160200282015b82811115613aa35782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613a4b565b5b509050613ab19190613ab5565b5090565b5b80821115613ace576000816000905550600101613ab6565b5090565b6000613ae5613ae084614c12565b614bed565b90508083825260208201905082856020860282011115613b0857613b07615184565b5b60005b85811015613b385781613b1e8882613bc6565b845260208401935060208301925050600181019050613b0b565b5050509392505050565b6000613b55613b5084614c3e565b614bed565b905082815260208101848484011115613b7157613b70615189565b5b613b7c848285614f46565b509392505050565b6000613b97613b9284614c6f565b614bed565b905082815260208101848484011115613bb357613bb2615189565b5b613bbe848285614f46565b509392505050565b600081359050613bd581615926565b92915050565b600081359050613bea8161593d565b92915050565b600082601f830112613c0557613c0461517f565b5b8135613c15848260208601613ad2565b91505092915050565b600081359050613c2d81615954565b92915050565b600081359050613c428161596b565b92915050565b600081519050613c578161596b565b92915050565b600082601f830112613c7257613c7161517f565b5b8135613c82848260208601613b42565b91505092915050565b600082601f830112613ca057613c9f61517f565b5b8135613cb0848260208601613b84565b91505092915050565b600081359050613cc881615982565b92915050565b600060208284031215613ce457613ce3615193565b5b6000613cf284828501613bc6565b91505092915050565b600060208284031215613d1157613d10615193565b5b6000613d1f84828501613bdb565b91505092915050565b60008060408385031215613d3f57613d3e615193565b5b6000613d4d85828601613bc6565b9250506020613d5e85828601613bc6565b9150509250929050565b600080600060608486031215613d8157613d80615193565b5b6000613d8f86828701613bc6565b9350506020613da086828701613bc6565b9250506040613db186828701613cb9565b9150509250925092565b60008060008060808587031215613dd557613dd4615193565b5b6000613de387828801613bc6565b9450506020613df487828801613bc6565b9350506040613e0587828801613cb9565b925050606085013567ffffffffffffffff811115613e2657613e2561518e565b5b613e3287828801613c5d565b91505092959194509250565b60008060408385031215613e5557613e54615193565b5b6000613e6385828601613bc6565b9250506020613e7485828601613c1e565b9150509250929050565b60008060408385031215613e9557613e94615193565b5b6000613ea385828601613bc6565b9250506020613eb485828601613cb9565b9150509250929050565b600060208284031215613ed457613ed3615193565b5b600082013567ffffffffffffffff811115613ef257613ef161518e565b5b613efe84828501613bf0565b91505092915050565b600060208284031215613f1d57613f1c615193565b5b6000613f2b84828501613c33565b91505092915050565b600060208284031215613f4a57613f49615193565b5b6000613f5884828501613c48565b91505092915050565b600060208284031215613f7757613f76615193565b5b600082013567ffffffffffffffff811115613f9557613f9461518e565b5b613fa184828501613c8b565b91505092915050565b600060208284031215613fc057613fbf615193565b5b6000613fce84828501613cb9565b91505092915050565b6000613fe38383614016565b60208301905092915050565b6000613ffb838361465f565b60208301905092915050565b61401081614f10565b82525050565b61401f81614e8a565b82525050565b61402e81614e8a565b82525050565b600061403f82614cd5565b6140498185614d1b565b935061405483614ca0565b8060005b8381101561408557815161406c8882613fd7565b975061407783614d01565b925050600181019050614058565b5085935050505092915050565b600061409d82614ce0565b6140a78185614d2c565b93506140b283614cb0565b8060005b838110156140e35781516140ca8882613fef565b97506140d583614d0e565b9250506001810190506140b6565b5085935050505092915050565b6140f981614eae565b82525050565b600061410a82614ceb565b6141148185614d3d565b9350614124818560208601614f55565b61412d81615198565b840191505092915050565b600061414382614cf6565b61414d8185614d59565b935061415d818560208601614f55565b61416681615198565b840191505092915050565b600061417c82614cf6565b6141868185614d6a565b9350614196818560208601614f55565b80840191505092915050565b600081546141af81614f88565b6141b98186614d59565b945060018216600081146141d457600181146141e657614219565b60ff1983168652602086019350614219565b6141ef85614cc0565b60005b83811015614211578154818901526001820191506020810190506141f2565b808801955050505b50505092915050565b600061422f602b83614d59565b915061423a826151a9565b604082019050919050565b6000614252603283614d59565b915061425d826151f8565b604082019050919050565b6000614275602683614d59565b915061428082615247565b604082019050919050565b6000614298601c83614d59565b91506142a382615296565b602082019050919050565b60006142bb602683614d59565b91506142c6826152bf565b604082019050919050565b60006142de602483614d59565b91506142e98261530e565b604082019050919050565b6000614301601983614d59565b915061430c8261535d565b602082019050919050565b6000614324602083614d59565b915061432f82615386565b602082019050919050565b6000614347603a83614d59565b9150614352826153af565b604082019050919050565b600061436a601d83614d59565b9150614375826153fe565b602082019050919050565b600061438d602c83614d59565b915061439882615427565b604082019050919050565b60006143b0602b83614d59565b91506143bb82615476565b604082019050919050565b60006143d3603183614d59565b91506143de826154c5565b604082019050919050565b60006143f6603883614d59565b915061440182615514565b604082019050919050565b6000614419602a83614d59565b915061442482615563565b604082019050919050565b600061443c602983614d59565b9150614447826155b2565b604082019050919050565b600061445f600a83614d59565b915061446a82615601565b602082019050919050565b6000614482602083614d59565b915061448d8261562a565b602082019050919050565b60006144a5602c83614d59565b91506144b082615653565b604082019050919050565b60006144c8601b83614d59565b91506144d3826156a2565b602082019050919050565b60006144eb602083614d59565b91506144f6826156cb565b602082019050919050565b600061450e602983614d59565b9150614519826156f4565b604082019050919050565b6000614531602f83614d59565b915061453c82615743565b604082019050919050565b6000614554601a83614d59565b915061455f82615792565b602082019050919050565b6000614577602183614d59565b9150614582826157bb565b604082019050919050565b600061459a601983614d59565b91506145a58261580a565b602082019050919050565b60006145bd601683614d59565b91506145c882615833565b602082019050919050565b60006145e0600083614d4e565b91506145eb8261585c565b600082019050919050565b6000614603603183614d59565b915061460e8261585f565b604082019050919050565b6000614626602c83614d59565b9150614631826158ae565b604082019050919050565b6000614649602083614d59565b9150614654826158fd565b602082019050919050565b61466881614f06565b82525050565b61467781614f06565b82525050565b60006146898285614171565b91506146958284614171565b91508190509392505050565b60006146ac826145d3565b9150819050919050565b60006020820190506146cb6000830184614025565b92915050565b60006040820190506146e66000830185614007565b6146f3602083018461466e565b9392505050565b600060808201905061470f6000830187614025565b61471c6020830186614025565b614729604083018561466e565b818103606083015261473b81846140ff565b905095945050505050565b600060408201905061475b6000830185614025565b614768602083018461466e565b9392505050565b600060208201905081810360008301526147898184614034565b905092915050565b600060208201905081810360008301526147ab8184614092565b905092915050565b60006020820190506147c860008301846140f0565b92915050565b600060208201905081810360008301526147e88184614138565b905092915050565b6000602082019050818103600083015261480a81846141a2565b905092915050565b6000602082019050818103600083015261482b81614222565b9050919050565b6000602082019050818103600083015261484b81614245565b9050919050565b6000602082019050818103600083015261486b81614268565b9050919050565b6000602082019050818103600083015261488b8161428b565b9050919050565b600060208201905081810360008301526148ab816142ae565b9050919050565b600060208201905081810360008301526148cb816142d1565b9050919050565b600060208201905081810360008301526148eb816142f4565b9050919050565b6000602082019050818103600083015261490b81614317565b9050919050565b6000602082019050818103600083015261492b8161433a565b9050919050565b6000602082019050818103600083015261494b8161435d565b9050919050565b6000602082019050818103600083015261496b81614380565b9050919050565b6000602082019050818103600083015261498b816143a3565b9050919050565b600060208201905081810360008301526149ab816143c6565b9050919050565b600060208201905081810360008301526149cb816143e9565b9050919050565b600060208201905081810360008301526149eb8161440c565b9050919050565b60006020820190508181036000830152614a0b8161442f565b9050919050565b60006020820190508181036000830152614a2b81614452565b9050919050565b60006020820190508181036000830152614a4b81614475565b9050919050565b60006020820190508181036000830152614a6b81614498565b9050919050565b60006020820190508181036000830152614a8b816144bb565b9050919050565b60006020820190508181036000830152614aab816144de565b9050919050565b60006020820190508181036000830152614acb81614501565b9050919050565b60006020820190508181036000830152614aeb81614524565b9050919050565b60006020820190508181036000830152614b0b81614547565b9050919050565b60006020820190508181036000830152614b2b8161456a565b9050919050565b60006020820190508181036000830152614b4b8161458d565b9050919050565b60006020820190508181036000830152614b6b816145b0565b9050919050565b60006020820190508181036000830152614b8b816145f6565b9050919050565b60006020820190508181036000830152614bab81614619565b9050919050565b60006020820190508181036000830152614bcb8161463c565b9050919050565b6000602082019050614be7600083018461466e565b92915050565b6000614bf7614c08565b9050614c038282614fba565b919050565b6000604051905090565b600067ffffffffffffffff821115614c2d57614c2c615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5957614c58615150565b5b614c6282615198565b9050602081019050919050565b600067ffffffffffffffff821115614c8a57614c89615150565b5b614c9382615198565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8082614f06565b9150614d8b83614f06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dc057614dbf615065565b5b828201905092915050565b6000614dd682614f06565b9150614de183614f06565b925082614df157614df0615094565b5b828204905092915050565b6000614e0782614f06565b9150614e1283614f06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e4b57614e4a615065565b5b828202905092915050565b6000614e6182614f06565b9150614e6c83614f06565b925082821015614e7f57614e7e615065565b5b828203905092915050565b6000614e9582614ee6565b9050919050565b6000614ea782614ee6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614f1b82614f22565b9050919050565b6000614f2d82614f34565b9050919050565b6000614f3f82614ee6565b9050919050565b82818337600083830152505050565b60005b83811015614f73578082015181840152602081019050614f58565b83811115614f82576000848401525b50505050565b60006002820490506001821680614fa057607f821691505b60208210811415614fb457614fb36150c3565b5b50919050565b614fc382615198565b810181811067ffffffffffffffff82111715614fe257614fe1615150565b5b80604052505050565b6000614ff682614f06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561502957615028615065565b5b600182019050919050565b600061503f82614f06565b915061504a83614f06565b92508261505a57615059615094565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f47656e6572616c2073616c6520686173206e6f74207374617274656420796574600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178696d756d206f662032302041706560008201527f7320706572207472616e73616374696f6e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c6520686173206e6f742073746172746564207965740000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d2041706520737570706c79000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f457863656564732063757272656e742041706520737570706c79206c696d6974600082015250565b61592f81614e8a565b811461593a57600080fd5b50565b61594681614e9c565b811461595157600080fd5b50565b61595d81614eae565b811461596857600080fd5b50565b61597481614eba565b811461597f57600080fd5b50565b61598b81614f06565b811461599657600080fd5b5056fea264697066735822122092e13ba8284cd5c3fe64aebd5c1384f3e8680306e7ae06e11a83d0892e9ed84664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102975760003560e01c80638af8535f1161015a578063a91b9b2a116100c1578063cfc86f7b1161007a578063cfc86f7b14610a62578063d9b137b214610a8d578063e33b7de314610aca578063e985e9c514610af5578063f2fde38b14610b32578063fa1acb5c14610b5b576102de565b8063a91b9b2a14610954578063b09904b51461097f578063b88d4fde146109a8578063bf4702fc146109d1578063c87b56dd146109e8578063ce7c2ac214610a25576102de565b806395d89b411161011357806395d89b41146108515780639852595c1461087c57806398d5fdca146108b95780639c3e72bd146108e4578063a0712d681461090f578063a22cb4651461092b576102de565b80638af8535f146107415780638b83209b1461076c5780638ba4cc3c146107a95780638d6a1357146107d25780638da5cb5b146107fd57806391b7f5ed14610828576102de565b8063361fab25116101fe5780634fce1de3116101b75780634fce1de31461063157806351573f791461065c57806355f804b3146106875780636352211e146106b057806370a08231146106ed578063715018a61461072a576102de565b8063361fab25146105115780633a98ef391461053a5780633e0a322d1461056557806342842e0e1461058e578063438b6300146105b75780634f6ccce7146105f4576102de565b80631916558711610250578063191655871461040557806323b872dd1461042e578063296cab55146104575780632f745c591461048057806332cb6b0c146104bd57806334131cd3146104e8576102de565b806301ffc9a7146102e357806306fdde0314610320578063081812fc1461034b578063095ea7b31461038857806310969523146103b157806318160ddd146103da576102de565b366102de577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102c5610b86565b346040516102d4929190614746565b60405180910390a1005b600080fd5b3480156102ef57600080fd5b5061030a60048036038101906103059190613f07565b610b8e565b60405161031791906147b3565b60405180910390f35b34801561032c57600080fd5b50610335610c08565b60405161034291906147ce565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613faa565b610c9a565b60405161037f91906146b6565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190613e7e565b610d1f565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613f61565b610e37565b005b3480156103e657600080fd5b506103ef610ecd565b6040516103fc9190614bd2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613cfb565b610eda565b005b34801561043a57600080fd5b5061045560048036038101906104509190613d68565b611142565b005b34801561046357600080fd5b5061047e60048036038101906104799190613faa565b6111a2565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613e7e565b611228565b6040516104b49190614bd2565b60405180910390f35b3480156104c957600080fd5b506104d26112cd565b6040516104df9190614bd2565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613ebe565b6112d3565b005b34801561051d57600080fd5b5061053860048036038101906105339190613faa565b6113fb565b005b34801561054657600080fd5b5061054f6114c6565b60405161055c9190614bd2565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613faa565b6114d0565b005b34801561059a57600080fd5b506105b560048036038101906105b09190613d68565b611556565b005b3480156105c357600080fd5b506105de60048036038101906105d99190613cce565b611576565b6040516105eb9190614791565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613faa565b611624565b6040516106289190614bd2565b60405180910390f35b34801561063d57600080fd5b50610646611695565b6040516106539190614bd2565b60405180910390f35b34801561066857600080fd5b5061067161169b565b60405161067e9190614bd2565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190613f61565b6116a1565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190613faa565b611737565b6040516106e491906146b6565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190613cce565b6117e9565b6040516107219190614bd2565b60405180910390f35b34801561073657600080fd5b5061073f6118a1565b005b34801561074d57600080fd5b50610756611929565b60405161076391906147ce565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613faa565b6119b7565b6040516107a091906146b6565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613e7e565b6119ff565b005b3480156107de57600080fd5b506107e7611b10565b6040516107f4919061476f565b60405180910390f35b34801561080957600080fd5b50610812611c1a565b60405161081f91906146b6565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613faa565b611c44565b005b34801561085d57600080fd5b50610866611cca565b60405161087391906147ce565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190613cce565b611d5c565b6040516108b09190614bd2565b60405180910390f35b3480156108c557600080fd5b506108ce611da5565b6040516108db9190614bd2565b60405180910390f35b3480156108f057600080fd5b506108f9611daf565b60405161090691906147ce565b60405180910390f35b61092960048036038101906109249190613faa565b611e3d565b005b34801561093757600080fd5b50610952600480360381019061094d9190613e3e565b612044565b005b34801561096057600080fd5b506109696121c5565b6040516109769190614bd2565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190613f61565b6121cb565b005b3480156109b457600080fd5b506109cf60048036038101906109ca9190613dbb565b6122b7565b005b3480156109dd57600080fd5b506109e6612319565b005b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613faa565b6123ea565b604051610a1c91906147ce565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190613cce565b612491565b604051610a599190614bd2565b60405180910390f35b348015610a6e57600080fd5b50610a776124da565b604051610a8491906147ce565b60405180910390f35b348015610a9957600080fd5b50610ab46004803603810190610aaf9190613faa565b612568565b604051610ac191906147ce565b60405180910390f35b348015610ad657600080fd5b50610adf612645565b604051610aec9190614bd2565b60405180910390f35b348015610b0157600080fd5b50610b1c6004803603810190610b179190613d28565b61264f565b604051610b2991906147b3565b60405180910390f35b348015610b3e57600080fd5b50610b596004803603810190610b549190613cce565b6126e3565b005b348015610b6757600080fd5b50610b706127db565b604051610b7d9190614bd2565b60405180910390f35b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c015750610c00826127e1565b5b9050919050565b606060008054610c1790614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390614f88565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b5050505050905090565b6000610ca5826128c3565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90614a52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2a82611737565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290614b12565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dba610b86565b73ffffffffffffffffffffffffffffffffffffffff161480610de95750610de881610de3610b86565b61264f565b5b610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906149b2565b60405180910390fd5b610e32838361292f565b505050565b610e3f610b86565b73ffffffffffffffffffffffffffffffffffffffff16610e5d611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90614a92565b60405180910390fd5b8060129080519060200190610ec99291906139a5565b5050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614892565b60405180910390fd5b6000600c5447610f6c9190614d75565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610ffe9190614dfc565b6110089190614dcb565b6110129190614e56565b90506000811415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614972565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110a39190614d75565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546110f49190614d75565b600c8190555061110483826129e8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111359291906146d1565b60405180910390a1505050565b61115361114d610b86565b82612adc565b611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614b72565b60405180910390fd5b61119d838383612bba565b505050565b6111aa610b86565b73ffffffffffffffffffffffffffffffffffffffff166111c8611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614a92565b60405180910390fd5b8060168190555050565b6000611233836117e9565b8210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614812565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60145481565b6112db610b86565b73ffffffffffffffffffffffffffffffffffffffff166112f9611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614a92565b60405180910390fd5b60005b81518110156113e0576001601c600084848151811061137457611373615121565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113d890614feb565b915050611352565b5080601b90805190602001906113f7929190613a2b565b5050565b611403610b86565b73ffffffffffffffffffffffffffffffffffffffff16611421611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614a92565b60405180910390fd5b6014548111156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b390614af2565b60405180910390fd5b8060178190555050565b6000600b54905090565b6114d8610b86565b73ffffffffffffffffffffffffffffffffffffffff166114f6611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614a92565b60405180910390fd5b8060158190555050565b611571838383604051806020016040528060008152506122b7565b505050565b60606000611583836117e9565b905060008167ffffffffffffffff8111156115a1576115a0615150565b5b6040519080825280602002602001820160405280156115cf5781602001602082028036833780820191505090505b50905060005b82811015611619576115e78582611228565b8282815181106115fa576115f9615121565b5b602002602001018181525050808061161190614feb565b9150506115d5565b508092505050919050565b600061162e610ecd565b821061166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690614b92565b60405180910390fd5b6008828154811061168357611682615121565b5b90600052602060002001549050919050565b60135481565b60175481565b6116a9610b86565b73ffffffffffffffffffffffffffffffffffffffff166116c7611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614a92565b60405180910390fd5b80601190805190602001906117339291906139a5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906149f2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611851906149d2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118a9610b86565b73ffffffffffffffffffffffffffffffffffffffff166118c7611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490614a92565b60405180910390fd5b6119276000612e16565b565b6012805461193690614f88565b80601f016020809104026020016040519081016040528092919081815260200182805461196290614f88565b80156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b505050505081565b6000600f82815481106119cd576119cc615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a07610b86565b73ffffffffffffffffffffffffffffffffffffffff16611a25611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290614a92565b60405180910390fd5b6000611a85610ecd565b90506014548282611a969190614d75565b1115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614af2565b60405180910390fd5b60005b82811015611b0a57611af7848284611af29190614d75565b612edc565b8080611b0290614feb565b915050611ada565b50505050565b6060611b1a610b86565b73ffffffffffffffffffffffffffffffffffffffff16611b38611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590614a92565b60405180910390fd5b601b805480602002602001604051908101604052809291908181526020018280548015611c1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611bc6575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c4c610b86565b73ffffffffffffffffffffffffffffffffffffffff16611c6a611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614a92565b60405180910390fd5b8060108190555050565b606060018054611cd990614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0590614f88565b8015611d525780601f10611d2757610100808354040283529160200191611d52565b820191906000526020600020905b815481529060010190602001808311611d3557829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601054905090565b60188054611dbc90614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890614f88565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b505050505081565b6000611e47610ecd565b9050601654421015611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590614a72565b60405180910390fd5b60155442101580611ee85750601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906148f2565b60405180910390fd5b601354821115611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390614992565b60405180910390fd5b6017548282611f7b9190614d75565b1115611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390614bb2565b60405180910390fd5b81601054611fca9190614dfc565b34101561200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200390614b32565b60405180910390fd5b60005b8281101561203f5761202c3382846120279190614d75565b612edc565b808061203790614feb565b91505061200f565b505050565b61204c610b86565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b1906148d2565b60405180910390fd5b80600560006120c7610b86565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612174610b86565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b991906147b3565b60405180910390a35050565b60165481565b6121d3610b86565b73ffffffffffffffffffffffffffffffffffffffff166121f1611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614a92565b60405180910390fd5b60001515601960009054906101000a900460ff1615151461229d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229490614b52565b60405180910390fd5b80601890805190602001906122b39291906139a5565b5050565b6122c86122c2610b86565b83612adc565b612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614b72565b60405180910390fd5b61231384848484612efa565b50505050565b612321610b86565b73ffffffffffffffffffffffffffffffffffffffff1661233f611c1a565b73ffffffffffffffffffffffffffffffffffffffff1614612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90614a92565b60405180910390fd5b6001601960006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b060186040516123e091906147f0565b60405180910390a1565b60606123f5826128c3565b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614ad2565b60405180910390fd5b600061243e612f56565b9050600081511161245e5760405180602001604052806000815250612489565b8061246884612fe8565b60405160200161247992919061467d565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601180546124e790614f88565b80601f016020809104026020016040519081016040528092919081815260200182805461251390614f88565b80156125605780601f1061253557610100808354040283529160200191612560565b820191906000526020600020905b81548152906001019060200180831161254357829003601f168201915b505050505081565b6060612572610ecd565b82106125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614a12565b60405180910390fd5b601880546125c090614f88565b80601f01602080910402602001604051908101604052809291908181526020018280546125ec90614f88565b80156126395780601f1061260e57610100808354040283529160200191612639565b820191906000526020600020905b81548152906001019060200180831161261c57829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126eb610b86565b73ffffffffffffffffffffffffffffffffffffffff16612709611c1a565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690614a92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614852565b60405180910390fd5b6127d881612e16565b50565b60155481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128bc57506128bb82613149565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a283611737565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2290614932565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612a51906146a1565b60006040518083038185875af1925050503d8060008114612a8e576040519150601f19603f3d011682016040523d82523d6000602084013e612a93565b606091505b5050905080612ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ace90614912565b60405180910390fd5b505050565b6000612ae7826128c3565b612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614952565b60405180910390fd5b6000612b3183611737565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ba057508373ffffffffffffffffffffffffffffffffffffffff16612b8884610c9a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bb15750612bb0818561264f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bda82611737565b73ffffffffffffffffffffffffffffffffffffffff1614612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790614ab2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c97906148b2565b60405180910390fd5b612cab8383836131b3565b612cb660008261292f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d069190614e56565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5d9190614d75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ef68282604051806020016040528060008152506132c7565b5050565b612f05848484612bba565b612f1184848484613322565b612f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4790614832565b60405180910390fd5b50505050565b606060118054612f6590614f88565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9190614f88565b8015612fde5780601f10612fb357610100808354040283529160200191612fde565b820191906000526020600020905b815481529060010190602001808311612fc157829003601f168201915b5050505050905090565b60606000821415613030576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613144565b600082905060005b6000821461306257808061304b90614feb565b915050600a8261305b9190614dcb565b9150613038565b60008167ffffffffffffffff81111561307e5761307d615150565b5b6040519080825280601f01601f1916602001820160405280156130b05781602001600182028036833780820191505090505b5090505b6000851461313d576001826130c99190614e56565b9150600a856130d89190615034565b60306130e49190614d75565b60f81b8183815181106130fa576130f9615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131369190614dcb565b94506130b4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131be8383836134b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613201576131fc816134be565b613240565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461323f5761323e8382613507565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132835761327e81613674565b6132c2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132c1576132c08282613745565b5b5b505050565b6132d183836137c4565b6132de6000848484613322565b61331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331490614832565b60405180910390fd5b505050565b60006133438473ffffffffffffffffffffffffffffffffffffffff16613992565b156134ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261336c610b86565b8786866040518563ffffffff1660e01b815260040161338e94939291906146fa565b602060405180830381600087803b1580156133a857600080fd5b505af19250505080156133d957506040513d601f19601f820116820180604052508101906133d69190613f34565b60015b61345c573d8060008114613409576040519150601f19603f3d011682016040523d82523d6000602084013e61340e565b606091505b50600081511415613454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344b90614832565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134b1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613514846117e9565b61351e9190614e56565b9050600060076000848152602001908152602001600020549050818114613603576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136889190614e56565b90506000600960008481526020019081526020016000205490506000600883815481106136b8576136b7615121565b5b9060005260206000200154905080600883815481106136da576136d9615121565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613729576137286150f2565b5b6001900381819060005260206000200160009055905550505050565b6000613750836117e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382b90614a32565b60405180910390fd5b61383d816128c3565b1561387d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387490614872565b60405180910390fd5b613889600083836131b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138d99190614d75565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546139b190614f88565b90600052602060002090601f0160209004810192826139d35760008555613a1a565b82601f106139ec57805160ff1916838001178555613a1a565b82800160010185558215613a1a579182015b82811115613a195782518255916020019190600101906139fe565b5b509050613a279190613ab5565b5090565b828054828255906000526020600020908101928215613aa4579160200282015b82811115613aa35782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613a4b565b5b509050613ab19190613ab5565b5090565b5b80821115613ace576000816000905550600101613ab6565b5090565b6000613ae5613ae084614c12565b614bed565b90508083825260208201905082856020860282011115613b0857613b07615184565b5b60005b85811015613b385781613b1e8882613bc6565b845260208401935060208301925050600181019050613b0b565b5050509392505050565b6000613b55613b5084614c3e565b614bed565b905082815260208101848484011115613b7157613b70615189565b5b613b7c848285614f46565b509392505050565b6000613b97613b9284614c6f565b614bed565b905082815260208101848484011115613bb357613bb2615189565b5b613bbe848285614f46565b509392505050565b600081359050613bd581615926565b92915050565b600081359050613bea8161593d565b92915050565b600082601f830112613c0557613c0461517f565b5b8135613c15848260208601613ad2565b91505092915050565b600081359050613c2d81615954565b92915050565b600081359050613c428161596b565b92915050565b600081519050613c578161596b565b92915050565b600082601f830112613c7257613c7161517f565b5b8135613c82848260208601613b42565b91505092915050565b600082601f830112613ca057613c9f61517f565b5b8135613cb0848260208601613b84565b91505092915050565b600081359050613cc881615982565b92915050565b600060208284031215613ce457613ce3615193565b5b6000613cf284828501613bc6565b91505092915050565b600060208284031215613d1157613d10615193565b5b6000613d1f84828501613bdb565b91505092915050565b60008060408385031215613d3f57613d3e615193565b5b6000613d4d85828601613bc6565b9250506020613d5e85828601613bc6565b9150509250929050565b600080600060608486031215613d8157613d80615193565b5b6000613d8f86828701613bc6565b9350506020613da086828701613bc6565b9250506040613db186828701613cb9565b9150509250925092565b60008060008060808587031215613dd557613dd4615193565b5b6000613de387828801613bc6565b9450506020613df487828801613bc6565b9350506040613e0587828801613cb9565b925050606085013567ffffffffffffffff811115613e2657613e2561518e565b5b613e3287828801613c5d565b91505092959194509250565b60008060408385031215613e5557613e54615193565b5b6000613e6385828601613bc6565b9250506020613e7485828601613c1e565b9150509250929050565b60008060408385031215613e9557613e94615193565b5b6000613ea385828601613bc6565b9250506020613eb485828601613cb9565b9150509250929050565b600060208284031215613ed457613ed3615193565b5b600082013567ffffffffffffffff811115613ef257613ef161518e565b5b613efe84828501613bf0565b91505092915050565b600060208284031215613f1d57613f1c615193565b5b6000613f2b84828501613c33565b91505092915050565b600060208284031215613f4a57613f49615193565b5b6000613f5884828501613c48565b91505092915050565b600060208284031215613f7757613f76615193565b5b600082013567ffffffffffffffff811115613f9557613f9461518e565b5b613fa184828501613c8b565b91505092915050565b600060208284031215613fc057613fbf615193565b5b6000613fce84828501613cb9565b91505092915050565b6000613fe38383614016565b60208301905092915050565b6000613ffb838361465f565b60208301905092915050565b61401081614f10565b82525050565b61401f81614e8a565b82525050565b61402e81614e8a565b82525050565b600061403f82614cd5565b6140498185614d1b565b935061405483614ca0565b8060005b8381101561408557815161406c8882613fd7565b975061407783614d01565b925050600181019050614058565b5085935050505092915050565b600061409d82614ce0565b6140a78185614d2c565b93506140b283614cb0565b8060005b838110156140e35781516140ca8882613fef565b97506140d583614d0e565b9250506001810190506140b6565b5085935050505092915050565b6140f981614eae565b82525050565b600061410a82614ceb565b6141148185614d3d565b9350614124818560208601614f55565b61412d81615198565b840191505092915050565b600061414382614cf6565b61414d8185614d59565b935061415d818560208601614f55565b61416681615198565b840191505092915050565b600061417c82614cf6565b6141868185614d6a565b9350614196818560208601614f55565b80840191505092915050565b600081546141af81614f88565b6141b98186614d59565b945060018216600081146141d457600181146141e657614219565b60ff1983168652602086019350614219565b6141ef85614cc0565b60005b83811015614211578154818901526001820191506020810190506141f2565b808801955050505b50505092915050565b600061422f602b83614d59565b915061423a826151a9565b604082019050919050565b6000614252603283614d59565b915061425d826151f8565b604082019050919050565b6000614275602683614d59565b915061428082615247565b604082019050919050565b6000614298601c83614d59565b91506142a382615296565b602082019050919050565b60006142bb602683614d59565b91506142c6826152bf565b604082019050919050565b60006142de602483614d59565b91506142e98261530e565b604082019050919050565b6000614301601983614d59565b915061430c8261535d565b602082019050919050565b6000614324602083614d59565b915061432f82615386565b602082019050919050565b6000614347603a83614d59565b9150614352826153af565b604082019050919050565b600061436a601d83614d59565b9150614375826153fe565b602082019050919050565b600061438d602c83614d59565b915061439882615427565b604082019050919050565b60006143b0602b83614d59565b91506143bb82615476565b604082019050919050565b60006143d3603183614d59565b91506143de826154c5565b604082019050919050565b60006143f6603883614d59565b915061440182615514565b604082019050919050565b6000614419602a83614d59565b915061442482615563565b604082019050919050565b600061443c602983614d59565b9150614447826155b2565b604082019050919050565b600061445f600a83614d59565b915061446a82615601565b602082019050919050565b6000614482602083614d59565b915061448d8261562a565b602082019050919050565b60006144a5602c83614d59565b91506144b082615653565b604082019050919050565b60006144c8601b83614d59565b91506144d3826156a2565b602082019050919050565b60006144eb602083614d59565b91506144f6826156cb565b602082019050919050565b600061450e602983614d59565b9150614519826156f4565b604082019050919050565b6000614531602f83614d59565b915061453c82615743565b604082019050919050565b6000614554601a83614d59565b915061455f82615792565b602082019050919050565b6000614577602183614d59565b9150614582826157bb565b604082019050919050565b600061459a601983614d59565b91506145a58261580a565b602082019050919050565b60006145bd601683614d59565b91506145c882615833565b602082019050919050565b60006145e0600083614d4e565b91506145eb8261585c565b600082019050919050565b6000614603603183614d59565b915061460e8261585f565b604082019050919050565b6000614626602c83614d59565b9150614631826158ae565b604082019050919050565b6000614649602083614d59565b9150614654826158fd565b602082019050919050565b61466881614f06565b82525050565b61467781614f06565b82525050565b60006146898285614171565b91506146958284614171565b91508190509392505050565b60006146ac826145d3565b9150819050919050565b60006020820190506146cb6000830184614025565b92915050565b60006040820190506146e66000830185614007565b6146f3602083018461466e565b9392505050565b600060808201905061470f6000830187614025565b61471c6020830186614025565b614729604083018561466e565b818103606083015261473b81846140ff565b905095945050505050565b600060408201905061475b6000830185614025565b614768602083018461466e565b9392505050565b600060208201905081810360008301526147898184614034565b905092915050565b600060208201905081810360008301526147ab8184614092565b905092915050565b60006020820190506147c860008301846140f0565b92915050565b600060208201905081810360008301526147e88184614138565b905092915050565b6000602082019050818103600083015261480a81846141a2565b905092915050565b6000602082019050818103600083015261482b81614222565b9050919050565b6000602082019050818103600083015261484b81614245565b9050919050565b6000602082019050818103600083015261486b81614268565b9050919050565b6000602082019050818103600083015261488b8161428b565b9050919050565b600060208201905081810360008301526148ab816142ae565b9050919050565b600060208201905081810360008301526148cb816142d1565b9050919050565b600060208201905081810360008301526148eb816142f4565b9050919050565b6000602082019050818103600083015261490b81614317565b9050919050565b6000602082019050818103600083015261492b8161433a565b9050919050565b6000602082019050818103600083015261494b8161435d565b9050919050565b6000602082019050818103600083015261496b81614380565b9050919050565b6000602082019050818103600083015261498b816143a3565b9050919050565b600060208201905081810360008301526149ab816143c6565b9050919050565b600060208201905081810360008301526149cb816143e9565b9050919050565b600060208201905081810360008301526149eb8161440c565b9050919050565b60006020820190508181036000830152614a0b8161442f565b9050919050565b60006020820190508181036000830152614a2b81614452565b9050919050565b60006020820190508181036000830152614a4b81614475565b9050919050565b60006020820190508181036000830152614a6b81614498565b9050919050565b60006020820190508181036000830152614a8b816144bb565b9050919050565b60006020820190508181036000830152614aab816144de565b9050919050565b60006020820190508181036000830152614acb81614501565b9050919050565b60006020820190508181036000830152614aeb81614524565b9050919050565b60006020820190508181036000830152614b0b81614547565b9050919050565b60006020820190508181036000830152614b2b8161456a565b9050919050565b60006020820190508181036000830152614b4b8161458d565b9050919050565b60006020820190508181036000830152614b6b816145b0565b9050919050565b60006020820190508181036000830152614b8b816145f6565b9050919050565b60006020820190508181036000830152614bab81614619565b9050919050565b60006020820190508181036000830152614bcb8161463c565b9050919050565b6000602082019050614be7600083018461466e565b92915050565b6000614bf7614c08565b9050614c038282614fba565b919050565b6000604051905090565b600067ffffffffffffffff821115614c2d57614c2c615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5957614c58615150565b5b614c6282615198565b9050602081019050919050565b600067ffffffffffffffff821115614c8a57614c89615150565b5b614c9382615198565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8082614f06565b9150614d8b83614f06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dc057614dbf615065565b5b828201905092915050565b6000614dd682614f06565b9150614de183614f06565b925082614df157614df0615094565b5b828204905092915050565b6000614e0782614f06565b9150614e1283614f06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e4b57614e4a615065565b5b828202905092915050565b6000614e6182614f06565b9150614e6c83614f06565b925082821015614e7f57614e7e615065565b5b828203905092915050565b6000614e9582614ee6565b9050919050565b6000614ea782614ee6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614f1b82614f22565b9050919050565b6000614f2d82614f34565b9050919050565b6000614f3f82614ee6565b9050919050565b82818337600083830152505050565b60005b83811015614f73578082015181840152602081019050614f58565b83811115614f82576000848401525b50505050565b60006002820490506001821680614fa057607f821691505b60208210811415614fb457614fb36150c3565b5b50919050565b614fc382615198565b810181811067ffffffffffffffff82111715614fe257614fe1615150565b5b80604052505050565b6000614ff682614f06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561502957615028615065565b5b600182019050919050565b600061503f82614f06565b915061504a83614f06565b92508261505a57615059615094565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f47656e6572616c2073616c6520686173206e6f74207374617274656420796574600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178696d756d206f662032302041706560008201527f7320706572207472616e73616374696f6e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726573616c6520686173206e6f742073746172746564207965740000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d2041706520737570706c79000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f457863656564732063757272656e742041706520737570706c79206c696d6974600082015250565b61592f81614e8a565b811461593a57600080fd5b50565b61594681614e9c565b811461595157600080fd5b50565b61595d81614eae565b811461596857600080fd5b50565b61597481614eba565b811461597f57600080fd5b50565b61598b81614f06565b811461599657600080fd5b5056fea264697066735822122092e13ba8284cd5c3fe64aebd5c1384f3e8680306e7ae06e11a83d0892e9ed84664736f6c63430008070033

Deployed Bytecode Sourcemap

55472:4721:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52916:40;52932:12;:10;:12::i;:::-;52946:9;52916:40;;;;;;;:::i;:::-;;;;;;;;55472:4721;;;;;34858:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21747:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22829:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58255:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35498:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54122:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24196:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59471:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35166:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55762:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59804:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59600:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53047:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59352:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24606:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59002:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35688:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55707:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55902:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58048:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21441:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21171:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42661:94;;;;;;;;;;;;;:::i;:::-;;55665:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53822:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57468:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60066:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42010:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57827:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21916:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53622:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58166:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55942:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56656:804;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23599:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55848:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58820:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24862:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58656:125;;;;;;;;;;;;;:::i;:::-;;22091:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53418:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55620:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58432:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53232:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23965:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42910:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55803:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16204:98;16257:7;16284:10;16277:17;;16204:98;:::o;34858:224::-;34960:4;34999:35;34984:50;;;:11;:50;;;;:90;;;;35038:36;35062:11;35038:23;:36::i;:::-;34984:90;34977:97;;34858:224;;;:::o;21747:100::-;21801:13;21834:5;21827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:100;:::o;23306:221::-;23382:7;23410:16;23418:7;23410;:16::i;:::-;23402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:15;:24;23511:7;23495:24;;;;;;;;;;;;;;;;;;;;;23488:31;;23306:221;;;:::o;22829:411::-;22910:13;22926:23;22941:7;22926:14;:23::i;:::-;22910:39;;22974:5;22968:11;;:2;:11;;;;22960:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23068:5;23052:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23077:37;23094:5;23101:12;:10;:12::i;:::-;23077:16;:37::i;:::-;23052:62;23030:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23211:21;23220:2;23224:7;23211:8;:21::i;:::-;22899:341;22829:411;;:::o;58255:126::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58358:15:::1;58341:14;:32;;;;;;;;;;;;:::i;:::-;;58255:126:::0;:::o;35498:113::-;35559:7;35586:10;:17;;;;35579:24;;35498:113;:::o;54122:613::-;54217:1;54198:7;:16;54206:7;54198:16;;;;;;;;;;;;;;;;:20;54190:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54274:21;54322:14;;54298:21;:38;;;;:::i;:::-;54274:62;;54347:15;54417:9;:18;54427:7;54417:18;;;;;;;;;;;;;;;;54402:12;;54382:7;:16;54390:7;54382:16;;;;;;;;;;;;;;;;54366:13;:32;;;;:::i;:::-;54365:49;;;;:::i;:::-;:70;;;;:::i;:::-;54347:88;;54467:1;54456:7;:12;;54448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54571:7;54550:9;:18;54560:7;54550:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;54529:9;:18;54539:7;54529:18;;;;;;;;;;;;;;;:49;;;;54623:7;54606:14;;:24;;;;:::i;:::-;54589:14;:41;;;;54643:35;54661:7;54670;54643:17;:35::i;:::-;54694:33;54710:7;54719;54694:33;;;;;;;:::i;:::-;;;;;;;;54179:556;;54122:613;:::o;24196:339::-;24391:41;24410:12;:10;:12::i;:::-;24424:7;24391:18;:41::i;:::-;24383:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24499:28;24509:4;24515:2;24519:7;24499:9;:28::i;:::-;24196:339;;;:::o;59471:121::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59571:13:::1;59551:17;:33;;;;59471:121:::0;:::o;35166:256::-;35263:7;35299:23;35316:5;35299:16;:23::i;:::-;35291:5;:31;35283:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35388:12;:19;35401:5;35388:19;;;;;;;;;;;;;;;:26;35408:5;35388:26;;;;;;;;;;;;35381:33;;35166:256;;;;:::o;55762:32::-;;;;:::o;59804:254::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59897:9:::1;59893:112;59912:12;:19;59908:1;:23;59893:112;;;59989:4;59952:17;:34;59970:12;59983:1;59970:15;;;;;;;;:::i;:::-;;;;;;;;59952:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;59933:3;;;;;:::i;:::-;;;;59893:112;;;;60038:12;60017:18;:33;;;;;;;;;;;;:::i;:::-;;59804:254:::0;:::o;59600:196::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59705:10:::1;;59686:15;:29;;59677:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59773:15;59758:12;:30;;;;59600:196:::0;:::o;53047:91::-;53091:7;53118:12;;53111:19;;53047:91;:::o;59352:107::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59438:13:::1;59425:10;:26;;;;59352:107:::0;:::o;24606:185::-;24744:39;24761:4;24767:2;24771:7;24744:39;;;;;;;;;;;;:16;:39::i;:::-;24606:185;;;:::o;59002:342::-;59061:16;59090:18;59111:17;59121:6;59111:9;:17::i;:::-;59090:38;;59141:25;59183:10;59169:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59141:53;;59209:9;59205:106;59224:10;59220:1;:14;59205:106;;;59269:30;59289:6;59297:1;59269:19;:30::i;:::-;59255:8;59264:1;59255:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;59236:3;;;;;:::i;:::-;;;;59205:106;;;;59328:8;59321:15;;;;59002:342;;;:::o;35688:233::-;35763:7;35799:30;:28;:30::i;:::-;35791:5;:38;35783:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35896:10;35907:5;35896:17;;;;;;;;:::i;:::-;;;;;;;;;;35889:24;;35688:233;;;:::o;55707:46::-;;;;:::o;55902:31::-;;;;:::o;58048:110::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58139:11:::1;58123:13;:27;;;;;;;;;;;;:::i;:::-;;58048:110:::0;:::o;21441:239::-;21513:7;21533:13;21549:7;:16;21557:7;21549:16;;;;;;;;;;;;;;;;;;;;;21533:32;;21601:1;21584:19;;:5;:19;;;;21576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21667:5;21660:12;;;21441:239;;;:::o;21171:208::-;21243:7;21288:1;21271:19;;:5;:19;;;;21263:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21355:9;:16;21365:5;21355:16;;;;;;;;;;;;;;;;21348:23;;21171:208;;;:::o;42661:94::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42726:21:::1;42744:1;42726:9;:21::i;:::-;42661:94::o:0;55665:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53822:100::-;53873:7;53900;53908:5;53900:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53893:21;;53822:100;;;:::o;57468:304::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57546:14:::1;57563:13;:11;:13::i;:::-;57546:30;;57614:10;;57604:6;57595;:15;;;;:::i;:::-;:29;;57587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57680:9;57676:89;57695:6;57691:1;:10;57676:89;;;57722:31;57732:7;57750:1;57741:6;:10;;;;:::i;:::-;57722:9;:31::i;:::-;57703:3;;;;;:::i;:::-;;;;57676:89;;;;57535:237;57468:304:::0;;:::o;60066:124::-;60128:16;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60164:18:::1;60157:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60066:124:::0;:::o;42010:87::-;42056:7;42083:6;;;;;;;;;;;42076:13;;42010:87;:::o;57827:91::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57901:9:::1;57892:6;:18;;;;57827:91:::0;:::o;21916:104::-;21972:13;22005:7;21998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:104;:::o;53622:109::-;53678:7;53705:9;:18;53715:7;53705:18;;;;;;;;;;;;;;;;53698:25;;53622:109;;;:::o;58166:81::-;58207:7;58233:6;;58226:13;;58166:81;:::o;55942:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56656:804::-;56712:14;56729:13;:11;:13::i;:::-;56712:30;;56781:17;;56762:15;:36;;56753:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;56896:10;;56877:15;:29;;:62;;;;56910:17;:29;56928:10;56910:29;;;;;;;;;;;;;;;;;;;;;;;;;56877:62;56868:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;57007:26;;56997:6;:36;;56988:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;57153:12;;57143:6;57134;:15;;;;:::i;:::-;:31;;57125:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;57276:6;57267;;:15;;;;:::i;:::-;57254:9;:28;;57245:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;57364:9;57360:93;57379:6;57375:1;:10;57360:93;;;57406:35;57417:10;57438:1;57429:6;:10;;;;:::i;:::-;57406:9;:35::i;:::-;57387:3;;;;;:::i;:::-;;;;57360:93;;;;56701:759;56656:804;:::o;23599:295::-;23714:12;:10;:12::i;:::-;23702:24;;:8;:24;;;;23694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:8;23769:18;:32;23788:12;:10;:12::i;:::-;23769:32;;;;;;;;;;;;;;;:42;23802:8;23769:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23867:8;23838:48;;23853:12;:10;:12::i;:::-;23838:48;;;23877:8;23838:48;;;;;;:::i;:::-;;;;;;;;23599:295;;:::o;55848:45::-;;;;:::o;58820:174::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58920:5:::1;58903:22;;:13;;;;;;;;;;;:22;;;58895:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58978:8;58963:12;:23;;;;;;;;;;;;:::i;:::-;;58820:174:::0;:::o;24862:328::-;25037:41;25056:12;:10;:12::i;:::-;25070:7;25037:18;:41::i;:::-;25029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:39;25157:4;25163:2;25167:7;25176:5;25143:13;:39::i;:::-;24862:328;;;;:::o;58656:125::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58724:4:::1;58707:13;;:21;;;;;;;;;;;;;;;;;;58744:29;58760:12;58744:29;;;;;;:::i;:::-;;;;;;;;58656:125::o:0;22091:334::-;22164:13;22198:16;22206:7;22198;:16::i;:::-;22190:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22303:10;:8;:10::i;:::-;22279:34;;22355:1;22337:7;22331:21;:25;:86;;;;;;;;;;;;;;;;;22383:7;22392:18;:7;:16;:18::i;:::-;22366:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22331:86;22324:93;;;22091:334;;;:::o;53418:105::-;53472:7;53499;:16;53507:7;53499:16;;;;;;;;;;;;;;;;53492:23;;53418:105;;;:::o;55620:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58432:158::-;58484:13;58524;:11;:13::i;:::-;58518:3;:19;58510:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;58570:12;58563:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58432:158;;;:::o;53232:95::-;53278:7;53305:14;;53298:21;;53232:95;:::o;23965:164::-;24062:4;24086:18;:25;24105:5;24086:25;;;;;;;;;;;;;;;:35;24112:8;24086:35;;;;;;;;;;;;;;;;;;;;;;;;;24079:42;;23965:164;;;;:::o;42910:192::-;42241:12;:10;:12::i;:::-;42230:23;;:7;:5;:7::i;:::-;:23;;;42222:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43019:1:::1;42999:22;;:8;:22;;;;42991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43075:19;43085:8;43075:9;:19::i;:::-;42910:192:::0;:::o;55803:38::-;;;;:::o;20802:305::-;20904:4;20956:25;20941:40;;;:11;:40;;;;:105;;;;21013:33;20998:48;;;:11;:48;;;;20941:105;:158;;;;21063:36;21087:11;21063:23;:36::i;:::-;20941:158;20921:178;;20802:305;;;:::o;26700:127::-;26765:4;26817:1;26789:30;;:7;:16;26797:7;26789:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26782:37;;26700:127;;;:::o;30682:174::-;30784:2;30757:15;:24;30773:7;30757:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30840:7;30836:2;30802:46;;30811:23;30826:7;30811:14;:23::i;:::-;30802:46;;;;;;;;;;;;30682:174;;:::o;9562:317::-;9677:6;9652:21;:31;;9644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9731:12;9749:9;:14;;9771:6;9749:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9730:52;;;9801:7;9793:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9633:246;9562:317;;:::o;26994:348::-;27087:4;27112:16;27120:7;27112;:16::i;:::-;27104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:13;27204:23;27219:7;27204:14;:23::i;:::-;27188:39;;27257:5;27246:16;;:7;:16;;;:51;;;;27290:7;27266:31;;:20;27278:7;27266:11;:20::i;:::-;:31;;;27246:51;:87;;;;27301:32;27318:5;27325:7;27301:16;:32::i;:::-;27246:87;27238:96;;;26994:348;;;;:::o;29986:578::-;30145:4;30118:31;;:23;30133:7;30118:14;:23::i;:::-;:31;;;30110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:1;30214:16;;:2;:16;;;;30206:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:39;30305:4;30311:2;30315:7;30284:20;:39::i;:::-;30388:29;30405:1;30409:7;30388:8;:29::i;:::-;30449:1;30430:9;:15;30440:4;30430:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30478:1;30461:9;:13;30471:2;30461:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30509:2;30490:7;:16;30498:7;30490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30548:7;30544:2;30529:27;;30538:4;30529:27;;;;;;;;;;;;29986:578;;;:::o;43110:173::-;43166:16;43185:6;;;;;;;;;;;43166:25;;43211:8;43202:6;;:17;;;;;;;;;;;;;;;;;;43266:8;43235:40;;43256:8;43235:40;;;;;;;;;;;;43155:128;43110:173;:::o;27684:110::-;27760:26;27770:2;27774:7;27760:26;;;;;;;;;;;;:9;:26::i;:::-;27684:110;;:::o;26072:315::-;26229:28;26239:4;26245:2;26249:7;26229:9;:28::i;:::-;26276:48;26299:4;26305:2;26309:7;26318:5;26276:22;:48::i;:::-;26268:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:315;;;;:::o;57926:114::-;57986:13;58019;58012:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57926:114;:::o;16737:723::-;16793:13;17023:1;17014:5;:10;17010:53;;;17041:10;;;;;;;;;;;;;;;;;;;;;17010:53;17073:12;17088:5;17073:20;;17104:14;17129:78;17144:1;17136:4;:9;17129:78;;17162:8;;;;;:::i;:::-;;;;17193:2;17185:10;;;;;:::i;:::-;;;17129:78;;;17217:19;17249:6;17239:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:39;;17267:154;17283:1;17274:5;:10;17267:154;;17311:1;17301:11;;;;;:::i;:::-;;;17378:2;17370:5;:10;;;;:::i;:::-;17357:2;:24;;;;:::i;:::-;17344:39;;17327:6;17334;17327:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17407:2;17398:11;;;;;:::i;:::-;;;17267:154;;;17445:6;17431:21;;;;;16737:723;;;;:::o;19300:157::-;19385:4;19424:25;19409:40;;;:11;:40;;;;19402:47;;19300:157;;;:::o;36534:589::-;36678:45;36705:4;36711:2;36715:7;36678:26;:45::i;:::-;36756:1;36740:18;;:4;:18;;;36736:187;;;36775:40;36807:7;36775:31;:40::i;:::-;36736:187;;;36845:2;36837:10;;:4;:10;;;36833:90;;36864:47;36897:4;36903:7;36864:32;:47::i;:::-;36833:90;36736:187;36951:1;36937:16;;:2;:16;;;36933:183;;;36970:45;37007:7;36970:36;:45::i;:::-;36933:183;;;37043:4;37037:10;;:2;:10;;;37033:83;;37064:40;37092:2;37096:7;37064:27;:40::i;:::-;37033:83;36933:183;36534:589;;;:::o;28021:321::-;28151:18;28157:2;28161:7;28151:5;:18::i;:::-;28202:54;28233:1;28237:2;28241:7;28250:5;28202:22;:54::i;:::-;28180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:321;;;:::o;31421:799::-;31576:4;31597:15;:2;:13;;;:15::i;:::-;31593:620;;;31649:2;31633:36;;;31670:12;:10;:12::i;:::-;31684:4;31690:7;31699:5;31633:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31629:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:1;31875:6;:13;:18;31871:272;;;31918:60;;;;;;;;;;:::i;:::-;;;;;;;;31871:272;32093:6;32087:13;32078:6;32074:2;32070:15;32063:38;31629:529;31766:41;;;31756:51;;;:6;:51;;;;31749:58;;;;;31593:620;32197:4;32190:11;;31421:799;;;;;;;:::o;32792:126::-;;;;:::o;37846:164::-;37950:10;:17;;;;37923:15;:24;37939:7;37923:24;;;;;;;;;;;:44;;;;37978:10;37994:7;37978:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:164;:::o;38637:988::-;38903:22;38953:1;38928:22;38945:4;38928:16;:22::i;:::-;:26;;;;:::i;:::-;38903:51;;38965:18;38986:17;:26;39004:7;38986:26;;;;;;;;;;;;38965:47;;39133:14;39119:10;:28;39115:328;;39164:19;39186:12;:18;39199:4;39186:18;;;;;;;;;;;;;;;:34;39205:14;39186:34;;;;;;;;;;;;39164:56;;39270:11;39237:12;:18;39250:4;39237:18;;;;;;;;;;;;;;;:30;39256:10;39237:30;;;;;;;;;;;:44;;;;39387:10;39354:17;:30;39372:11;39354:30;;;;;;;;;;;:43;;;;39149:294;39115:328;39539:17;:26;39557:7;39539:26;;;;;;;;;;;39532:33;;;39583:12;:18;39596:4;39583:18;;;;;;;;;;;;;;;:34;39602:14;39583:34;;;;;;;;;;;39576:41;;;38718:907;;38637:988;;:::o;39920:1079::-;40173:22;40218:1;40198:10;:17;;;;:21;;;;:::i;:::-;40173:46;;40230:18;40251:15;:24;40267:7;40251:24;;;;;;;;;;;;40230:45;;40602:19;40624:10;40635:14;40624:26;;;;;;;;:::i;:::-;;;;;;;;;;40602:48;;40688:11;40663:10;40674;40663:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40799:10;40768:15;:28;40784:11;40768:28;;;;;;;;;;;:41;;;;40940:15;:24;40956:7;40940:24;;;;;;;;;;;40933:31;;;40975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39991:1008;;;39920:1079;:::o;37424:221::-;37509:14;37526:20;37543:2;37526:16;:20::i;:::-;37509:37;;37584:7;37557:12;:16;37570:2;37557:16;;;;;;;;;;;;;;;:24;37574:6;37557:24;;;;;;;;;;;:34;;;;37631:6;37602:17;:26;37620:7;37602:26;;;;;;;;;;;:35;;;;37498:147;37424:221;;:::o;28678:382::-;28772:1;28758:16;;:2;:16;;;;28750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:16;28839:7;28831;:16::i;:::-;28830:17;28822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:45;28922:1;28926:2;28930:7;28893:20;:45::i;:::-;28968:1;28951:9;:13;28961:2;28951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28999:2;28980:7;:16;28988:7;28980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29044:7;29040:2;29019:33;;29036:1;29019:33;;;;;;;;;;;;28678:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:370::-;1980:5;2029:3;2022:4;2014:6;2010:17;2006:27;1996:122;;2037:79;;:::i;:::-;1996:122;2154:6;2141:20;2179:94;2269:3;2261:6;2254:4;2246:6;2242:17;2179:94;:::i;:::-;2170:103;;1986:293;1909:370;;;;:::o;2285:133::-;2328:5;2366:6;2353:20;2344:29;;2382:30;2406:5;2382:30;:::i;:::-;2285:133;;;;:::o;2424:137::-;2469:5;2507:6;2494:20;2485:29;;2523:32;2549:5;2523:32;:::i;:::-;2424:137;;;;:::o;2567:141::-;2623:5;2654:6;2648:13;2639:22;;2670:32;2696:5;2670:32;:::i;:::-;2567:141;;;;:::o;2727:338::-;2782:5;2831:3;2824:4;2816:6;2812:17;2808:27;2798:122;;2839:79;;:::i;:::-;2798:122;2956:6;2943:20;2981:78;3055:3;3047:6;3040:4;3032:6;3028:17;2981:78;:::i;:::-;2972:87;;2788:277;2727:338;;;;:::o;3085:340::-;3141:5;3190:3;3183:4;3175:6;3171:17;3167:27;3157:122;;3198:79;;:::i;:::-;3157:122;3315:6;3302:20;3340:79;3415:3;3407:6;3400:4;3392:6;3388:17;3340:79;:::i;:::-;3331:88;;3147:278;3085:340;;;;:::o;3431:139::-;3477:5;3515:6;3502:20;3493:29;;3531:33;3558:5;3531:33;:::i;:::-;3431:139;;;;:::o;3576:329::-;3635:6;3684:2;3672:9;3663:7;3659:23;3655:32;3652:119;;;3690:79;;:::i;:::-;3652:119;3810:1;3835:53;3880:7;3871:6;3860:9;3856:22;3835:53;:::i;:::-;3825:63;;3781:117;3576:329;;;;:::o;3911:345::-;3978:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:119;;;4033:79;;:::i;:::-;3995:119;4153:1;4178:61;4231:7;4222:6;4211:9;4207:22;4178:61;:::i;:::-;4168:71;;4124:125;3911:345;;;;:::o;4262:474::-;4330:6;4338;4387:2;4375:9;4366:7;4362:23;4358:32;4355:119;;;4393:79;;:::i;:::-;4355:119;4513:1;4538:53;4583:7;4574:6;4563:9;4559:22;4538:53;:::i;:::-;4528:63;;4484:117;4640:2;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4611:118;4262:474;;;;;:::o;4742:619::-;4819:6;4827;4835;4884:2;4872:9;4863:7;4859:23;4855:32;4852:119;;;4890:79;;:::i;:::-;4852:119;5010:1;5035:53;5080:7;5071:6;5060:9;5056:22;5035:53;:::i;:::-;5025:63;;4981:117;5137:2;5163:53;5208:7;5199:6;5188:9;5184:22;5163:53;:::i;:::-;5153:63;;5108:118;5265:2;5291:53;5336:7;5327:6;5316:9;5312:22;5291:53;:::i;:::-;5281:63;;5236:118;4742:619;;;;;:::o;5367:943::-;5462:6;5470;5478;5486;5535:3;5523:9;5514:7;5510:23;5506:33;5503:120;;;5542:79;;:::i;:::-;5503:120;5662:1;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5633:117;5789:2;5815:53;5860:7;5851:6;5840:9;5836:22;5815:53;:::i;:::-;5805:63;;5760:118;5917:2;5943:53;5988:7;5979:6;5968:9;5964:22;5943:53;:::i;:::-;5933:63;;5888:118;6073:2;6062:9;6058:18;6045:32;6104:18;6096:6;6093:30;6090:117;;;6126:79;;:::i;:::-;6090:117;6231:62;6285:7;6276:6;6265:9;6261:22;6231:62;:::i;:::-;6221:72;;6016:287;5367:943;;;;;;;:::o;6316:468::-;6381:6;6389;6438:2;6426:9;6417:7;6413:23;6409:32;6406:119;;;6444:79;;:::i;:::-;6406:119;6564:1;6589:53;6634:7;6625:6;6614:9;6610:22;6589:53;:::i;:::-;6579:63;;6535:117;6691:2;6717:50;6759:7;6750:6;6739:9;6735:22;6717:50;:::i;:::-;6707:60;;6662:115;6316:468;;;;;:::o;6790:474::-;6858:6;6866;6915:2;6903:9;6894:7;6890:23;6886:32;6883:119;;;6921:79;;:::i;:::-;6883:119;7041:1;7066:53;7111:7;7102:6;7091:9;7087:22;7066:53;:::i;:::-;7056:63;;7012:117;7168:2;7194:53;7239:7;7230:6;7219:9;7215:22;7194:53;:::i;:::-;7184:63;;7139:118;6790:474;;;;;:::o;7270:539::-;7354:6;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7557:1;7546:9;7542:17;7529:31;7587:18;7579:6;7576:30;7573:117;;;7609:79;;:::i;:::-;7573:117;7714:78;7784:7;7775:6;7764:9;7760:22;7714:78;:::i;:::-;7704:88;;7500:302;7270:539;;;;:::o;7815:327::-;7873:6;7922:2;7910:9;7901:7;7897:23;7893:32;7890:119;;;7928:79;;:::i;:::-;7890:119;8048:1;8073:52;8117:7;8108:6;8097:9;8093:22;8073:52;:::i;:::-;8063:62;;8019:116;7815:327;;;;:::o;8148:349::-;8217:6;8266:2;8254:9;8245:7;8241:23;8237:32;8234:119;;;8272:79;;:::i;:::-;8234:119;8392:1;8417:63;8472:7;8463:6;8452:9;8448:22;8417:63;:::i;:::-;8407:73;;8363:127;8148:349;;;;:::o;8503:509::-;8572:6;8621:2;8609:9;8600:7;8596:23;8592:32;8589:119;;;8627:79;;:::i;:::-;8589:119;8775:1;8764:9;8760:17;8747:31;8805:18;8797:6;8794:30;8791:117;;;8827:79;;:::i;:::-;8791:117;8932:63;8987:7;8978:6;8967:9;8963:22;8932:63;:::i;:::-;8922:73;;8718:287;8503:509;;;;:::o;9018:329::-;9077:6;9126:2;9114:9;9105:7;9101:23;9097:32;9094:119;;;9132:79;;:::i;:::-;9094:119;9252:1;9277:53;9322:7;9313:6;9302:9;9298:22;9277:53;:::i;:::-;9267:63;;9223:117;9018:329;;;;:::o;9353:179::-;9422:10;9443:46;9485:3;9477:6;9443:46;:::i;:::-;9521:4;9516:3;9512:14;9498:28;;9353:179;;;;:::o;9538:::-;9607:10;9628:46;9670:3;9662:6;9628:46;:::i;:::-;9706:4;9701:3;9697:14;9683:28;;9538:179;;;;:::o;9723:147::-;9818:45;9857:5;9818:45;:::i;:::-;9813:3;9806:58;9723:147;;:::o;9876:108::-;9953:24;9971:5;9953:24;:::i;:::-;9948:3;9941:37;9876:108;;:::o;9990:118::-;10077:24;10095:5;10077:24;:::i;:::-;10072:3;10065:37;9990:118;;:::o;10144:732::-;10263:3;10292:54;10340:5;10292:54;:::i;:::-;10362:86;10441:6;10436:3;10362:86;:::i;:::-;10355:93;;10472:56;10522:5;10472:56;:::i;:::-;10551:7;10582:1;10567:284;10592:6;10589:1;10586:13;10567:284;;;10668:6;10662:13;10695:63;10754:3;10739:13;10695:63;:::i;:::-;10688:70;;10781:60;10834:6;10781:60;:::i;:::-;10771:70;;10627:224;10614:1;10611;10607:9;10602:14;;10567:284;;;10571:14;10867:3;10860:10;;10268:608;;;10144:732;;;;:::o;10912:::-;11031:3;11060:54;11108:5;11060:54;:::i;:::-;11130:86;11209:6;11204:3;11130:86;:::i;:::-;11123:93;;11240:56;11290:5;11240:56;:::i;:::-;11319:7;11350:1;11335:284;11360:6;11357:1;11354:13;11335:284;;;11436:6;11430:13;11463:63;11522:3;11507:13;11463:63;:::i;:::-;11456:70;;11549:60;11602:6;11549:60;:::i;:::-;11539:70;;11395:224;11382:1;11379;11375:9;11370:14;;11335:284;;;11339:14;11635:3;11628:10;;11036:608;;;10912:732;;;;:::o;11650:109::-;11731:21;11746:5;11731:21;:::i;:::-;11726:3;11719:34;11650:109;;:::o;11765:360::-;11851:3;11879:38;11911:5;11879:38;:::i;:::-;11933:70;11996:6;11991:3;11933:70;:::i;:::-;11926:77;;12012:52;12057:6;12052:3;12045:4;12038:5;12034:16;12012:52;:::i;:::-;12089:29;12111:6;12089:29;:::i;:::-;12084:3;12080:39;12073:46;;11855:270;11765:360;;;;:::o;12131:364::-;12219:3;12247:39;12280:5;12247:39;:::i;:::-;12302:71;12366:6;12361:3;12302:71;:::i;:::-;12295:78;;12382:52;12427:6;12422:3;12415:4;12408:5;12404:16;12382:52;:::i;:::-;12459:29;12481:6;12459:29;:::i;:::-;12454:3;12450:39;12443:46;;12223:272;12131:364;;;;:::o;12501:377::-;12607:3;12635:39;12668:5;12635:39;:::i;:::-;12690:89;12772:6;12767:3;12690:89;:::i;:::-;12683:96;;12788:52;12833:6;12828:3;12821:4;12814:5;12810:16;12788:52;:::i;:::-;12865:6;12860:3;12856:16;12849:23;;12611:267;12501:377;;;;:::o;12908:802::-;12993:3;13030:5;13024:12;13059:36;13085:9;13059:36;:::i;:::-;13111:71;13175:6;13170:3;13111:71;:::i;:::-;13104:78;;13213:1;13202:9;13198:17;13229:1;13224:135;;;;13373:1;13368:336;;;;13191:513;;13224:135;13308:4;13304:9;13293;13289:25;13284:3;13277:38;13344:4;13339:3;13335:14;13328:21;;13224:135;;13368:336;13435:38;13467:5;13435:38;:::i;:::-;13495:1;13509:154;13523:6;13520:1;13517:13;13509:154;;;13597:7;13591:14;13587:1;13582:3;13578:11;13571:35;13647:1;13638:7;13634:15;13623:26;;13545:4;13542:1;13538:12;13533:17;;13509:154;;;13692:1;13687:3;13683:11;13676:18;;13375:329;;13191:513;;12997:713;;12908:802;;;;:::o;13716:366::-;13858:3;13879:67;13943:2;13938:3;13879:67;:::i;:::-;13872:74;;13955:93;14044:3;13955:93;:::i;:::-;14073:2;14068:3;14064:12;14057:19;;13716:366;;;:::o;14088:::-;14230:3;14251:67;14315:2;14310:3;14251:67;:::i;:::-;14244:74;;14327:93;14416:3;14327:93;:::i;:::-;14445:2;14440:3;14436:12;14429:19;;14088:366;;;:::o;14460:::-;14602:3;14623:67;14687:2;14682:3;14623:67;:::i;:::-;14616:74;;14699:93;14788:3;14699:93;:::i;:::-;14817:2;14812:3;14808:12;14801:19;;14460:366;;;:::o;14832:::-;14974:3;14995:67;15059:2;15054:3;14995:67;:::i;:::-;14988:74;;15071:93;15160:3;15071:93;:::i;:::-;15189:2;15184:3;15180:12;15173:19;;14832:366;;;:::o;15204:::-;15346:3;15367:67;15431:2;15426:3;15367:67;:::i;:::-;15360:74;;15443:93;15532:3;15443:93;:::i;:::-;15561:2;15556:3;15552:12;15545:19;;15204:366;;;:::o;15576:::-;15718:3;15739:67;15803:2;15798:3;15739:67;:::i;:::-;15732:74;;15815:93;15904:3;15815:93;:::i;:::-;15933:2;15928:3;15924:12;15917:19;;15576:366;;;:::o;15948:::-;16090:3;16111:67;16175:2;16170:3;16111:67;:::i;:::-;16104:74;;16187:93;16276:3;16187:93;:::i;:::-;16305:2;16300:3;16296:12;16289:19;;15948:366;;;:::o;16320:::-;16462:3;16483:67;16547:2;16542:3;16483:67;:::i;:::-;16476:74;;16559:93;16648:3;16559:93;:::i;:::-;16677:2;16672:3;16668:12;16661:19;;16320:366;;;:::o;16692:::-;16834:3;16855:67;16919:2;16914:3;16855:67;:::i;:::-;16848:74;;16931:93;17020:3;16931:93;:::i;:::-;17049:2;17044:3;17040:12;17033:19;;16692:366;;;:::o;17064:::-;17206:3;17227:67;17291:2;17286:3;17227:67;:::i;:::-;17220:74;;17303:93;17392:3;17303:93;:::i;:::-;17421:2;17416:3;17412:12;17405:19;;17064:366;;;:::o;17436:::-;17578:3;17599:67;17663:2;17658:3;17599:67;:::i;:::-;17592:74;;17675:93;17764:3;17675:93;:::i;:::-;17793:2;17788:3;17784:12;17777:19;;17436:366;;;:::o;17808:::-;17950:3;17971:67;18035:2;18030:3;17971:67;:::i;:::-;17964:74;;18047:93;18136:3;18047:93;:::i;:::-;18165:2;18160:3;18156:12;18149:19;;17808:366;;;:::o;18180:::-;18322:3;18343:67;18407:2;18402:3;18343:67;:::i;:::-;18336:74;;18419:93;18508:3;18419:93;:::i;:::-;18537:2;18532:3;18528:12;18521:19;;18180:366;;;:::o;18552:::-;18694:3;18715:67;18779:2;18774:3;18715:67;:::i;:::-;18708:74;;18791:93;18880:3;18791:93;:::i;:::-;18909:2;18904:3;18900:12;18893:19;;18552:366;;;:::o;18924:::-;19066:3;19087:67;19151:2;19146:3;19087:67;:::i;:::-;19080:74;;19163:93;19252:3;19163:93;:::i;:::-;19281:2;19276:3;19272:12;19265:19;;18924:366;;;:::o;19296:::-;19438:3;19459:67;19523:2;19518:3;19459:67;:::i;:::-;19452:74;;19535:93;19624:3;19535:93;:::i;:::-;19653:2;19648:3;19644:12;19637:19;;19296:366;;;:::o;19668:::-;19810:3;19831:67;19895:2;19890:3;19831:67;:::i;:::-;19824:74;;19907:93;19996:3;19907:93;:::i;:::-;20025:2;20020:3;20016:12;20009:19;;19668:366;;;:::o;20040:::-;20182:3;20203:67;20267:2;20262:3;20203:67;:::i;:::-;20196:74;;20279:93;20368:3;20279:93;:::i;:::-;20397:2;20392:3;20388:12;20381:19;;20040:366;;;:::o;20412:::-;20554:3;20575:67;20639:2;20634:3;20575:67;:::i;:::-;20568:74;;20651:93;20740:3;20651:93;:::i;:::-;20769:2;20764:3;20760:12;20753:19;;20412:366;;;:::o;20784:::-;20926:3;20947:67;21011:2;21006:3;20947:67;:::i;:::-;20940:74;;21023:93;21112:3;21023:93;:::i;:::-;21141:2;21136:3;21132:12;21125:19;;20784:366;;;:::o;21156:::-;21298:3;21319:67;21383:2;21378:3;21319:67;:::i;:::-;21312:74;;21395:93;21484:3;21395:93;:::i;:::-;21513:2;21508:3;21504:12;21497:19;;21156:366;;;:::o;21528:::-;21670:3;21691:67;21755:2;21750:3;21691:67;:::i;:::-;21684:74;;21767:93;21856:3;21767:93;:::i;:::-;21885:2;21880:3;21876:12;21869:19;;21528:366;;;:::o;21900:::-;22042:3;22063:67;22127:2;22122:3;22063:67;:::i;:::-;22056:74;;22139:93;22228:3;22139:93;:::i;:::-;22257:2;22252:3;22248:12;22241:19;;21900:366;;;:::o;22272:::-;22414:3;22435:67;22499:2;22494:3;22435:67;:::i;:::-;22428:74;;22511:93;22600:3;22511:93;:::i;:::-;22629:2;22624:3;22620:12;22613:19;;22272:366;;;:::o;22644:::-;22786:3;22807:67;22871:2;22866:3;22807:67;:::i;:::-;22800:74;;22883:93;22972:3;22883:93;:::i;:::-;23001:2;22996:3;22992:12;22985:19;;22644:366;;;:::o;23016:::-;23158:3;23179:67;23243:2;23238:3;23179:67;:::i;:::-;23172:74;;23255:93;23344:3;23255:93;:::i;:::-;23373:2;23368:3;23364:12;23357:19;;23016:366;;;:::o;23388:::-;23530:3;23551:67;23615:2;23610:3;23551:67;:::i;:::-;23544:74;;23627:93;23716:3;23627:93;:::i;:::-;23745:2;23740:3;23736:12;23729:19;;23388:366;;;:::o;23760:398::-;23919:3;23940:83;24021:1;24016:3;23940:83;:::i;:::-;23933:90;;24032:93;24121:3;24032:93;:::i;:::-;24150:1;24145:3;24141:11;24134:18;;23760:398;;;:::o;24164:366::-;24306:3;24327:67;24391:2;24386:3;24327:67;:::i;:::-;24320:74;;24403:93;24492:3;24403:93;:::i;:::-;24521:2;24516:3;24512:12;24505:19;;24164:366;;;:::o;24536:::-;24678:3;24699:67;24763:2;24758:3;24699:67;:::i;:::-;24692:74;;24775:93;24864:3;24775:93;:::i;:::-;24893:2;24888:3;24884:12;24877:19;;24536:366;;;:::o;24908:::-;25050:3;25071:67;25135:2;25130:3;25071:67;:::i;:::-;25064:74;;25147:93;25236:3;25147:93;:::i;:::-;25265:2;25260:3;25256:12;25249:19;;24908:366;;;:::o;25280:108::-;25357:24;25375:5;25357:24;:::i;:::-;25352:3;25345:37;25280:108;;:::o;25394:118::-;25481:24;25499:5;25481:24;:::i;:::-;25476:3;25469:37;25394:118;;:::o;25518:435::-;25698:3;25720:95;25811:3;25802:6;25720:95;:::i;:::-;25713:102;;25832:95;25923:3;25914:6;25832:95;:::i;:::-;25825:102;;25944:3;25937:10;;25518:435;;;;;:::o;25959:379::-;26143:3;26165:147;26308:3;26165:147;:::i;:::-;26158:154;;26329:3;26322:10;;25959:379;;;:::o;26344:222::-;26437:4;26475:2;26464:9;26460:18;26452:26;;26488:71;26556:1;26545:9;26541:17;26532:6;26488:71;:::i;:::-;26344:222;;;;:::o;26572:348::-;26701:4;26739:2;26728:9;26724:18;26716:26;;26752:79;26828:1;26817:9;26813:17;26804:6;26752:79;:::i;:::-;26841:72;26909:2;26898:9;26894:18;26885:6;26841:72;:::i;:::-;26572:348;;;;;:::o;26926:640::-;27121:4;27159:3;27148:9;27144:19;27136:27;;27173:71;27241:1;27230:9;27226:17;27217:6;27173:71;:::i;:::-;27254:72;27322:2;27311:9;27307:18;27298:6;27254:72;:::i;:::-;27336;27404:2;27393:9;27389:18;27380:6;27336:72;:::i;:::-;27455:9;27449:4;27445:20;27440:2;27429:9;27425:18;27418:48;27483:76;27554:4;27545:6;27483:76;:::i;:::-;27475:84;;26926:640;;;;;;;:::o;27572:332::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27744:71;27812:1;27801:9;27797:17;27788:6;27744:71;:::i;:::-;27825:72;27893:2;27882:9;27878:18;27869:6;27825:72;:::i;:::-;27572:332;;;;;:::o;27910:373::-;28053:4;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:108;28271:4;28262:6;28168:108;:::i;:::-;28160:116;;27910:373;;;;:::o;28289:::-;28432:4;28470:2;28459:9;28455:18;28447:26;;28519:9;28513:4;28509:20;28505:1;28494:9;28490:17;28483:47;28547:108;28650:4;28641:6;28547:108;:::i;:::-;28539:116;;28289:373;;;;:::o;28668:210::-;28755:4;28793:2;28782:9;28778:18;28770:26;;28806:65;28868:1;28857:9;28853:17;28844:6;28806:65;:::i;:::-;28668:210;;;;:::o;28884:313::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:78;29185:4;29176:6;29112:78;:::i;:::-;29104:86;;28884:313;;;;:::o;29203:307::-;29313:4;29351:2;29340:9;29336:18;29328:26;;29400:9;29394:4;29390:20;29386:1;29375:9;29371:17;29364:47;29428:75;29498:4;29489:6;29428:75;:::i;:::-;29420:83;;29203:307;;;;:::o;29516:419::-;29682:4;29720:2;29709:9;29705:18;29697:26;;29769:9;29763:4;29759:20;29755:1;29744:9;29740:17;29733:47;29797:131;29923:4;29797:131;:::i;:::-;29789:139;;29516:419;;;:::o;29941:::-;30107:4;30145:2;30134:9;30130:18;30122:26;;30194:9;30188:4;30184:20;30180:1;30169:9;30165:17;30158:47;30222:131;30348:4;30222:131;:::i;:::-;30214:139;;29941:419;;;:::o;30366:::-;30532:4;30570:2;30559:9;30555:18;30547:26;;30619:9;30613:4;30609:20;30605:1;30594:9;30590:17;30583:47;30647:131;30773:4;30647:131;:::i;:::-;30639:139;;30366:419;;;:::o;30791:::-;30957:4;30995:2;30984:9;30980:18;30972:26;;31044:9;31038:4;31034:20;31030:1;31019:9;31015:17;31008:47;31072:131;31198:4;31072:131;:::i;:::-;31064:139;;30791:419;;;:::o;31216:::-;31382:4;31420:2;31409:9;31405:18;31397:26;;31469:9;31463:4;31459:20;31455:1;31444:9;31440:17;31433:47;31497:131;31623:4;31497:131;:::i;:::-;31489:139;;31216:419;;;:::o;31641:::-;31807:4;31845:2;31834:9;31830:18;31822:26;;31894:9;31888:4;31884:20;31880:1;31869:9;31865:17;31858:47;31922:131;32048:4;31922:131;:::i;:::-;31914:139;;31641:419;;;:::o;32066:::-;32232:4;32270:2;32259:9;32255:18;32247:26;;32319:9;32313:4;32309:20;32305:1;32294:9;32290:17;32283:47;32347:131;32473:4;32347:131;:::i;:::-;32339:139;;32066:419;;;:::o;32491:::-;32657:4;32695:2;32684:9;32680:18;32672:26;;32744:9;32738:4;32734:20;32730:1;32719:9;32715:17;32708:47;32772:131;32898:4;32772:131;:::i;:::-;32764:139;;32491:419;;;:::o;32916:::-;33082:4;33120:2;33109:9;33105:18;33097:26;;33169:9;33163:4;33159:20;33155:1;33144:9;33140:17;33133:47;33197:131;33323:4;33197:131;:::i;:::-;33189:139;;32916:419;;;:::o;33341:::-;33507:4;33545:2;33534:9;33530:18;33522:26;;33594:9;33588:4;33584:20;33580:1;33569:9;33565:17;33558:47;33622:131;33748:4;33622:131;:::i;:::-;33614:139;;33341:419;;;:::o;33766:::-;33932:4;33970:2;33959:9;33955:18;33947:26;;34019:9;34013:4;34009:20;34005:1;33994:9;33990:17;33983:47;34047:131;34173:4;34047:131;:::i;:::-;34039:139;;33766:419;;;:::o;34191:::-;34357:4;34395:2;34384:9;34380:18;34372:26;;34444:9;34438:4;34434:20;34430:1;34419:9;34415:17;34408:47;34472:131;34598:4;34472:131;:::i;:::-;34464:139;;34191:419;;;:::o;34616:::-;34782:4;34820:2;34809:9;34805:18;34797:26;;34869:9;34863:4;34859:20;34855:1;34844:9;34840:17;34833:47;34897:131;35023:4;34897:131;:::i;:::-;34889:139;;34616:419;;;:::o;35041:::-;35207:4;35245:2;35234:9;35230:18;35222:26;;35294:9;35288:4;35284:20;35280:1;35269:9;35265:17;35258:47;35322:131;35448:4;35322:131;:::i;:::-;35314:139;;35041:419;;;:::o;35466:::-;35632:4;35670:2;35659:9;35655:18;35647:26;;35719:9;35713:4;35709:20;35705:1;35694:9;35690:17;35683:47;35747:131;35873:4;35747:131;:::i;:::-;35739:139;;35466:419;;;:::o;35891:::-;36057:4;36095:2;36084:9;36080:18;36072:26;;36144:9;36138:4;36134:20;36130:1;36119:9;36115:17;36108:47;36172:131;36298:4;36172:131;:::i;:::-;36164:139;;35891:419;;;:::o;36316:::-;36482:4;36520:2;36509:9;36505:18;36497:26;;36569:9;36563:4;36559:20;36555:1;36544:9;36540:17;36533:47;36597:131;36723:4;36597:131;:::i;:::-;36589:139;;36316:419;;;:::o;36741:::-;36907:4;36945:2;36934:9;36930:18;36922:26;;36994:9;36988:4;36984:20;36980:1;36969:9;36965:17;36958:47;37022:131;37148:4;37022:131;:::i;:::-;37014:139;;36741:419;;;:::o;37166:::-;37332:4;37370:2;37359:9;37355:18;37347:26;;37419:9;37413:4;37409:20;37405:1;37394:9;37390:17;37383:47;37447:131;37573:4;37447:131;:::i;:::-;37439:139;;37166:419;;;:::o;37591:::-;37757:4;37795:2;37784:9;37780:18;37772:26;;37844:9;37838:4;37834:20;37830:1;37819:9;37815:17;37808:47;37872:131;37998:4;37872:131;:::i;:::-;37864:139;;37591:419;;;:::o;38016:::-;38182:4;38220:2;38209:9;38205:18;38197:26;;38269:9;38263:4;38259:20;38255:1;38244:9;38240:17;38233:47;38297:131;38423:4;38297:131;:::i;:::-;38289:139;;38016:419;;;:::o;38441:::-;38607:4;38645:2;38634:9;38630:18;38622:26;;38694:9;38688:4;38684:20;38680:1;38669:9;38665:17;38658:47;38722:131;38848:4;38722:131;:::i;:::-;38714:139;;38441:419;;;:::o;38866:::-;39032:4;39070:2;39059:9;39055:18;39047:26;;39119:9;39113:4;39109:20;39105:1;39094:9;39090:17;39083:47;39147:131;39273:4;39147:131;:::i;:::-;39139:139;;38866:419;;;:::o;39291:::-;39457:4;39495:2;39484:9;39480:18;39472:26;;39544:9;39538:4;39534:20;39530:1;39519:9;39515:17;39508:47;39572:131;39698:4;39572:131;:::i;:::-;39564:139;;39291:419;;;:::o;39716:::-;39882:4;39920:2;39909:9;39905:18;39897:26;;39969:9;39963:4;39959:20;39955:1;39944:9;39940:17;39933:47;39997:131;40123:4;39997:131;:::i;:::-;39989:139;;39716:419;;;:::o;40141:::-;40307:4;40345:2;40334:9;40330:18;40322:26;;40394:9;40388:4;40384:20;40380:1;40369:9;40365:17;40358:47;40422:131;40548:4;40422:131;:::i;:::-;40414:139;;40141:419;;;:::o;40566:::-;40732:4;40770:2;40759:9;40755:18;40747:26;;40819:9;40813:4;40809:20;40805:1;40794:9;40790:17;40783:47;40847:131;40973:4;40847:131;:::i;:::-;40839:139;;40566:419;;;:::o;40991:::-;41157:4;41195:2;41184:9;41180:18;41172:26;;41244:9;41238:4;41234:20;41230:1;41219:9;41215:17;41208:47;41272:131;41398:4;41272:131;:::i;:::-;41264:139;;40991:419;;;:::o;41416:::-;41582:4;41620:2;41609:9;41605:18;41597:26;;41669:9;41663:4;41659:20;41655:1;41644:9;41640:17;41633:47;41697:131;41823:4;41697:131;:::i;:::-;41689:139;;41416:419;;;:::o;41841:::-;42007:4;42045:2;42034:9;42030:18;42022:26;;42094:9;42088:4;42084:20;42080:1;42069:9;42065:17;42058:47;42122:131;42248:4;42122:131;:::i;:::-;42114:139;;41841:419;;;:::o;42266:222::-;42359:4;42397:2;42386:9;42382:18;42374:26;;42410:71;42478:1;42467:9;42463:17;42454:6;42410:71;:::i;:::-;42266:222;;;;:::o;42494:129::-;42528:6;42555:20;;:::i;:::-;42545:30;;42584:33;42612:4;42604:6;42584:33;:::i;:::-;42494:129;;;:::o;42629:75::-;42662:6;42695:2;42689:9;42679:19;;42629:75;:::o;42710:311::-;42787:4;42877:18;42869:6;42866:30;42863:56;;;42899:18;;:::i;:::-;42863:56;42949:4;42941:6;42937:17;42929:25;;43009:4;43003;42999:15;42991:23;;42710:311;;;:::o;43027:307::-;43088:4;43178:18;43170:6;43167:30;43164:56;;;43200:18;;:::i;:::-;43164:56;43238:29;43260:6;43238:29;:::i;:::-;43230:37;;43322:4;43316;43312:15;43304:23;;43027:307;;;:::o;43340:308::-;43402:4;43492:18;43484:6;43481:30;43478:56;;;43514:18;;:::i;:::-;43478:56;43552:29;43574:6;43552:29;:::i;:::-;43544:37;;43636:4;43630;43626:15;43618:23;;43340:308;;;:::o;43654:132::-;43721:4;43744:3;43736:11;;43774:4;43769:3;43765:14;43757:22;;43654:132;;;:::o;43792:::-;43859:4;43882:3;43874:11;;43912:4;43907:3;43903:14;43895:22;;43792:132;;;:::o;43930:141::-;43979:4;44002:3;43994:11;;44025:3;44022:1;44015:14;44059:4;44056:1;44046:18;44038:26;;43930:141;;;:::o;44077:114::-;44144:6;44178:5;44172:12;44162:22;;44077:114;;;:::o;44197:::-;44264:6;44298:5;44292:12;44282:22;;44197:114;;;:::o;44317:98::-;44368:6;44402:5;44396:12;44386:22;;44317:98;;;:::o;44421:99::-;44473:6;44507:5;44501:12;44491:22;;44421:99;;;:::o;44526:113::-;44596:4;44628;44623:3;44619:14;44611:22;;44526:113;;;:::o;44645:::-;44715:4;44747;44742:3;44738:14;44730:22;;44645:113;;;:::o;44764:184::-;44863:11;44897:6;44892:3;44885:19;44937:4;44932:3;44928:14;44913:29;;44764:184;;;;:::o;44954:::-;45053:11;45087:6;45082:3;45075:19;45127:4;45122:3;45118:14;45103:29;;44954:184;;;;:::o;45144:168::-;45227:11;45261:6;45256:3;45249:19;45301:4;45296:3;45292:14;45277:29;;45144:168;;;;:::o;45318:147::-;45419:11;45456:3;45441:18;;45318:147;;;;:::o;45471:169::-;45555:11;45589:6;45584:3;45577:19;45629:4;45624:3;45620:14;45605:29;;45471:169;;;;:::o;45646:148::-;45748:11;45785:3;45770:18;;45646:148;;;;:::o;45800:305::-;45840:3;45859:20;45877:1;45859:20;:::i;:::-;45854:25;;45893:20;45911:1;45893:20;:::i;:::-;45888:25;;46047:1;45979:66;45975:74;45972:1;45969:81;45966:107;;;46053:18;;:::i;:::-;45966:107;46097:1;46094;46090:9;46083:16;;45800:305;;;;:::o;46111:185::-;46151:1;46168:20;46186:1;46168:20;:::i;:::-;46163:25;;46202:20;46220:1;46202:20;:::i;:::-;46197:25;;46241:1;46231:35;;46246:18;;:::i;:::-;46231:35;46288:1;46285;46281:9;46276:14;;46111:185;;;;:::o;46302:348::-;46342:7;46365:20;46383:1;46365:20;:::i;:::-;46360:25;;46399:20;46417:1;46399:20;:::i;:::-;46394:25;;46587:1;46519:66;46515:74;46512:1;46509:81;46504:1;46497:9;46490:17;46486:105;46483:131;;;46594:18;;:::i;:::-;46483:131;46642:1;46639;46635:9;46624:20;;46302:348;;;;:::o;46656:191::-;46696:4;46716:20;46734:1;46716:20;:::i;:::-;46711:25;;46750:20;46768:1;46750:20;:::i;:::-;46745:25;;46789:1;46786;46783:8;46780:34;;;46794:18;;:::i;:::-;46780:34;46839:1;46836;46832:9;46824:17;;46656:191;;;;:::o;46853:96::-;46890:7;46919:24;46937:5;46919:24;:::i;:::-;46908:35;;46853:96;;;:::o;46955:104::-;47000:7;47029:24;47047:5;47029:24;:::i;:::-;47018:35;;46955:104;;;:::o;47065:90::-;47099:7;47142:5;47135:13;47128:21;47117:32;;47065:90;;;:::o;47161:149::-;47197:7;47237:66;47230:5;47226:78;47215:89;;47161:149;;;:::o;47316:126::-;47353:7;47393:42;47386:5;47382:54;47371:65;;47316:126;;;:::o;47448:77::-;47485:7;47514:5;47503:16;;47448:77;;;:::o;47531:134::-;47589:9;47622:37;47653:5;47622:37;:::i;:::-;47609:50;;47531:134;;;:::o;47671:126::-;47721:9;47754:37;47785:5;47754:37;:::i;:::-;47741:50;;47671:126;;;:::o;47803:113::-;47853:9;47886:24;47904:5;47886:24;:::i;:::-;47873:37;;47803:113;;;:::o;47922:154::-;48006:6;48001:3;47996;47983:30;48068:1;48059:6;48054:3;48050:16;48043:27;47922:154;;;:::o;48082:307::-;48150:1;48160:113;48174:6;48171:1;48168:13;48160:113;;;48259:1;48254:3;48250:11;48244:18;48240:1;48235:3;48231:11;48224:39;48196:2;48193:1;48189:10;48184:15;;48160:113;;;48291:6;48288:1;48285:13;48282:101;;;48371:1;48362:6;48357:3;48353:16;48346:27;48282:101;48131:258;48082:307;;;:::o;48395:320::-;48439:6;48476:1;48470:4;48466:12;48456:22;;48523:1;48517:4;48513:12;48544:18;48534:81;;48600:4;48592:6;48588:17;48578:27;;48534:81;48662:2;48654:6;48651:14;48631:18;48628:38;48625:84;;;48681:18;;:::i;:::-;48625:84;48446:269;48395:320;;;:::o;48721:281::-;48804:27;48826:4;48804:27;:::i;:::-;48796:6;48792:40;48934:6;48922:10;48919:22;48898:18;48886:10;48883:34;48880:62;48877:88;;;48945:18;;:::i;:::-;48877:88;48985:10;48981:2;48974:22;48764:238;48721:281;;:::o;49008:233::-;49047:3;49070:24;49088:5;49070:24;:::i;:::-;49061:33;;49116:66;49109:5;49106:77;49103:103;;;49186:18;;:::i;:::-;49103:103;49233:1;49226:5;49222:13;49215:20;;49008:233;;;:::o;49247:176::-;49279:1;49296:20;49314:1;49296:20;:::i;:::-;49291:25;;49330:20;49348:1;49330:20;:::i;:::-;49325:25;;49369:1;49359:35;;49374:18;;:::i;:::-;49359:35;49415:1;49412;49408:9;49403:14;;49247:176;;;;:::o;49429:180::-;49477:77;49474:1;49467:88;49574:4;49571:1;49564:15;49598:4;49595:1;49588:15;49615:180;49663:77;49660:1;49653:88;49760:4;49757:1;49750:15;49784:4;49781:1;49774:15;49801:180;49849:77;49846:1;49839:88;49946:4;49943:1;49936:15;49970:4;49967:1;49960:15;49987:180;50035:77;50032:1;50025:88;50132:4;50129:1;50122:15;50156:4;50153:1;50146:15;50173:180;50221:77;50218:1;50211:88;50318:4;50315:1;50308:15;50342:4;50339:1;50332:15;50359:180;50407:77;50404:1;50397:88;50504:4;50501:1;50494:15;50528:4;50525:1;50518:15;50545:117;50654:1;50651;50644:12;50668:117;50777:1;50774;50767:12;50791:117;50900:1;50897;50890:12;50914:117;51023:1;51020;51013:12;51037:117;51146:1;51143;51136:12;51160:102;51201:6;51252:2;51248:7;51243:2;51236:5;51232:14;51228:28;51218:38;;51160:102;;;:::o;51268:230::-;51408:34;51404:1;51396:6;51392:14;51385:58;51477:13;51472:2;51464:6;51460:15;51453:38;51268:230;:::o;51504:237::-;51644:34;51640:1;51632:6;51628:14;51621:58;51713:20;51708:2;51700:6;51696:15;51689:45;51504:237;:::o;51747:225::-;51887:34;51883:1;51875:6;51871:14;51864:58;51956:8;51951:2;51943:6;51939:15;51932:33;51747:225;:::o;51978:178::-;52118:30;52114:1;52106:6;52102:14;52095:54;51978:178;:::o;52162:225::-;52302:34;52298:1;52290:6;52286:14;52279:58;52371:8;52366:2;52358:6;52354:15;52347:33;52162:225;:::o;52393:223::-;52533:34;52529:1;52521:6;52517:14;52510:58;52602:6;52597:2;52589:6;52585:15;52578:31;52393:223;:::o;52622:175::-;52762:27;52758:1;52750:6;52746:14;52739:51;52622:175;:::o;52803:182::-;52943:34;52939:1;52931:6;52927:14;52920:58;52803:182;:::o;52991:245::-;53131:34;53127:1;53119:6;53115:14;53108:58;53200:28;53195:2;53187:6;53183:15;53176:53;52991:245;:::o;53242:179::-;53382:31;53378:1;53370:6;53366:14;53359:55;53242:179;:::o;53427:231::-;53567:34;53563:1;53555:6;53551:14;53544:58;53636:14;53631:2;53623:6;53619:15;53612:39;53427:231;:::o;53664:230::-;53804:34;53800:1;53792:6;53788:14;53781:58;53873:13;53868:2;53860:6;53856:15;53849:38;53664:230;:::o;53900:236::-;54040:34;54036:1;54028:6;54024:14;54017:58;54109:19;54104:2;54096:6;54092:15;54085:44;53900:236;:::o;54142:243::-;54282:34;54278:1;54270:6;54266:14;54259:58;54351:26;54346:2;54338:6;54334:15;54327:51;54142:243;:::o;54391:229::-;54531:34;54527:1;54519:6;54515:14;54508:58;54600:12;54595:2;54587:6;54583:15;54576:37;54391:229;:::o;54626:228::-;54766:34;54762:1;54754:6;54750:14;54743:58;54835:11;54830:2;54822:6;54818:15;54811:36;54626:228;:::o;54860:160::-;55000:12;54996:1;54988:6;54984:14;54977:36;54860:160;:::o;55026:182::-;55166:34;55162:1;55154:6;55150:14;55143:58;55026:182;:::o;55214:231::-;55354:34;55350:1;55342:6;55338:14;55331:58;55423:14;55418:2;55410:6;55406:15;55399:39;55214:231;:::o;55451:177::-;55591:29;55587:1;55579:6;55575:14;55568:53;55451:177;:::o;55634:182::-;55774:34;55770:1;55762:6;55758:14;55751:58;55634:182;:::o;55822:228::-;55962:34;55958:1;55950:6;55946:14;55939:58;56031:11;56026:2;56018:6;56014:15;56007:36;55822:228;:::o;56056:234::-;56196:34;56192:1;56184:6;56180:14;56173:58;56265:17;56260:2;56252:6;56248:15;56241:42;56056:234;:::o;56296:176::-;56436:28;56432:1;56424:6;56420:14;56413:52;56296:176;:::o;56478:220::-;56618:34;56614:1;56606:6;56602:14;56595:58;56687:3;56682:2;56674:6;56670:15;56663:28;56478:220;:::o;56704:175::-;56844:27;56840:1;56832:6;56828:14;56821:51;56704:175;:::o;56885:172::-;57025:24;57021:1;57013:6;57009:14;57002:48;56885:172;:::o;57063:114::-;;:::o;57183:236::-;57323:34;57319:1;57311:6;57307:14;57300:58;57392:19;57387:2;57379:6;57375:15;57368:44;57183:236;:::o;57425:231::-;57565:34;57561:1;57553:6;57549:14;57542:58;57634:14;57629:2;57621:6;57617:15;57610:39;57425:231;:::o;57662:182::-;57802:34;57798:1;57790:6;57786:14;57779:58;57662:182;:::o;57850:122::-;57923:24;57941:5;57923:24;:::i;:::-;57916:5;57913:35;57903:63;;57962:1;57959;57952:12;57903:63;57850:122;:::o;57978:138::-;58059:32;58085:5;58059:32;:::i;:::-;58052:5;58049:43;58039:71;;58106:1;58103;58096:12;58039:71;57978:138;:::o;58122:116::-;58192:21;58207:5;58192:21;:::i;:::-;58185:5;58182:32;58172:60;;58228:1;58225;58218:12;58172:60;58122:116;:::o;58244:120::-;58316:23;58333:5;58316:23;:::i;:::-;58309:5;58306:34;58296:62;;58354:1;58351;58344:12;58296:62;58244:120;:::o;58370:122::-;58443:24;58461:5;58443:24;:::i;:::-;58436:5;58433:35;58423:63;;58482:1;58479;58472:12;58423:63;58370:122;:::o

Swarm Source

ipfs://92e13ba8284cd5c3fe64aebd5c1384f3e8680306e7ae06e11a83d0892e9ed846
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.