ETH Price: $2,394.11 (+2.67%)

Token

TinyBoys (TBOY)
 

Overview

Max Total Supply

53 TBOY

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
digitalm00lah.eth
Balance
4 TBOY
0xd063bf563e023f91134ce4699706bcb1b7086201
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TinyBoys

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 20 : TinyBoys.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "./IERC2981.sol";
import "./OERC721R.sol";
import "./layerzero/contracts/token/onft/ONFT721Core.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract TinyBoys is Ownable, IERC2981, OERC721R, ONFT721Core {

    using Address for address;
    using Strings for uint256;

    uint256 public saleStartTimestamp = 1652817600;
    uint256 public whitelistEndTimestamp = 1652904000;

    uint256 public royaltyAmount = 1000;
    address public royaltyAddress;
    
    uint256 public mintPrice;

    string public baseProofURI;
    string public baseTokenURI;

    string private wholeContractURI;

    mapping(address => uint256) public whitelist;

    uint256 private whitelistQuantity;

    constructor(
        uint256 _mintPrice,
        uint256 _traverseFee,
        address _lzEndpoint,
        uint256 _offset,
        uint256 _supply
    )
        OERC721R(
            "TinyBoys", 
            "TBOY",
            _offset,
            _supply
        )
        ONFT721Core(
            _lzEndpoint, 
            _traverseFee
        )
    {
        mintPrice = _mintPrice;

        royaltyAddress = owner();
    }

    function claim(address _to) external {
        require(isSaleLive());

        uint256 _amount = whitelist[_msgSender()];
        require(_amount > 0);
        
        _removeWhitelist(_msgSender());

        _mintRandom(_to, _amount);
    }

    function mint(address _to, uint256 _amount) external payable {
        require(isSaleLive());
        require(msg.value == mintPrice * _amount);
        require(_amount <= 10);
        require(_amount + totalMint() <= _availableMint());

        _mintRandom(_to, _amount);
    }

    function addWhitelist(address[] memory _address, uint256 _quantity) external onlyOwner {
        for (uint256 i = 0; i < _address.length; i ++) {
            whitelist[_address[i]] = _quantity;
        }

        whitelistQuantity += (_address.length * _quantity);
    }

    function removeWhitelist(address _address) external onlyOwner {
        _removeWhitelist(_address);
    }

    function setContractURI(string memory _string) external onlyOwner {
        wholeContractURI = _string;
    }

    function setBaseProofURI(string memory _string) external onlyOwner {
        require(!isSaleLive());
        baseProofURI = _string;
    }

    function setBaseTokenURI(string memory _string) external onlyOwner {
        baseTokenURI = _string;
    }

    function setSaleStartTimestamp(uint256 _timestamp) external onlyOwner {
        require(!isSaleLive());
        saleStartTimestamp = _timestamp;
    }

    function setWhitelistEndTimestamp(uint256 _timestamp) external onlyOwner {
        whitelistEndTimestamp = _timestamp;
    }

    function setMintPrice(uint256 _price) external onlyOwner {
        mintPrice = _price;
    }

    function setRoyaltyAmount(uint256 _amount) external onlyOwner {
        royaltyAmount = _amount;
    }

    function setRoyaltyAddress(address _address) external onlyOwner {
        royaltyAddress = _address;
    }

    function withdraw(address _address) external onlyOwner {
        payable(_address).transfer(address(this).balance);
    }

    function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address, uint256) {
		return (royaltyAddress, (_salePrice * royaltyAmount) / 10000);
	}

    function contractURI() external view returns (string memory) {
        return wholeContractURI;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(OERC721R, ONFT721Core, IERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    function isSaleLive() public view returns (bool) {
        return saleStartTimestamp <= block.timestamp;
    }

    function proofURI(uint256 tokenId) public view returns (string memory) {
        return bytes(baseProofURI).length > 0 ? string(abi.encodePacked(baseProofURI, tokenId.toString())) : "";
    }

    function _removeWhitelist(address _address) internal {
        whitelistQuantity -= whitelist[_address];
        whitelist[_address] = 0;
    }

    function _debitFrom(address _from, uint16, bytes memory, uint _tokenId) internal virtual override {
        require(_isApprovedOrOwner(_msgSender(), _tokenId));
        require(OERC721R.ownerOf(_tokenId) == _from);
        _burn(_tokenId);
    }

    function _creditTo(uint16, address _toAddress, uint _tokenId) internal virtual override {
        _mint(_toAddress, _tokenId);
    }

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

    function _availableMint() internal view returns (uint256) {
        if (whitelistEndTimestamp > block.timestamp) {
            return maxMint() - whitelistQuantity;
        }

        return maxMint();
    }

}

File 2 of 20 : IERC2981.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IERC2981 is IERC165 {

    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
        
}

File 3 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 4 of 20 : OERC721R.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/**
 * @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. This does random batch minting.
 */
contract OERC721R is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // Random logic
    mapping(uint => uint) private _availableTokens;
    uint256 private _numAvailableTokens;
    uint256 immutable _maxSupply;

    // Omni logic
    uint256 immutable _offset;
    int256 private _flow;
    
    // 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_, uint offset_, uint maxSupply_) {
        _name = name_;
        _symbol = symbol_;
        _offset = offset_;
        _maxSupply = maxSupply_;
        _numAvailableTokens = maxSupply_;
    }
    
    /**
     * @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);
    }

    function maxMint() public view virtual returns (uint256) {
        return _maxSupply;
    }
    
    function totalMint() public view virtual returns (uint256) {
        return _maxSupply - _numAvailableTokens;
    }
    
    function totalSupply() public view virtual returns (uint256) {
        return uint256(int256(totalMint()) + _flow);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0));
        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));
        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));

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

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

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

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()));

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId));

        _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));
        _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));
    }

    /**
     * @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));
        address owner = OERC721R.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @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));
        require(!_exists(tokenId));

        _balances[to] += 1;
        _mintIdWithoutBalanceUpdate(to, tokenId);

        _flow ++;
    }

    /**
     * @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 = OERC721R.ownerOf(tokenId);

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

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

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

        _flow --;

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

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

    function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private {
        _beforeTokenTransfer(address(0), to, tokenId);
        
        _owners[tokenId] = to;
        
        emit Transfer(address(0), to, tokenId);
        
        _afterTokenTransfer(address(0), to, tokenId);
    }

    function _mintRandom(address to, uint _numToMint) internal virtual {
        require(_msgSender() == tx.origin);
        require(to != address(0));
        require(_numToMint > 0);
        
        uint updatedNumAvailableTokens = _numAvailableTokens;
        for (uint256 i; i < _numToMint; ++i) {
            uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
            
            _mintIdWithoutBalanceUpdate(to, tokenId + _offset);
            
            --updatedNumAvailableTokens;
        }
        
        _numAvailableTokens = updatedNumAvailableTokens;
        _balances[to] += _numToMint;
    }
        
    function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    to,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    blockhash(block.number - 1),
                    address(this),
                    updatedNumAvailableTokens
                )
            )
        );
        uint256 randomIndex = randomNum % updatedNumAvailableTokens;
        return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
    }

    // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2
    function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens)
        internal
        returns (uint256)
    {
        uint256 valAtIndex = _availableTokens[indexToUse];
        uint256 result;
        if (valAtIndex == 0) {
            // This means the index itself is still an available token
            result = indexToUse;
        } else {
            // This means the index itself is not an available token, but the val at that index is.
            result = valAtIndex;
        }

        uint256 lastIndex = updatedNumAvailableTokens - 1;
        if (indexToUse != lastIndex) {
            // Replace the value at indexToUse, now that it's been used.
            // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
            uint256 lastValInArray = _availableTokens[lastIndex];
            if (lastValInArray == 0) {
                // This means the index itself is still an available token
                _availableTokens[indexToUse] = lastIndex;
            } else {
                // This means the index itself is not an available token, but the val at that index is.
                _availableTokens[indexToUse] = lastValInArray;
                // Gas refund courtsey of @dievardump
                delete _availableTokens[lastIndex];
            }
        }
        
        return result;
    }

    /**
     * @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(OERC721R.ownerOf(tokenId) == from);
        require(to != address(0));

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

File 5 of 20 : ONFT721Core.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IONFT721Core.sol";
import "../../lzApp/NonblockingLzApp.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

abstract contract ONFT721Core is NonblockingLzApp, ERC165, IONFT721Core {
    constructor(address _lzEndpoint, uint256 _fee) NonblockingLzApp(_lzEndpoint, _fee) {}

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IONFT721Core).interfaceId || super.supportsInterface(interfaceId);
    }

    function estimateSendFee(uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, bool _useZro, bytes memory _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
        // mock the payload for send()
        bytes memory payload = abi.encode(_toAddress, _tokenId);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function sendFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _tokenId, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
        _debitFrom(_from, _dstChainId, _toAddress, _tokenId);

        bytes memory payload = abi.encode(_toAddress, _tokenId);
        _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams);

        uint64 nonce = lzEndpoint.getOutboundNonce(_dstChainId, address(this));
        emit SendToChain(_from, _dstChainId, _toAddress, _tokenId, nonce);
    }

    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
        // decode and load the toAddress
        (bytes memory toAddressBytes, uint tokenId) = abi.decode(_payload, (bytes, uint));
        address toAddress;
        assembly {
            toAddress := mload(add(toAddressBytes, 20))
        }

        _creditTo(_srcChainId, toAddress, tokenId);

        emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenId, _nonce);
    }

    function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId) internal virtual;

    function _creditTo(uint16 _srcChainId, address _toAddress, uint _tokenId) internal virtual;
}

File 6 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 7 of 20 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 8 of 20 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 20 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 10 of 20 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @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 11 of 20 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 20 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 13 of 20 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 14 of 20 : IONFT721Core.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/**
 * @dev Interface of the ONFT Core standard
 */
interface IONFT721Core is IERC165 {
    /**
     * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
     * _dstChainId - L0 defined chain id to send tokens too
     * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
     * _tokenId - token Id to transfer
     * _useZro - indicates to use zro to pay L0 fees
     * _adapterParams - flexible bytes array to indicate messaging adapter services in L0
     */
    function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    /**
     * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from`
     * `_toAddress` can be any size depending on the `dstChainId`.
     * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
     * `_adapterParams` is a flexible bytes array to indicate messaging adapter services
     */
    function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    /**
     * @dev Emitted when `_tokenId` are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
     * `_nonce` is the outbound nonce from
     */
    event SendToChain(address indexed _sender, uint16 indexed _dstChainId, bytes indexed _toAddress, uint _tokenId, uint64 _nonce);

    /**
     * @dev Emitted when `_tokenId` are sent from `_srcChainId` to the `_toAddress` at this chain. `_nonce` is the inbound nonce.
     */
    event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint _tokenId, uint64 _nonce);
}

File 15 of 20 : NonblockingLzApp.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./LzApp.sol";

/*
 * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
 * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
 * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
 */
abstract contract NonblockingLzApp is LzApp {
    constructor(address _endpoint, uint256 _fee) LzApp(_endpoint, _fee) {}

    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    // overriding the virtual function in LzReceiver
    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
        // try-catch all errors/exceptions
        try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual {
        // only internal transaction
        require(_msgSender() == address(this));
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    //@notice override this function
    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0));
        require(keccak256(_payload) == payloadHash);
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }
}

File 16 of 20 : LzApp.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/ILayerZeroReceiver.sol";
import "../interfaces/ILayerZeroUserApplicationConfig.sol";
import "../interfaces/ILayerZeroEndpoint.sol";

/*
 * a generic LzReceiver implementation
 */
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    uint256 private immutable fee;

    ILayerZeroEndpoint public immutable lzEndpoint;

    mapping(uint16 => bytes) public trustedRemoteLookup;

    constructor(address _endpoint, uint256 _fee) {
        lzEndpoint = ILayerZeroEndpoint(_endpoint);
        fee = _fee;
    }

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual override {
        // lzReceive must be called by the endpoint for security
        require(_msgSender() == address(lzEndpoint));

        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
        require(_srcAddress.length == trustedRemote.length && keccak256(_srcAddress) == keccak256(trustedRemote));

        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0);
        lzEndpoint.send{value: msg.value - fee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    //---------------------------UserApplication config----------------------------------------
    function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {
        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
    }

    // generic config for LayerZero user Application
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {
        lzEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    function setTrustedRemote(uint16[] calldata _srcChainId, bytes[] calldata _srcAddress) external onlyOwner {
        for (uint256 i = 0; i < _srcChainId.length; i ++) {
            trustedRemoteLookup[_srcChainId[i]] = _srcAddress[i];
        }
    }

    //--------------------------- VIEW FUNCTION ----------------------------------------

    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
        return keccak256(trustedSource) == keccak256(_srcAddress);
    }
}

File 17 of 20 : ILayerZeroReceiver.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}

File 18 of 20 : ILayerZeroUserApplicationConfig.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

File 19 of 20 : ILayerZeroEndpoint.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

import "./ILayerZeroUserApplicationConfig.sol";

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

File 20 of 20 : NFT.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "./IERC2981.sol";
import "./OERC721R.sol";
import "./layerzero/contracts/token/onft/ONFT721Core.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract NFT is Ownable, IERC2981, OERC721R, ONFT721Core {

    using Address for address;
    using Strings for uint256;

    uint256 public saleStartTimestamp = 1652817600;
    uint256 public whitelistEndTimestamp = 1652904000;

    uint256 public royaltyAmount = 1000;
    address public royaltyAddress;
    
    uint256 public mintPrice;

    string public baseProofURI;
    string public baseTokenURI;

    string private wholeContractURI;

    mapping(address => uint256) public whitelist;

    uint256 private whitelistQuantity;

    constructor(
        uint256 _mintPrice,
        uint256 _traverseFee,
        address _lzEndpoint,
        uint256 _offset,
        uint256 _supply
    )
        OERC721R(
            "Name", 
            "Symbol",
            _offset,
            _supply
        )
        ONFT721Core(
            _lzEndpoint, 
            _traverseFee
        )
    {
        mintPrice = _mintPrice;

        royaltyAddress = owner();
    }

    function claim(address _to) external {
        require(isSaleLive());

        uint256 _amount = whitelist[_msgSender()];
        require(_amount > 0);
        
        _removeWhitelist(_msgSender());

        _mintRandom(_to, _amount);
    }

    function mint(address _to, uint256 _amount) external payable {
        require(isSaleLive());
        require(msg.value == mintPrice * _amount);
        require(_amount <= 10);
        require(_amount + totalMint() <= _availableMint());

        _mintRandom(_to, _amount);
    }

    function addWhitelist(address[] memory _address, uint256 _quantity) external onlyOwner {
        for (uint256 i = 0; i < _address.length; i ++) {
            whitelist[_address[i]] = _quantity;
        }

        whitelistQuantity += (_address.length * _quantity);
    }

    function removeWhitelist(address _address) external onlyOwner {
        _removeWhitelist(_address);
    }

    function setContractURI(string memory _string) external onlyOwner {
        wholeContractURI = _string;
    }

    function setBaseProofURI(string memory _string) external onlyOwner {
        require(!isSaleLive());
        baseProofURI = _string;
    }

    function setBaseTokenURI(string memory _string) external onlyOwner {
        baseTokenURI = _string;
    }

    function setSaleStartTimestamp(uint256 _timestamp) external onlyOwner {
        require(!isSaleLive());
        saleStartTimestamp = _timestamp;
    }

    function setWhitelistEndTimestamp(uint256 _timestamp) external onlyOwner {
        whitelistEndTimestamp = _timestamp;
    }

    function setMintPrice(uint256 _price) external onlyOwner {
        mintPrice = _price;
    }

    function setRoyaltyAmount(uint256 _amount) external onlyOwner {
        royaltyAmount = _amount;
    }

    function setRoyaltyAddress(address _address) external onlyOwner {
        royaltyAddress = _address;
    }

    function withdraw(address _address) external onlyOwner {
        payable(_address).transfer(address(this).balance);
    }

    function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address, uint256) {
		return (royaltyAddress, (_salePrice * royaltyAmount) / 10000);
	}

    function contractURI() external view returns (string memory) {
        return wholeContractURI;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(OERC721R, ONFT721Core, IERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    function isSaleLive() public view returns (bool) {
        return saleStartTimestamp <= block.timestamp;
    }

    function proofURI(uint256 tokenId) public view returns (string memory) {
        return bytes(baseProofURI).length > 0 ? string(abi.encodePacked(baseProofURI, tokenId.toString())) : "";
    }

    function _removeWhitelist(address _address) internal {
        whitelistQuantity -= whitelist[_address];
        whitelist[_address] = 0;
    }

    function _debitFrom(address _from, uint16, bytes memory, uint _tokenId) internal virtual override {
        require(_isApprovedOrOwner(_msgSender(), _tokenId));
        require(OERC721R.ownerOf(_tokenId) == _from);
        _burn(_tokenId);
    }

    function _creditTo(uint16, address _toAddress, uint _tokenId) internal virtual override {
        _mint(_toAddress, _tokenId);
    }

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

    function _availableMint() internal view returns (uint256) {
        if (whitelistEndTimestamp > block.timestamp) {
            return maxMint() - whitelistQuantity;
        }

        return maxMint();
    }

}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_traverseFee","type":"uint256"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseProofURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"isSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"proofURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","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":"_string","type":"string"}],"name":"setBaseProofURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_string","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_string","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyaltyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_srcChainId","type":"uint16[]"},{"internalType":"bytes[]","name":"_srcAddress","type":"bytes[]"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setWhitelistEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","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":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052636283fec0600c556362855040600d556103e8600e553480156200002857600080fd5b50604051620065853803806200658583398181016040528101906200004e91906200041d565b82846040518060400160405280600881526020017f54696e79426f79730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54424f5900000000000000000000000000000000000000000000000000000000815250858585858181620000e2620000d6620001d360201b60201c565b620001db60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505080608081815250505050505083600390805190602001906200013a929190620002c8565b50826004908051906020019062000153929190620002c8565b508160e081815250508060c081815250508060068190555050505050505084601081905550620001886200029f60201b60201c565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506200050a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002d690620004d4565b90600052602060002090601f016020900481019282620002fa576000855562000346565b82601f106200031557805160ff191683800117855562000346565b8280016001018555821562000346579182015b828111156200034557825182559160200191906001019062000328565b5b50905062000355919062000359565b5090565b5b80821115620003745760008160009055506001016200035a565b5090565b600080fd5b6000819050919050565b62000392816200037d565b81146200039e57600080fd5b50565b600081519050620003b28162000387565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003e582620003b8565b9050919050565b620003f781620003d8565b81146200040357600080fd5b50565b6000815190506200041781620003ec565b92915050565b600080600080600060a086880312156200043c576200043b62000378565b5b60006200044c88828901620003a1565b95505060206200045f88828901620003a1565b9450506040620004728882890162000406565b93505060606200048588828901620003a1565b92505060806200049888828901620003a1565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004ed57607f821691505b60208210811415620005045762000503620004a5565b5b50919050565b60805160a05160c05160e051615ffb6200058a6000396000613120015260008181611d5701526120d1015260008181610e060152818161118f0152818161139a0152818161157e01528181611999015281816123ca0152818161259501528181612ae4015281816134ec0152613ca901526000613ce50152615ffb6000f3fe60806040526004361061038b5760003560e01c80636352211e116101dc578063ad2f852a11610102578063d49482e1116100a0578063f2fde38b1161006f578063f2fde38b14610d4a578063f4a0a52814610d73578063f5ecbdbc14610d9c578063f71143ca14610dd95761038b565b8063d49482e114610c8e578063d547cfb714610cb7578063e8a3d48514610ce2578063e985e9c514610d0d5761038b565b8063b88d4fde116100dc578063b88d4fde14610be3578063c87b56dd14610c0c578063cbed8b9c14610c49578063d1deba1f14610c725761038b565b8063ad2f852a14610b62578063b353aaa714610b8d578063b4e38ae114610bb85761038b565b80637533d7881161017a578063938e3d7b11610149578063938e3d7b14610aa857806395d89b4114610ad15780639b19251a14610afc578063a22cb46514610b395761038b565b80637533d788146109ec57806378c8cda714610a295780637c6e551d14610a525780638da5cb5b14610a7d5761038b565b80636817c76c116101b65780636817c76c1461094257806370a082311461096d578063715018a6146109aa5780637501f741146109c15761038b565b80636352211e146108b3578063645b6701146108f057806366ad5c8a146109195761038b565b80632a55205a116102c157806342d65a8d1161025f578063519056361161022e578063519056361461080657806351cff8d91461082257806359a7715a1461084b5780635b8c41e6146108765761038b565b806342d65a8d146107625780634a0c78b51461078b5780634db40561146107b45780634f07de09146107dd5761038b565b80633d8b38f61161029b5780633d8b38f6146106b75780633db82fb5146106f457806340c10f191461071d57806342842e0e146107395761038b565b80632a55205a1461062557806330176e13146106635780633c276d861461068c5761038b565b80630c2cd50c1161032e57806318160ddd1161030857806318160ddd1461056a5780631e83409a1461059557806323b872dd146105be5780632a205e3d146105e75761038b565b80630c2cd50c146104d957806310ddb13714610504578063125804d41461052d5761038b565b806306fdde031161036a57806306fdde031461041f57806307e0db171461044a578063081812fc14610473578063095ea7b3146104b05761038b565b80621d35671461039057806301ffc9a7146103b957806306d254da146103f6575b600080fd5b34801561039c57600080fd5b506103b760048036038101906103b2919061452c565b610e04565b005b3480156103c557600080fd5b506103e060048036038101906103db9190614623565b610f45565b6040516103ed919061466b565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906146e4565b610fbf565b005b34801561042b57600080fd5b5061043461107f565b6040516104419190614799565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c91906147bb565b611111565b005b34801561047f57600080fd5b5061049a6004803603810190610495919061481e565b61121b565b6040516104a7919061485a565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190614875565b61126a565b005b3480156104e557600080fd5b506104ee611316565b6040516104fb91906148c4565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906147bb565b61131c565b005b34801561053957600080fd5b50610554600480360381019061054f919061481e565b611426565b6040516105619190614799565b60405180910390f35b34801561057657600080fd5b5061057f611486565b60405161058c91906148c4565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b791906146e4565b6114a2565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906148df565b611529565b005b3480156105f357600080fd5b5061060e6004803603810190610609919061495e565b611553565b60405161061c929190614a11565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190614a3a565b61163b565b60405161065a929190614a7a565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614b44565b611687565b005b34801561069857600080fd5b506106a161171d565b6040516106ae91906148c4565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190614bed565b611723565b6040516106eb919061466b565b60405180910390f35b34801561070057600080fd5b5061071b6004803603810190610716919061481e565b6117f7565b005b61073760048036038101906107329190614875565b61188f565b005b34801561074557600080fd5b50610760600480360381019061075b91906148df565b6118fb565b005b34801561076e57600080fd5b5061078960048036038101906107849190614bed565b61191b565b005b34801561079757600080fd5b506107b260048036038101906107ad9190614cf9565b611a2b565b005b3480156107c057600080fd5b506107db60048036038101906107d69190614b44565b611b44565b005b3480156107e957600080fd5b5061080460048036038101906107ff919061481e565b611bec565b005b610820600480360381019061081b9190614db8565b611c72565b005b34801561082e57600080fd5b50610849600480360381019061084491906146e4565b611c8a565b005b34801561085757600080fd5b50610860611d50565b60405161086d91906148c4565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614e92565b611d85565b6040516108aa9190614f1a565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d5919061481e565b611dcd565b6040516108e7919061485a565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190614ff8565b611e49565b005b34801561092557600080fd5b50610940600480360381019061093b919061452c565b611f6c565b005b34801561094e57600080fd5b50610957611fbd565b60405161096491906148c4565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f91906146e4565b611fc3565b6040516109a191906148c4565b60405180910390f35b3480156109b657600080fd5b506109bf612045565b005b3480156109cd57600080fd5b506109d66120cd565b6040516109e391906148c4565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e91906147bb565b6120f5565b604051610a2091906150a9565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906146e4565b612195565b005b348015610a5e57600080fd5b50610a6761221d565b604051610a7491906148c4565b60405180910390f35b348015610a8957600080fd5b50610a92612223565b604051610a9f919061485a565b60405180910390f35b348015610ab457600080fd5b50610acf6004803603810190610aca9190614b44565b61224c565b005b348015610add57600080fd5b50610ae66122e2565b604051610af39190614799565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e91906146e4565b612374565b604051610b3091906148c4565b60405180910390f35b348015610b4557600080fd5b50610b606004803603810190610b5b91906150cb565b61238c565b005b348015610b6e57600080fd5b50610b776123a2565b604051610b84919061485a565b60405180910390f35b348015610b9957600080fd5b50610ba26123c8565b604051610baf919061516a565b60405180910390f35b348015610bc457600080fd5b50610bcd6123ec565b604051610bda9190614799565b60405180910390f35b348015610bef57600080fd5b50610c0a6004803603810190610c059190615185565b61247a565b005b348015610c1857600080fd5b50610c336004803603810190610c2e919061481e565b6124a6565b604051610c409190614799565b60405180910390f35b348015610c5557600080fd5b50610c706004803603810190610c6b9190615208565b612517565b005b610c8c6004803603810190610c87919061452c565b61262d565b005b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061481e565b612728565b005b348015610cc357600080fd5b50610ccc6127ae565b604051610cd99190614799565b60405180910390f35b348015610cee57600080fd5b50610cf761283c565b604051610d049190614799565b60405180910390f35b348015610d1957600080fd5b50610d346004803603810190610d2f9190615290565b6128ce565b604051610d41919061466b565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c91906146e4565b612962565b005b348015610d7f57600080fd5b50610d9a6004803603810190610d95919061481e565b612a5a565b005b348015610da857600080fd5b50610dc36004803603810190610dbe91906152d0565b612ae0565b604051610dd091906150a9565b60405180910390f35b348015610de557600080fd5b50610dee612ba0565b604051610dfb919061466b565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610e43612bad565b73ffffffffffffffffffffffffffffffffffffffff1614610e6357600080fd5b6000600160008661ffff1661ffff1681526020019081526020016000208054610e8b90615366565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb790615366565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b5050505050905080518451148015610f29575080805190602001208480519060200120145b610f3257600080fd5b610f3e85858585612bb5565b5050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fb85750610fb782612cd4565b5b9050919050565b610fc7612bad565b73ffffffffffffffffffffffffffffffffffffffff16610fe5612223565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611032906153e4565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606003805461108e90615366565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90615366565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905090565b611119612bad565b73ffffffffffffffffffffffffffffffffffffffff16611137612223565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906153e4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b81526004016111e69190615413565b600060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b5050505050565b600061122682612d4e565b61122f57600080fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061127582611dcd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166112cf612bad565b73ffffffffffffffffffffffffffffffffffffffff1614806112fe57506112fd816112f8612bad565b6128ce565b5b61130757600080fd5b6113118383612dba565b505050565b600d5481565b611324612bad565b73ffffffffffffffffffffffffffffffffffffffff16611342612223565b73ffffffffffffffffffffffffffffffffffffffff1614611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906153e4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b81526004016113f19190615413565b600060405180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b5050505050565b606060006011805461143790615366565b905011611453576040518060200160405280600081525061147f565b601161145e83612e73565b60405160200161146f9291906154fe565b6040516020818303038152906040525b9050919050565b6000600754611493611d50565b61149d919061555b565b905090565b6114aa612ba0565b6114b357600080fd5b6000601460006114c1612bad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161150b57600080fd5b61151b611516612bad565b612fd4565b6115258282613074565b5050565b61153a611534612bad565b826131d0565b61154357600080fd5b61154e838383613278565b505050565b6000806000868660405160200161156b9291906155ef565b60405160208183030381529060405290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308489896040518663ffffffff1660e01b81526004016115dd95949392919061561f565b604080518083038186803b1580156115f457600080fd5b505afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190615695565b92509250509550959350505050565b600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600e548561167291906156d5565b61167c919061575e565b915091509250929050565b61168f612bad565b73ffffffffffffffffffffffffffffffffffffffff166116ad612223565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906153e4565b60405180910390fd5b806012908051906020019061171992919061422f565b5050565b600c5481565b600080600160008661ffff1661ffff168152602001908152602001600020805461174c90615366565b80601f016020809104026020016040519081016040528092919081815260200182805461177890615366565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905083836040516117dc9291906157bf565b60405180910390208180519060200120149150509392505050565b6117ff612bad565b73ffffffffffffffffffffffffffffffffffffffff1661181d612223565b73ffffffffffffffffffffffffffffffffffffffff1614611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a906153e4565b60405180910390fd5b61187b612ba0565b1561188557600080fd5b80600c8190555050565b611897612ba0565b6118a057600080fd5b806010546118ae91906156d5565b34146118b957600080fd5b600a8111156118c757600080fd5b6118cf613473565b6118d7611d50565b826118e291906157d8565b11156118ed57600080fd5b6118f78282613074565b5050565b6119168383836040518060200160405280600081525061247a565b505050565b611923612bad565b73ffffffffffffffffffffffffffffffffffffffff16611941612223565b73ffffffffffffffffffffffffffffffffffffffff1614611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906153e4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016119f49392919061585b565b600060405180830381600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b50505050505050565b611a33612bad565b73ffffffffffffffffffffffffffffffffffffffff16611a51612223565b73ffffffffffffffffffffffffffffffffffffffff1614611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e906153e4565b60405180910390fd5b60005b84849050811015611b3d57828282818110611ac857611ac761588d565b5b9050602002810190611ada91906158cb565b60016000888886818110611af157611af061588d565b5b9050602002016020810190611b0691906147bb565b61ffff1661ffff1681526020019081526020016000209190611b299291906142b5565b508080611b359061592e565b915050611aaa565b5050505050565b611b4c612bad565b73ffffffffffffffffffffffffffffffffffffffff16611b6a612223565b73ffffffffffffffffffffffffffffffffffffffff1614611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906153e4565b60405180910390fd5b611bc8612ba0565b15611bd257600080fd5b8060119080519060200190611be892919061422f565b5050565b611bf4612bad565b73ffffffffffffffffffffffffffffffffffffffff16611c12612223565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f906153e4565b60405180910390fd5b80600e8190555050565b611c81878787878787876134a9565b50505050505050565b611c92612bad565b73ffffffffffffffffffffffffffffffffffffffff16611cb0612223565b73ffffffffffffffffffffffffffffffffffffffff1614611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906153e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d4c573d6000803e3d6000fd5b5050565b60006006547f0000000000000000000000000000000000000000000000000000000000000000611d809190615977565b905090565b60026020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4057600080fd5b80915050919050565b611e51612bad565b73ffffffffffffffffffffffffffffffffffffffff16611e6f612223565b73ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906153e4565b60405180910390fd5b60005b8251811015611f42578160146000858481518110611ee957611ee861588d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611f3a9061592e565b915050611ec8565b50808251611f5091906156d5565b60156000828254611f6191906157d8565b925050819055505050565b3073ffffffffffffffffffffffffffffffffffffffff16611f8b612bad565b73ffffffffffffffffffffffffffffffffffffffff1614611fab57600080fd5b611fb78484848461360d565b50505050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffe57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61204d612bad565b73ffffffffffffffffffffffffffffffffffffffff1661206b612223565b73ffffffffffffffffffffffffffffffffffffffff16146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906153e4565b60405180910390fd5b6120cb60006136b0565b565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6001602052806000526040600020600091509050805461211490615366565b80601f016020809104026020016040519081016040528092919081815260200182805461214090615366565b801561218d5780601f106121625761010080835404028352916020019161218d565b820191906000526020600020905b81548152906001019060200180831161217057829003601f168201915b505050505081565b61219d612bad565b73ffffffffffffffffffffffffffffffffffffffff166121bb612223565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612208906153e4565b60405180910390fd5b61221a81612fd4565b50565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612254612bad565b73ffffffffffffffffffffffffffffffffffffffff16612272612223565b73ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf906153e4565b60405180910390fd5b80601390805190602001906122de92919061422f565b5050565b6060600480546122f190615366565b80601f016020809104026020016040519081016040528092919081815260200182805461231d90615366565b801561236a5780601f1061233f5761010080835404028352916020019161236a565b820191906000526020600020905b81548152906001019060200180831161234d57829003601f168201915b5050505050905090565b60146020528060005260406000206000915090505481565b61239e612397612bad565b8383613774565b5050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b601180546123f990615366565b80601f016020809104026020016040519081016040528092919081815260200182805461242590615366565b80156124725780601f1061244757610100808354040283529160200191612472565b820191906000526020600020905b81548152906001019060200180831161245557829003601f168201915b505050505081565b61248b612485612bad565b836131d0565b61249457600080fd5b6124a0848484846138ab565b50505050565b60606124b182612d4e565b6124ba57600080fd5b60006124c46138d1565b905060008151116124e4576040518060200160405280600081525061250f565b806124ee84612e73565b6040516020016124ff9291906159ab565b6040516020818303038152906040525b915050919050565b61251f612bad565b73ffffffffffffffffffffffffffffffffffffffff1661253d612223565b73ffffffffffffffffffffffffffffffffffffffff1614612593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258a906153e4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016125f49594939291906159cf565b600060405180830381600087803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505050505050565b6000600260008661ffff1661ffff168152602001908152602001600020846040516126589190615a4e565b908152602001604051809103902060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b81141561269e57600080fd5b808280519060200120146126b157600080fd5b6000801b600260008761ffff1661ffff168152602001908152602001600020856040516126de9190615a4e565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506127218585858561360d565b5050505050565b612730612bad565b73ffffffffffffffffffffffffffffffffffffffff1661274e612223565b73ffffffffffffffffffffffffffffffffffffffff16146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b906153e4565b60405180910390fd5b80600d8190555050565b601280546127bb90615366565b80601f01602080910402602001604051908101604052809291908181526020018280546127e790615366565b80156128345780601f1061280957610100808354040283529160200191612834565b820191906000526020600020905b81548152906001019060200180831161281757829003601f168201915b505050505081565b60606013805461284b90615366565b80601f016020809104026020016040519081016040528092919081815260200182805461287790615366565b80156128c45780601f10612899576101008083540402835291602001916128c4565b820191906000526020600020905b8154815290600101906020018083116128a757829003601f168201915b5050505050905090565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61296a612bad565b73ffffffffffffffffffffffffffffffffffffffff16612988612223565b73ffffffffffffffffffffffffffffffffffffffff16146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d5906153e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590615ad7565b60405180910390fd5b612a57816136b0565b50565b612a62612bad565b73ffffffffffffffffffffffffffffffffffffffff16612a80612223565b73ffffffffffffffffffffffffffffffffffffffff1614612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd906153e4565b60405180910390fd5b8060108190555050565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401612b419493929190615af7565b60006040518083038186803b158015612b5957600080fd5b505afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612b969190615bac565b9050949350505050565b600042600c541115905090565b600033905090565b3073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a858585856040518563ffffffff1660e01b8152600401612bf49493929190615c04565b600060405180830381600087803b158015612c0e57600080fd5b505af1925050508015612c1f575060015b612ccd578080519060200120600260008661ffff1661ffff16815260200190815260200160002084604051612c549190615a4e565b908152602001604051809103902060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051612cc09493929190615c04565b60405180910390a1612cce565b5b50505050565b60007f7bb0080b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d475750612d4682613963565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e2d83611dcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000821415612ebb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fcf565b600082905060005b60008214612eed578080612ed69061592e565b915050600a82612ee6919061575e565b9150612ec3565b60008167ffffffffffffffff811115612f0957612f086143c1565b5b6040519080825280601f01601f191660200182016040528015612f3b5781602001600182028036833780820191505090505b5090505b60008514612fc857600182612f549190615977565b9150600a85612f639190615c57565b6030612f6f91906157d8565b60f81b818381518110612f8557612f8461588d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fc1919061575e565b9450612f3f565b8093505050505b919050565b601460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601560008282546130259190615977565b925050819055506000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b3273ffffffffffffffffffffffffffffffffffffffff16613093612bad565b73ffffffffffffffffffffffffffffffffffffffff16146130b357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ed57600080fd5b600081116130fa57600080fd5b6000600654905060005b8281101561316d5760006131188584613a45565b905061314f857f00000000000000000000000000000000000000000000000000000000000000008361314a91906157d8565b613ab3565b8261315990615c88565b925050806131669061592e565b9050613104565b508060068190555081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c491906157d8565b92505081905550505050565b60006131db82612d4e565b6131e457600080fd5b60006131ef83611dcd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325e57508373ffffffffffffffffffffffffffffffffffffffff166132468461121b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061326f575061326e81856128ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661329882611dcd565b73ffffffffffffffffffffffffffffffffffffffff16146132b857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132f257600080fd5b6132fd838383613b7d565b613308600082612dba565b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133589190615977565b925050819055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133af91906157d8565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461346e838383613b82565b505050565b600042600d54111561349b5760155461348a6120cd565b6134949190615977565b90506134a6565b6134a36120cd565b90505b90565b6134b587878787613b87565b600085856040516020016134ca9291906155ef565b60405160208183030381529060405290506134e88782868686613bf0565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637a14574889306040518363ffffffff1660e01b8152600401613545929190615cb2565b60206040518083038186803b15801561355d57600080fd5b505afa158015613571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135959190615cf0565b9050866040516135a59190615a4e565b60405180910390208861ffff168a73ffffffffffffffffffffffffffffffffffffffff167f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce154389856040516135fa929190615d1d565b60405180910390a4505050505050505050565b600080828060200190518101906136249190615d46565b9150915060006014830151905061363c878284613d70565b8073ffffffffffffffffffffffffffffffffffffffff16866040516136619190615a4e565b60405180910390208861ffff167f64e10c37f404d128982dce114f5d233c14c5c7f6d8db93099e3d99dacb9e27ba858960405161369f929190615d1d565b60405180910390a450505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137ad57600080fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161389e919061466b565b60405180910390a3505050565b6138b6848484613278565b6138c284848484613d7f565b6138cb57600080fd5b50505050565b6060601280546138e090615366565b80601f016020809104026020016040519081016040528092919081815260200182805461390c90615366565b80156139595780601f1061392e57610100808354040283529160200191613959565b820191906000526020600020905b81548152906001019060200180831161393c57829003601f168201915b5050505050905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613a3e5750613a3d82613ee0565b5b9050919050565b600080833a434244600143613a5a9190615977565b403089604051602001613a74989796959493929190615da2565b6040516020818303038152906040528051906020012060001c905060008382613a9d9190615c57565b9050613aa98185613f4a565b9250505092915050565b613abf60008383613b7d565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b7960008383613b82565b5050565b505050565b505050565b613b98613b92612bad565b826131d0565b613ba157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff16613bc182611dcd565b73ffffffffffffffffffffffffffffffffffffffff1614613be157600080fd5b613bea8161400d565b50505050565b6000600160008761ffff1661ffff1681526020019081526020016000208054613c1890615366565b80601f0160208091040260200160405190810160405280929190818152602001828054613c4490615366565b8015613c915780601f10613c6657610100808354040283529160200191613c91565b820191906000526020600020905b815481529060010190602001808311613c7457829003601f168201915b50505050509050600081511415613ca757600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031007f000000000000000000000000000000000000000000000000000000000000000034613d0f9190615977565b8884898989896040518863ffffffff1660e01b8152600401613d3696959493929190615e2f565b6000604051808303818588803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b5050505050505050505050565b613d7a8282614142565b505050565b6000613da08473ffffffffffffffffffffffffffffffffffffffff1661420c565b15613ed3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613dc9612bad565b8786866040518563ffffffff1660e01b8152600401613deb9493929190615ea5565b602060405180830381600087803b158015613e0557600080fd5b505af1925050508015613e3657506040513d601f19601f82011682018060405250810190613e339190615f06565b60015b613e83573d8060008114613e66576040519150601f19603f3d011682016040523d82523d6000602084013e613e6b565b606091505b50600081511415613e7b57600080fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ed8565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060056000858152602001908152602001600020549050600080821415613f7557849050613f79565b8190505b6000600185613f889190615977565b9050808614614001576000600560008381526020019081526020016000205490506000811415613fcf57816005600089815260200190815260200160002081905550613fff565b80600560008981526020019081526020016000208190555060056000838152602001908152602001600020600090555b505b81935050505092915050565b600061401882611dcd565b905061402681600084613b7d565b614031600083612dba565b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546140819190615977565b925050819055506008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008154809291906140d190615f33565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461413e81600084613b82565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561417c57600080fd5b61418581612d4e565b1561418f57600080fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141df91906157d8565b925050819055506141f08282613ab3565b6007600081548092919061420390615f7c565b91905055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461423b90615366565b90600052602060002090601f01602090048101928261425d57600085556142a4565b82601f1061427657805160ff19168380011785556142a4565b828001600101855582156142a4579182015b828111156142a3578251825591602001919060010190614288565b5b5090506142b1919061433b565b5090565b8280546142c190615366565b90600052602060002090601f0160209004810192826142e3576000855561432a565b82601f106142fc57803560ff191683800117855561432a565b8280016001018555821561432a579182015b8281111561432957823582559160200191906001019061430e565b5b509050614337919061433b565b5090565b5b8082111561435457600081600090555060010161433c565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6143838161436c565b811461438e57600080fd5b50565b6000813590506143a08161437a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143f9826143b0565b810181811067ffffffffffffffff82111715614418576144176143c1565b5b80604052505050565b600061442b614358565b905061443782826143f0565b919050565b600067ffffffffffffffff821115614457576144566143c1565b5b614460826143b0565b9050602081019050919050565b82818337600083830152505050565b600061448f61448a8461443c565b614421565b9050828152602081018484840111156144ab576144aa6143ab565b5b6144b684828561446d565b509392505050565b600082601f8301126144d3576144d26143a6565b5b81356144e384826020860161447c565b91505092915050565b600067ffffffffffffffff82169050919050565b614509816144ec565b811461451457600080fd5b50565b60008135905061452681614500565b92915050565b6000806000806080858703121561454657614545614362565b5b600061455487828801614391565b945050602085013567ffffffffffffffff81111561457557614574614367565b5b614581878288016144be565b935050604061459287828801614517565b925050606085013567ffffffffffffffff8111156145b3576145b2614367565b5b6145bf878288016144be565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614600816145cb565b811461460b57600080fd5b50565b60008135905061461d816145f7565b92915050565b60006020828403121561463957614638614362565b5b60006146478482850161460e565b91505092915050565b60008115159050919050565b61466581614650565b82525050565b6000602082019050614680600083018461465c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146b182614686565b9050919050565b6146c1816146a6565b81146146cc57600080fd5b50565b6000813590506146de816146b8565b92915050565b6000602082840312156146fa576146f9614362565b5b6000614708848285016146cf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561474b578082015181840152602081019050614730565b8381111561475a576000848401525b50505050565b600061476b82614711565b614775818561471c565b935061478581856020860161472d565b61478e816143b0565b840191505092915050565b600060208201905081810360008301526147b38184614760565b905092915050565b6000602082840312156147d1576147d0614362565b5b60006147df84828501614391565b91505092915050565b6000819050919050565b6147fb816147e8565b811461480657600080fd5b50565b600081359050614818816147f2565b92915050565b60006020828403121561483457614833614362565b5b600061484284828501614809565b91505092915050565b614854816146a6565b82525050565b600060208201905061486f600083018461484b565b92915050565b6000806040838503121561488c5761488b614362565b5b600061489a858286016146cf565b92505060206148ab85828601614809565b9150509250929050565b6148be816147e8565b82525050565b60006020820190506148d960008301846148b5565b92915050565b6000806000606084860312156148f8576148f7614362565b5b6000614906868287016146cf565b9350506020614917868287016146cf565b925050604061492886828701614809565b9150509250925092565b61493b81614650565b811461494657600080fd5b50565b60008135905061495881614932565b92915050565b600080600080600060a0868803121561497a57614979614362565b5b600061498888828901614391565b955050602086013567ffffffffffffffff8111156149a9576149a8614367565b5b6149b5888289016144be565b94505060406149c688828901614809565b93505060606149d788828901614949565b925050608086013567ffffffffffffffff8111156149f8576149f7614367565b5b614a04888289016144be565b9150509295509295909350565b6000604082019050614a2660008301856148b5565b614a3360208301846148b5565b9392505050565b60008060408385031215614a5157614a50614362565b5b6000614a5f85828601614809565b9250506020614a7085828601614809565b9150509250929050565b6000604082019050614a8f600083018561484b565b614a9c60208301846148b5565b9392505050565b600067ffffffffffffffff821115614abe57614abd6143c1565b5b614ac7826143b0565b9050602081019050919050565b6000614ae7614ae284614aa3565b614421565b905082815260208101848484011115614b0357614b026143ab565b5b614b0e84828561446d565b509392505050565b600082601f830112614b2b57614b2a6143a6565b5b8135614b3b848260208601614ad4565b91505092915050565b600060208284031215614b5a57614b59614362565b5b600082013567ffffffffffffffff811115614b7857614b77614367565b5b614b8484828501614b16565b91505092915050565b600080fd5b600080fd5b60008083601f840112614bad57614bac6143a6565b5b8235905067ffffffffffffffff811115614bca57614bc9614b8d565b5b602083019150836001820283011115614be657614be5614b92565b5b9250929050565b600080600060408486031215614c0657614c05614362565b5b6000614c1486828701614391565b935050602084013567ffffffffffffffff811115614c3557614c34614367565b5b614c4186828701614b97565b92509250509250925092565b60008083601f840112614c6357614c626143a6565b5b8235905067ffffffffffffffff811115614c8057614c7f614b8d565b5b602083019150836020820283011115614c9c57614c9b614b92565b5b9250929050565b60008083601f840112614cb957614cb86143a6565b5b8235905067ffffffffffffffff811115614cd657614cd5614b8d565b5b602083019150836020820283011115614cf257614cf1614b92565b5b9250929050565b60008060008060408587031215614d1357614d12614362565b5b600085013567ffffffffffffffff811115614d3157614d30614367565b5b614d3d87828801614c4d565b9450945050602085013567ffffffffffffffff811115614d6057614d5f614367565b5b614d6c87828801614ca3565b925092505092959194509250565b6000614d8582614686565b9050919050565b614d9581614d7a565b8114614da057600080fd5b50565b600081359050614db281614d8c565b92915050565b600080600080600080600060e0888a031215614dd757614dd6614362565b5b6000614de58a828b016146cf565b9750506020614df68a828b01614391565b965050604088013567ffffffffffffffff811115614e1757614e16614367565b5b614e238a828b016144be565b9550506060614e348a828b01614809565b9450506080614e458a828b01614da3565b93505060a0614e568a828b016146cf565b92505060c088013567ffffffffffffffff811115614e7757614e76614367565b5b614e838a828b016144be565b91505092959891949750929550565b600080600060608486031215614eab57614eaa614362565b5b6000614eb986828701614391565b935050602084013567ffffffffffffffff811115614eda57614ed9614367565b5b614ee6868287016144be565b9250506040614ef786828701614517565b9150509250925092565b6000819050919050565b614f1481614f01565b82525050565b6000602082019050614f2f6000830184614f0b565b92915050565b600067ffffffffffffffff821115614f5057614f4f6143c1565b5b602082029050602081019050919050565b6000614f74614f6f84614f35565b614421565b90508083825260208201905060208402830185811115614f9757614f96614b92565b5b835b81811015614fc05780614fac88826146cf565b845260208401935050602081019050614f99565b5050509392505050565b600082601f830112614fdf57614fde6143a6565b5b8135614fef848260208601614f61565b91505092915050565b6000806040838503121561500f5761500e614362565b5b600083013567ffffffffffffffff81111561502d5761502c614367565b5b61503985828601614fca565b925050602061504a85828601614809565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061507b82615054565b615085818561505f565b935061509581856020860161472d565b61509e816143b0565b840191505092915050565b600060208201905081810360008301526150c38184615070565b905092915050565b600080604083850312156150e2576150e1614362565b5b60006150f0858286016146cf565b925050602061510185828601614949565b9150509250929050565b6000819050919050565b600061513061512b61512684614686565b61510b565b614686565b9050919050565b600061514282615115565b9050919050565b600061515482615137565b9050919050565b61516481615149565b82525050565b600060208201905061517f600083018461515b565b92915050565b6000806000806080858703121561519f5761519e614362565b5b60006151ad878288016146cf565b94505060206151be878288016146cf565b93505060406151cf87828801614809565b925050606085013567ffffffffffffffff8111156151f0576151ef614367565b5b6151fc878288016144be565b91505092959194509250565b60008060008060006080868803121561522457615223614362565b5b600061523288828901614391565b955050602061524388828901614391565b945050604061525488828901614809565b935050606086013567ffffffffffffffff81111561527557615274614367565b5b61528188828901614b97565b92509250509295509295909350565b600080604083850312156152a7576152a6614362565b5b60006152b5858286016146cf565b92505060206152c6858286016146cf565b9150509250929050565b600080600080608085870312156152ea576152e9614362565b5b60006152f887828801614391565b945050602061530987828801614391565b935050604061531a878288016146cf565b925050606061532b87828801614809565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061537e57607f821691505b6020821081141561539257615391615337565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153ce60208361471c565b91506153d982615398565b602082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b61540d8161436c565b82525050565b60006020820190506154286000830184615404565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461545b81615366565b615465818661542e565b945060018216600081146154805760018114615491576154c4565b60ff198316865281860193506154c4565b61549a85615439565b60005b838110156154bc5781548189015260018201915060208101905061549d565b838801955050505b50505092915050565b60006154d882614711565b6154e2818561542e565b93506154f281856020860161472d565b80840191505092915050565b600061550a828561544e565b915061551682846154cd565b91508190509392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061556682615522565b915061557183615522565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156155ac576155ab61552c565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156155e4576155e361552c565b5b828201905092915050565b600060408201905081810360008301526156098185615070565b905061561860208301846148b5565b9392505050565b600060a0820190506156346000830188615404565b615641602083018761484b565b81810360408301526156538186615070565b9050615662606083018561465c565b81810360808301526156748184615070565b90509695505050505050565b60008151905061568f816147f2565b92915050565b600080604083850312156156ac576156ab614362565b5b60006156ba85828601615680565b92505060206156cb85828601615680565b9150509250929050565b60006156e0826147e8565b91506156eb836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157245761572361552c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615769826147e8565b9150615774836147e8565b9250826157845761578361572f565b5b828204905092915050565b600081905092915050565b60006157a6838561578f565b93506157b383858461446d565b82840190509392505050565b60006157cc82848661579a565b91508190509392505050565b60006157e3826147e8565b91506157ee836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158235761582261552c565b5b828201905092915050565b600061583a838561505f565b935061584783858461446d565b615850836143b0565b840190509392505050565b60006040820190506158706000830186615404565b818103602083015261588381848661582e565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126158e8576158e76158bc565b5b80840192508235915067ffffffffffffffff82111561590a576159096158c1565b5b602083019250600182023603831315615926576159256158c6565b5b509250929050565b6000615939826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561596c5761596b61552c565b5b600182019050919050565b6000615982826147e8565b915061598d836147e8565b9250828210156159a05761599f61552c565b5b828203905092915050565b60006159b782856154cd565b91506159c382846154cd565b91508190509392505050565b60006080820190506159e46000830188615404565b6159f16020830187615404565b6159fe60408301866148b5565b8181036060830152615a1181848661582e565b90509695505050505050565b6000615a2882615054565b615a32818561578f565b9350615a4281856020860161472d565b80840191505092915050565b6000615a5a8284615a1d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615ac160268361471c565b9150615acc82615a65565b604082019050919050565b60006020820190508181036000830152615af081615ab4565b9050919050565b6000608082019050615b0c6000830187615404565b615b196020830186615404565b615b26604083018561484b565b615b3360608301846148b5565b95945050505050565b6000615b4f615b4a8461443c565b614421565b905082815260208101848484011115615b6b57615b6a6143ab565b5b615b7684828561472d565b509392505050565b600082601f830112615b9357615b926143a6565b5b8151615ba3848260208601615b3c565b91505092915050565b600060208284031215615bc257615bc1614362565b5b600082015167ffffffffffffffff811115615be057615bdf614367565b5b615bec84828501615b7e565b91505092915050565b615bfe816144ec565b82525050565b6000608082019050615c196000830187615404565b8181036020830152615c2b8186615070565b9050615c3a6040830185615bf5565b8181036060830152615c4c8184615070565b905095945050505050565b6000615c62826147e8565b9150615c6d836147e8565b925082615c7d57615c7c61572f565b5b828206905092915050565b6000615c93826147e8565b91506000821415615ca757615ca661552c565b5b600182039050919050565b6000604082019050615cc76000830185615404565b615cd4602083018461484b565b9392505050565b600081519050615cea81614500565b92915050565b600060208284031215615d0657615d05614362565b5b6000615d1484828501615cdb565b91505092915050565b6000604082019050615d3260008301856148b5565b615d3f6020830184615bf5565b9392505050565b60008060408385031215615d5d57615d5c614362565b5b600083015167ffffffffffffffff811115615d7b57615d7a614367565b5b615d8785828601615b7e565b9250506020615d9885828601615680565b9150509250929050565b600061010082019050615db8600083018b61484b565b615dc5602083018a6148b5565b615dd260408301896148b5565b615ddf60608301886148b5565b615dec60808301876148b5565b615df960a0830186614f0b565b615e0660c083018561484b565b615e1360e08301846148b5565b9998505050505050505050565b615e2981614d7a565b82525050565b600060c082019050615e446000830189615404565b8181036020830152615e568188615070565b90508181036040830152615e6a8187615070565b9050615e796060830186615e20565b615e86608083018561484b565b81810360a0830152615e988184615070565b9050979650505050505050565b6000608082019050615eba600083018761484b565b615ec7602083018661484b565b615ed460408301856148b5565b8181036060830152615ee68184615070565b905095945050505050565b600081519050615f00816145f7565b92915050565b600060208284031215615f1c57615f1b614362565b5b6000615f2a84828501615ef1565b91505092915050565b6000615f3e82615522565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615f7157615f7061552c565b5b600182039050919050565b6000615f8782615522565b91507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615fba57615fb961552c565b5b60018201905091905056fea2646970667358221220465ae67298535ba81083378fd3c590767c4c1d8b44ebbd85e6f9556e058d30c464736f6c634300080900330000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000514

Deployed Bytecode

0x60806040526004361061038b5760003560e01c80636352211e116101dc578063ad2f852a11610102578063d49482e1116100a0578063f2fde38b1161006f578063f2fde38b14610d4a578063f4a0a52814610d73578063f5ecbdbc14610d9c578063f71143ca14610dd95761038b565b8063d49482e114610c8e578063d547cfb714610cb7578063e8a3d48514610ce2578063e985e9c514610d0d5761038b565b8063b88d4fde116100dc578063b88d4fde14610be3578063c87b56dd14610c0c578063cbed8b9c14610c49578063d1deba1f14610c725761038b565b8063ad2f852a14610b62578063b353aaa714610b8d578063b4e38ae114610bb85761038b565b80637533d7881161017a578063938e3d7b11610149578063938e3d7b14610aa857806395d89b4114610ad15780639b19251a14610afc578063a22cb46514610b395761038b565b80637533d788146109ec57806378c8cda714610a295780637c6e551d14610a525780638da5cb5b14610a7d5761038b565b80636817c76c116101b65780636817c76c1461094257806370a082311461096d578063715018a6146109aa5780637501f741146109c15761038b565b80636352211e146108b3578063645b6701146108f057806366ad5c8a146109195761038b565b80632a55205a116102c157806342d65a8d1161025f578063519056361161022e578063519056361461080657806351cff8d91461082257806359a7715a1461084b5780635b8c41e6146108765761038b565b806342d65a8d146107625780634a0c78b51461078b5780634db40561146107b45780634f07de09146107dd5761038b565b80633d8b38f61161029b5780633d8b38f6146106b75780633db82fb5146106f457806340c10f191461071d57806342842e0e146107395761038b565b80632a55205a1461062557806330176e13146106635780633c276d861461068c5761038b565b80630c2cd50c1161032e57806318160ddd1161030857806318160ddd1461056a5780631e83409a1461059557806323b872dd146105be5780632a205e3d146105e75761038b565b80630c2cd50c146104d957806310ddb13714610504578063125804d41461052d5761038b565b806306fdde031161036a57806306fdde031461041f57806307e0db171461044a578063081812fc14610473578063095ea7b3146104b05761038b565b80621d35671461039057806301ffc9a7146103b957806306d254da146103f6575b600080fd5b34801561039c57600080fd5b506103b760048036038101906103b2919061452c565b610e04565b005b3480156103c557600080fd5b506103e060048036038101906103db9190614623565b610f45565b6040516103ed919061466b565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906146e4565b610fbf565b005b34801561042b57600080fd5b5061043461107f565b6040516104419190614799565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c91906147bb565b611111565b005b34801561047f57600080fd5b5061049a6004803603810190610495919061481e565b61121b565b6040516104a7919061485a565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190614875565b61126a565b005b3480156104e557600080fd5b506104ee611316565b6040516104fb91906148c4565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906147bb565b61131c565b005b34801561053957600080fd5b50610554600480360381019061054f919061481e565b611426565b6040516105619190614799565b60405180910390f35b34801561057657600080fd5b5061057f611486565b60405161058c91906148c4565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b791906146e4565b6114a2565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906148df565b611529565b005b3480156105f357600080fd5b5061060e6004803603810190610609919061495e565b611553565b60405161061c929190614a11565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190614a3a565b61163b565b60405161065a929190614a7a565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614b44565b611687565b005b34801561069857600080fd5b506106a161171d565b6040516106ae91906148c4565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190614bed565b611723565b6040516106eb919061466b565b60405180910390f35b34801561070057600080fd5b5061071b6004803603810190610716919061481e565b6117f7565b005b61073760048036038101906107329190614875565b61188f565b005b34801561074557600080fd5b50610760600480360381019061075b91906148df565b6118fb565b005b34801561076e57600080fd5b5061078960048036038101906107849190614bed565b61191b565b005b34801561079757600080fd5b506107b260048036038101906107ad9190614cf9565b611a2b565b005b3480156107c057600080fd5b506107db60048036038101906107d69190614b44565b611b44565b005b3480156107e957600080fd5b5061080460048036038101906107ff919061481e565b611bec565b005b610820600480360381019061081b9190614db8565b611c72565b005b34801561082e57600080fd5b50610849600480360381019061084491906146e4565b611c8a565b005b34801561085757600080fd5b50610860611d50565b60405161086d91906148c4565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614e92565b611d85565b6040516108aa9190614f1a565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d5919061481e565b611dcd565b6040516108e7919061485a565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190614ff8565b611e49565b005b34801561092557600080fd5b50610940600480360381019061093b919061452c565b611f6c565b005b34801561094e57600080fd5b50610957611fbd565b60405161096491906148c4565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f91906146e4565b611fc3565b6040516109a191906148c4565b60405180910390f35b3480156109b657600080fd5b506109bf612045565b005b3480156109cd57600080fd5b506109d66120cd565b6040516109e391906148c4565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e91906147bb565b6120f5565b604051610a2091906150a9565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906146e4565b612195565b005b348015610a5e57600080fd5b50610a6761221d565b604051610a7491906148c4565b60405180910390f35b348015610a8957600080fd5b50610a92612223565b604051610a9f919061485a565b60405180910390f35b348015610ab457600080fd5b50610acf6004803603810190610aca9190614b44565b61224c565b005b348015610add57600080fd5b50610ae66122e2565b604051610af39190614799565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e91906146e4565b612374565b604051610b3091906148c4565b60405180910390f35b348015610b4557600080fd5b50610b606004803603810190610b5b91906150cb565b61238c565b005b348015610b6e57600080fd5b50610b776123a2565b604051610b84919061485a565b60405180910390f35b348015610b9957600080fd5b50610ba26123c8565b604051610baf919061516a565b60405180910390f35b348015610bc457600080fd5b50610bcd6123ec565b604051610bda9190614799565b60405180910390f35b348015610bef57600080fd5b50610c0a6004803603810190610c059190615185565b61247a565b005b348015610c1857600080fd5b50610c336004803603810190610c2e919061481e565b6124a6565b604051610c409190614799565b60405180910390f35b348015610c5557600080fd5b50610c706004803603810190610c6b9190615208565b612517565b005b610c8c6004803603810190610c87919061452c565b61262d565b005b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061481e565b612728565b005b348015610cc357600080fd5b50610ccc6127ae565b604051610cd99190614799565b60405180910390f35b348015610cee57600080fd5b50610cf761283c565b604051610d049190614799565b60405180910390f35b348015610d1957600080fd5b50610d346004803603810190610d2f9190615290565b6128ce565b604051610d41919061466b565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c91906146e4565b612962565b005b348015610d7f57600080fd5b50610d9a6004803603810190610d95919061481e565b612a5a565b005b348015610da857600080fd5b50610dc36004803603810190610dbe91906152d0565b612ae0565b604051610dd091906150a9565b60405180910390f35b348015610de557600080fd5b50610dee612ba0565b604051610dfb919061466b565b60405180910390f35b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff16610e43612bad565b73ffffffffffffffffffffffffffffffffffffffff1614610e6357600080fd5b6000600160008661ffff1661ffff1681526020019081526020016000208054610e8b90615366565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb790615366565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b5050505050905080518451148015610f29575080805190602001208480519060200120145b610f3257600080fd5b610f3e85858585612bb5565b5050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610fb85750610fb782612cd4565b5b9050919050565b610fc7612bad565b73ffffffffffffffffffffffffffffffffffffffff16610fe5612223565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611032906153e4565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606003805461108e90615366565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90615366565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905090565b611119612bad565b73ffffffffffffffffffffffffffffffffffffffff16611137612223565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906153e4565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b81526004016111e69190615413565b600060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b5050505050565b600061122682612d4e565b61122f57600080fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061127582611dcd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166112cf612bad565b73ffffffffffffffffffffffffffffffffffffffff1614806112fe57506112fd816112f8612bad565b6128ce565b5b61130757600080fd5b6113118383612dba565b505050565b600d5481565b611324612bad565b73ffffffffffffffffffffffffffffffffffffffff16611342612223565b73ffffffffffffffffffffffffffffffffffffffff1614611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906153e4565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b81526004016113f19190615413565b600060405180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b5050505050565b606060006011805461143790615366565b905011611453576040518060200160405280600081525061147f565b601161145e83612e73565b60405160200161146f9291906154fe565b6040516020818303038152906040525b9050919050565b6000600754611493611d50565b61149d919061555b565b905090565b6114aa612ba0565b6114b357600080fd5b6000601460006114c1612bad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161150b57600080fd5b61151b611516612bad565b612fd4565b6115258282613074565b5050565b61153a611534612bad565b826131d0565b61154357600080fd5b61154e838383613278565b505050565b6000806000868660405160200161156b9291906155ef565b60405160208183030381529060405290507f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308489896040518663ffffffff1660e01b81526004016115dd95949392919061561f565b604080518083038186803b1580156115f457600080fd5b505afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190615695565b92509250509550959350505050565b600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600e548561167291906156d5565b61167c919061575e565b915091509250929050565b61168f612bad565b73ffffffffffffffffffffffffffffffffffffffff166116ad612223565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906153e4565b60405180910390fd5b806012908051906020019061171992919061422f565b5050565b600c5481565b600080600160008661ffff1661ffff168152602001908152602001600020805461174c90615366565b80601f016020809104026020016040519081016040528092919081815260200182805461177890615366565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905083836040516117dc9291906157bf565b60405180910390208180519060200120149150509392505050565b6117ff612bad565b73ffffffffffffffffffffffffffffffffffffffff1661181d612223565b73ffffffffffffffffffffffffffffffffffffffff1614611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a906153e4565b60405180910390fd5b61187b612ba0565b1561188557600080fd5b80600c8190555050565b611897612ba0565b6118a057600080fd5b806010546118ae91906156d5565b34146118b957600080fd5b600a8111156118c757600080fd5b6118cf613473565b6118d7611d50565b826118e291906157d8565b11156118ed57600080fd5b6118f78282613074565b5050565b6119168383836040518060200160405280600081525061247a565b505050565b611923612bad565b73ffffffffffffffffffffffffffffffffffffffff16611941612223565b73ffffffffffffffffffffffffffffffffffffffff1614611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906153e4565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016119f49392919061585b565b600060405180830381600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b50505050505050565b611a33612bad565b73ffffffffffffffffffffffffffffffffffffffff16611a51612223565b73ffffffffffffffffffffffffffffffffffffffff1614611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e906153e4565b60405180910390fd5b60005b84849050811015611b3d57828282818110611ac857611ac761588d565b5b9050602002810190611ada91906158cb565b60016000888886818110611af157611af061588d565b5b9050602002016020810190611b0691906147bb565b61ffff1661ffff1681526020019081526020016000209190611b299291906142b5565b508080611b359061592e565b915050611aaa565b5050505050565b611b4c612bad565b73ffffffffffffffffffffffffffffffffffffffff16611b6a612223565b73ffffffffffffffffffffffffffffffffffffffff1614611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906153e4565b60405180910390fd5b611bc8612ba0565b15611bd257600080fd5b8060119080519060200190611be892919061422f565b5050565b611bf4612bad565b73ffffffffffffffffffffffffffffffffffffffff16611c12612223565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f906153e4565b60405180910390fd5b80600e8190555050565b611c81878787878787876134a9565b50505050505050565b611c92612bad565b73ffffffffffffffffffffffffffffffffffffffff16611cb0612223565b73ffffffffffffffffffffffffffffffffffffffff1614611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906153e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d4c573d6000803e3d6000fd5b5050565b60006006547f0000000000000000000000000000000000000000000000000000000000000514611d809190615977565b905090565b60026020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4057600080fd5b80915050919050565b611e51612bad565b73ffffffffffffffffffffffffffffffffffffffff16611e6f612223565b73ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906153e4565b60405180910390fd5b60005b8251811015611f42578160146000858481518110611ee957611ee861588d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611f3a9061592e565b915050611ec8565b50808251611f5091906156d5565b60156000828254611f6191906157d8565b925050819055505050565b3073ffffffffffffffffffffffffffffffffffffffff16611f8b612bad565b73ffffffffffffffffffffffffffffffffffffffff1614611fab57600080fd5b611fb78484848461360d565b50505050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ffe57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61204d612bad565b73ffffffffffffffffffffffffffffffffffffffff1661206b612223565b73ffffffffffffffffffffffffffffffffffffffff16146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906153e4565b60405180910390fd5b6120cb60006136b0565b565b60007f0000000000000000000000000000000000000000000000000000000000000514905090565b6001602052806000526040600020600091509050805461211490615366565b80601f016020809104026020016040519081016040528092919081815260200182805461214090615366565b801561218d5780601f106121625761010080835404028352916020019161218d565b820191906000526020600020905b81548152906001019060200180831161217057829003601f168201915b505050505081565b61219d612bad565b73ffffffffffffffffffffffffffffffffffffffff166121bb612223565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612208906153e4565b60405180910390fd5b61221a81612fd4565b50565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612254612bad565b73ffffffffffffffffffffffffffffffffffffffff16612272612223565b73ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf906153e4565b60405180910390fd5b80601390805190602001906122de92919061422f565b5050565b6060600480546122f190615366565b80601f016020809104026020016040519081016040528092919081815260200182805461231d90615366565b801561236a5780601f1061233f5761010080835404028352916020019161236a565b820191906000526020600020905b81548152906001019060200180831161234d57829003601f168201915b5050505050905090565b60146020528060005260406000206000915090505481565b61239e612397612bad565b8383613774565b5050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b601180546123f990615366565b80601f016020809104026020016040519081016040528092919081815260200182805461242590615366565b80156124725780601f1061244757610100808354040283529160200191612472565b820191906000526020600020905b81548152906001019060200180831161245557829003601f168201915b505050505081565b61248b612485612bad565b836131d0565b61249457600080fd5b6124a0848484846138ab565b50505050565b60606124b182612d4e565b6124ba57600080fd5b60006124c46138d1565b905060008151116124e4576040518060200160405280600081525061250f565b806124ee84612e73565b6040516020016124ff9291906159ab565b6040516020818303038152906040525b915050919050565b61251f612bad565b73ffffffffffffffffffffffffffffffffffffffff1661253d612223565b73ffffffffffffffffffffffffffffffffffffffff1614612593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258a906153e4565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016125f49594939291906159cf565b600060405180830381600087803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505050505050565b6000600260008661ffff1661ffff168152602001908152602001600020846040516126589190615a4e565b908152602001604051809103902060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b81141561269e57600080fd5b808280519060200120146126b157600080fd5b6000801b600260008761ffff1661ffff168152602001908152602001600020856040516126de9190615a4e565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506127218585858561360d565b5050505050565b612730612bad565b73ffffffffffffffffffffffffffffffffffffffff1661274e612223565b73ffffffffffffffffffffffffffffffffffffffff16146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b906153e4565b60405180910390fd5b80600d8190555050565b601280546127bb90615366565b80601f01602080910402602001604051908101604052809291908181526020018280546127e790615366565b80156128345780601f1061280957610100808354040283529160200191612834565b820191906000526020600020905b81548152906001019060200180831161281757829003601f168201915b505050505081565b60606013805461284b90615366565b80601f016020809104026020016040519081016040528092919081815260200182805461287790615366565b80156128c45780601f10612899576101008083540402835291602001916128c4565b820191906000526020600020905b8154815290600101906020018083116128a757829003601f168201915b5050505050905090565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61296a612bad565b73ffffffffffffffffffffffffffffffffffffffff16612988612223565b73ffffffffffffffffffffffffffffffffffffffff16146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d5906153e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590615ad7565b60405180910390fd5b612a57816136b0565b50565b612a62612bad565b73ffffffffffffffffffffffffffffffffffffffff16612a80612223565b73ffffffffffffffffffffffffffffffffffffffff1614612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd906153e4565b60405180910390fd5b8060108190555050565b60607f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401612b419493929190615af7565b60006040518083038186803b158015612b5957600080fd5b505afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612b969190615bac565b9050949350505050565b600042600c541115905090565b600033905090565b3073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a858585856040518563ffffffff1660e01b8152600401612bf49493929190615c04565b600060405180830381600087803b158015612c0e57600080fd5b505af1925050508015612c1f575060015b612ccd578080519060200120600260008661ffff1661ffff16815260200190815260200160002084604051612c549190615a4e565b908152602001604051809103902060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051612cc09493929190615c04565b60405180910390a1612cce565b5b50505050565b60007f7bb0080b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d475750612d4682613963565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e2d83611dcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000821415612ebb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fcf565b600082905060005b60008214612eed578080612ed69061592e565b915050600a82612ee6919061575e565b9150612ec3565b60008167ffffffffffffffff811115612f0957612f086143c1565b5b6040519080825280601f01601f191660200182016040528015612f3b5781602001600182028036833780820191505090505b5090505b60008514612fc857600182612f549190615977565b9150600a85612f639190615c57565b6030612f6f91906157d8565b60f81b818381518110612f8557612f8461588d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fc1919061575e565b9450612f3f565b8093505050505b919050565b601460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601560008282546130259190615977565b925050819055506000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b3273ffffffffffffffffffffffffffffffffffffffff16613093612bad565b73ffffffffffffffffffffffffffffffffffffffff16146130b357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ed57600080fd5b600081116130fa57600080fd5b6000600654905060005b8281101561316d5760006131188584613a45565b905061314f857f00000000000000000000000000000000000000000000000000000000000000018361314a91906157d8565b613ab3565b8261315990615c88565b925050806131669061592e565b9050613104565b508060068190555081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c491906157d8565b92505081905550505050565b60006131db82612d4e565b6131e457600080fd5b60006131ef83611dcd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325e57508373ffffffffffffffffffffffffffffffffffffffff166132468461121b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061326f575061326e81856128ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661329882611dcd565b73ffffffffffffffffffffffffffffffffffffffff16146132b857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132f257600080fd5b6132fd838383613b7d565b613308600082612dba565b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133589190615977565b925050819055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133af91906157d8565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461346e838383613b82565b505050565b600042600d54111561349b5760155461348a6120cd565b6134949190615977565b90506134a6565b6134a36120cd565b90505b90565b6134b587878787613b87565b600085856040516020016134ca9291906155ef565b60405160208183030381529060405290506134e88782868686613bf0565b60007f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff16637a14574889306040518363ffffffff1660e01b8152600401613545929190615cb2565b60206040518083038186803b15801561355d57600080fd5b505afa158015613571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135959190615cf0565b9050866040516135a59190615a4e565b60405180910390208861ffff168a73ffffffffffffffffffffffffffffffffffffffff167f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce154389856040516135fa929190615d1d565b60405180910390a4505050505050505050565b600080828060200190518101906136249190615d46565b9150915060006014830151905061363c878284613d70565b8073ffffffffffffffffffffffffffffffffffffffff16866040516136619190615a4e565b60405180910390208861ffff167f64e10c37f404d128982dce114f5d233c14c5c7f6d8db93099e3d99dacb9e27ba858960405161369f929190615d1d565b60405180910390a450505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137ad57600080fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161389e919061466b565b60405180910390a3505050565b6138b6848484613278565b6138c284848484613d7f565b6138cb57600080fd5b50505050565b6060601280546138e090615366565b80601f016020809104026020016040519081016040528092919081815260200182805461390c90615366565b80156139595780601f1061392e57610100808354040283529160200191613959565b820191906000526020600020905b81548152906001019060200180831161393c57829003601f168201915b5050505050905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613a3e5750613a3d82613ee0565b5b9050919050565b600080833a434244600143613a5a9190615977565b403089604051602001613a74989796959493929190615da2565b6040516020818303038152906040528051906020012060001c905060008382613a9d9190615c57565b9050613aa98185613f4a565b9250505092915050565b613abf60008383613b7d565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b7960008383613b82565b5050565b505050565b505050565b613b98613b92612bad565b826131d0565b613ba157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff16613bc182611dcd565b73ffffffffffffffffffffffffffffffffffffffff1614613be157600080fd5b613bea8161400d565b50505050565b6000600160008761ffff1661ffff1681526020019081526020016000208054613c1890615366565b80601f0160208091040260200160405190810160405280929190818152602001828054613c4490615366565b8015613c915780601f10613c6657610100808354040283529160200191613c91565b820191906000526020600020905b815481529060010190602001808311613c7457829003601f168201915b50505050509050600081511415613ca757600080fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663c58031007f00000000000000000000000000000000000000000000000000038d7ea4c6800034613d0f9190615977565b8884898989896040518863ffffffff1660e01b8152600401613d3696959493929190615e2f565b6000604051808303818588803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b5050505050505050505050565b613d7a8282614142565b505050565b6000613da08473ffffffffffffffffffffffffffffffffffffffff1661420c565b15613ed3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613dc9612bad565b8786866040518563ffffffff1660e01b8152600401613deb9493929190615ea5565b602060405180830381600087803b158015613e0557600080fd5b505af1925050508015613e3657506040513d601f19601f82011682018060405250810190613e339190615f06565b60015b613e83573d8060008114613e66576040519150601f19603f3d011682016040523d82523d6000602084013e613e6b565b606091505b50600081511415613e7b57600080fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ed8565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060056000858152602001908152602001600020549050600080821415613f7557849050613f79565b8190505b6000600185613f889190615977565b9050808614614001576000600560008381526020019081526020016000205490506000811415613fcf57816005600089815260200190815260200160002081905550613fff565b80600560008981526020019081526020016000208190555060056000838152602001908152602001600020600090555b505b81935050505092915050565b600061401882611dcd565b905061402681600084613b7d565b614031600083612dba565b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546140819190615977565b925050819055506008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008154809291906140d190615f33565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461413e81600084613b82565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561417c57600080fd5b61418581612d4e565b1561418f57600080fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141df91906157d8565b925050819055506141f08282613ab3565b6007600081548092919061420390615f7c565b91905055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461423b90615366565b90600052602060002090601f01602090048101928261425d57600085556142a4565b82601f1061427657805160ff19168380011785556142a4565b828001600101855582156142a4579182015b828111156142a3578251825591602001919060010190614288565b5b5090506142b1919061433b565b5090565b8280546142c190615366565b90600052602060002090601f0160209004810192826142e3576000855561432a565b82601f106142fc57803560ff191683800117855561432a565b8280016001018555821561432a579182015b8281111561432957823582559160200191906001019061430e565b5b509050614337919061433b565b5090565b5b8082111561435457600081600090555060010161433c565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6143838161436c565b811461438e57600080fd5b50565b6000813590506143a08161437a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143f9826143b0565b810181811067ffffffffffffffff82111715614418576144176143c1565b5b80604052505050565b600061442b614358565b905061443782826143f0565b919050565b600067ffffffffffffffff821115614457576144566143c1565b5b614460826143b0565b9050602081019050919050565b82818337600083830152505050565b600061448f61448a8461443c565b614421565b9050828152602081018484840111156144ab576144aa6143ab565b5b6144b684828561446d565b509392505050565b600082601f8301126144d3576144d26143a6565b5b81356144e384826020860161447c565b91505092915050565b600067ffffffffffffffff82169050919050565b614509816144ec565b811461451457600080fd5b50565b60008135905061452681614500565b92915050565b6000806000806080858703121561454657614545614362565b5b600061455487828801614391565b945050602085013567ffffffffffffffff81111561457557614574614367565b5b614581878288016144be565b935050604061459287828801614517565b925050606085013567ffffffffffffffff8111156145b3576145b2614367565b5b6145bf878288016144be565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614600816145cb565b811461460b57600080fd5b50565b60008135905061461d816145f7565b92915050565b60006020828403121561463957614638614362565b5b60006146478482850161460e565b91505092915050565b60008115159050919050565b61466581614650565b82525050565b6000602082019050614680600083018461465c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146b182614686565b9050919050565b6146c1816146a6565b81146146cc57600080fd5b50565b6000813590506146de816146b8565b92915050565b6000602082840312156146fa576146f9614362565b5b6000614708848285016146cf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561474b578082015181840152602081019050614730565b8381111561475a576000848401525b50505050565b600061476b82614711565b614775818561471c565b935061478581856020860161472d565b61478e816143b0565b840191505092915050565b600060208201905081810360008301526147b38184614760565b905092915050565b6000602082840312156147d1576147d0614362565b5b60006147df84828501614391565b91505092915050565b6000819050919050565b6147fb816147e8565b811461480657600080fd5b50565b600081359050614818816147f2565b92915050565b60006020828403121561483457614833614362565b5b600061484284828501614809565b91505092915050565b614854816146a6565b82525050565b600060208201905061486f600083018461484b565b92915050565b6000806040838503121561488c5761488b614362565b5b600061489a858286016146cf565b92505060206148ab85828601614809565b9150509250929050565b6148be816147e8565b82525050565b60006020820190506148d960008301846148b5565b92915050565b6000806000606084860312156148f8576148f7614362565b5b6000614906868287016146cf565b9350506020614917868287016146cf565b925050604061492886828701614809565b9150509250925092565b61493b81614650565b811461494657600080fd5b50565b60008135905061495881614932565b92915050565b600080600080600060a0868803121561497a57614979614362565b5b600061498888828901614391565b955050602086013567ffffffffffffffff8111156149a9576149a8614367565b5b6149b5888289016144be565b94505060406149c688828901614809565b93505060606149d788828901614949565b925050608086013567ffffffffffffffff8111156149f8576149f7614367565b5b614a04888289016144be565b9150509295509295909350565b6000604082019050614a2660008301856148b5565b614a3360208301846148b5565b9392505050565b60008060408385031215614a5157614a50614362565b5b6000614a5f85828601614809565b9250506020614a7085828601614809565b9150509250929050565b6000604082019050614a8f600083018561484b565b614a9c60208301846148b5565b9392505050565b600067ffffffffffffffff821115614abe57614abd6143c1565b5b614ac7826143b0565b9050602081019050919050565b6000614ae7614ae284614aa3565b614421565b905082815260208101848484011115614b0357614b026143ab565b5b614b0e84828561446d565b509392505050565b600082601f830112614b2b57614b2a6143a6565b5b8135614b3b848260208601614ad4565b91505092915050565b600060208284031215614b5a57614b59614362565b5b600082013567ffffffffffffffff811115614b7857614b77614367565b5b614b8484828501614b16565b91505092915050565b600080fd5b600080fd5b60008083601f840112614bad57614bac6143a6565b5b8235905067ffffffffffffffff811115614bca57614bc9614b8d565b5b602083019150836001820283011115614be657614be5614b92565b5b9250929050565b600080600060408486031215614c0657614c05614362565b5b6000614c1486828701614391565b935050602084013567ffffffffffffffff811115614c3557614c34614367565b5b614c4186828701614b97565b92509250509250925092565b60008083601f840112614c6357614c626143a6565b5b8235905067ffffffffffffffff811115614c8057614c7f614b8d565b5b602083019150836020820283011115614c9c57614c9b614b92565b5b9250929050565b60008083601f840112614cb957614cb86143a6565b5b8235905067ffffffffffffffff811115614cd657614cd5614b8d565b5b602083019150836020820283011115614cf257614cf1614b92565b5b9250929050565b60008060008060408587031215614d1357614d12614362565b5b600085013567ffffffffffffffff811115614d3157614d30614367565b5b614d3d87828801614c4d565b9450945050602085013567ffffffffffffffff811115614d6057614d5f614367565b5b614d6c87828801614ca3565b925092505092959194509250565b6000614d8582614686565b9050919050565b614d9581614d7a565b8114614da057600080fd5b50565b600081359050614db281614d8c565b92915050565b600080600080600080600060e0888a031215614dd757614dd6614362565b5b6000614de58a828b016146cf565b9750506020614df68a828b01614391565b965050604088013567ffffffffffffffff811115614e1757614e16614367565b5b614e238a828b016144be565b9550506060614e348a828b01614809565b9450506080614e458a828b01614da3565b93505060a0614e568a828b016146cf565b92505060c088013567ffffffffffffffff811115614e7757614e76614367565b5b614e838a828b016144be565b91505092959891949750929550565b600080600060608486031215614eab57614eaa614362565b5b6000614eb986828701614391565b935050602084013567ffffffffffffffff811115614eda57614ed9614367565b5b614ee6868287016144be565b9250506040614ef786828701614517565b9150509250925092565b6000819050919050565b614f1481614f01565b82525050565b6000602082019050614f2f6000830184614f0b565b92915050565b600067ffffffffffffffff821115614f5057614f4f6143c1565b5b602082029050602081019050919050565b6000614f74614f6f84614f35565b614421565b90508083825260208201905060208402830185811115614f9757614f96614b92565b5b835b81811015614fc05780614fac88826146cf565b845260208401935050602081019050614f99565b5050509392505050565b600082601f830112614fdf57614fde6143a6565b5b8135614fef848260208601614f61565b91505092915050565b6000806040838503121561500f5761500e614362565b5b600083013567ffffffffffffffff81111561502d5761502c614367565b5b61503985828601614fca565b925050602061504a85828601614809565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061507b82615054565b615085818561505f565b935061509581856020860161472d565b61509e816143b0565b840191505092915050565b600060208201905081810360008301526150c38184615070565b905092915050565b600080604083850312156150e2576150e1614362565b5b60006150f0858286016146cf565b925050602061510185828601614949565b9150509250929050565b6000819050919050565b600061513061512b61512684614686565b61510b565b614686565b9050919050565b600061514282615115565b9050919050565b600061515482615137565b9050919050565b61516481615149565b82525050565b600060208201905061517f600083018461515b565b92915050565b6000806000806080858703121561519f5761519e614362565b5b60006151ad878288016146cf565b94505060206151be878288016146cf565b93505060406151cf87828801614809565b925050606085013567ffffffffffffffff8111156151f0576151ef614367565b5b6151fc878288016144be565b91505092959194509250565b60008060008060006080868803121561522457615223614362565b5b600061523288828901614391565b955050602061524388828901614391565b945050604061525488828901614809565b935050606086013567ffffffffffffffff81111561527557615274614367565b5b61528188828901614b97565b92509250509295509295909350565b600080604083850312156152a7576152a6614362565b5b60006152b5858286016146cf565b92505060206152c6858286016146cf565b9150509250929050565b600080600080608085870312156152ea576152e9614362565b5b60006152f887828801614391565b945050602061530987828801614391565b935050604061531a878288016146cf565b925050606061532b87828801614809565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061537e57607f821691505b6020821081141561539257615391615337565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153ce60208361471c565b91506153d982615398565b602082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b61540d8161436c565b82525050565b60006020820190506154286000830184615404565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461545b81615366565b615465818661542e565b945060018216600081146154805760018114615491576154c4565b60ff198316865281860193506154c4565b61549a85615439565b60005b838110156154bc5781548189015260018201915060208101905061549d565b838801955050505b50505092915050565b60006154d882614711565b6154e2818561542e565b93506154f281856020860161472d565b80840191505092915050565b600061550a828561544e565b915061551682846154cd565b91508190509392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061556682615522565b915061557183615522565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156155ac576155ab61552c565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156155e4576155e361552c565b5b828201905092915050565b600060408201905081810360008301526156098185615070565b905061561860208301846148b5565b9392505050565b600060a0820190506156346000830188615404565b615641602083018761484b565b81810360408301526156538186615070565b9050615662606083018561465c565b81810360808301526156748184615070565b90509695505050505050565b60008151905061568f816147f2565b92915050565b600080604083850312156156ac576156ab614362565b5b60006156ba85828601615680565b92505060206156cb85828601615680565b9150509250929050565b60006156e0826147e8565b91506156eb836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157245761572361552c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615769826147e8565b9150615774836147e8565b9250826157845761578361572f565b5b828204905092915050565b600081905092915050565b60006157a6838561578f565b93506157b383858461446d565b82840190509392505050565b60006157cc82848661579a565b91508190509392505050565b60006157e3826147e8565b91506157ee836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158235761582261552c565b5b828201905092915050565b600061583a838561505f565b935061584783858461446d565b615850836143b0565b840190509392505050565b60006040820190506158706000830186615404565b818103602083015261588381848661582e565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126158e8576158e76158bc565b5b80840192508235915067ffffffffffffffff82111561590a576159096158c1565b5b602083019250600182023603831315615926576159256158c6565b5b509250929050565b6000615939826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561596c5761596b61552c565b5b600182019050919050565b6000615982826147e8565b915061598d836147e8565b9250828210156159a05761599f61552c565b5b828203905092915050565b60006159b782856154cd565b91506159c382846154cd565b91508190509392505050565b60006080820190506159e46000830188615404565b6159f16020830187615404565b6159fe60408301866148b5565b8181036060830152615a1181848661582e565b90509695505050505050565b6000615a2882615054565b615a32818561578f565b9350615a4281856020860161472d565b80840191505092915050565b6000615a5a8284615a1d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615ac160268361471c565b9150615acc82615a65565b604082019050919050565b60006020820190508181036000830152615af081615ab4565b9050919050565b6000608082019050615b0c6000830187615404565b615b196020830186615404565b615b26604083018561484b565b615b3360608301846148b5565b95945050505050565b6000615b4f615b4a8461443c565b614421565b905082815260208101848484011115615b6b57615b6a6143ab565b5b615b7684828561472d565b509392505050565b600082601f830112615b9357615b926143a6565b5b8151615ba3848260208601615b3c565b91505092915050565b600060208284031215615bc257615bc1614362565b5b600082015167ffffffffffffffff811115615be057615bdf614367565b5b615bec84828501615b7e565b91505092915050565b615bfe816144ec565b82525050565b6000608082019050615c196000830187615404565b8181036020830152615c2b8186615070565b9050615c3a6040830185615bf5565b8181036060830152615c4c8184615070565b905095945050505050565b6000615c62826147e8565b9150615c6d836147e8565b925082615c7d57615c7c61572f565b5b828206905092915050565b6000615c93826147e8565b91506000821415615ca757615ca661552c565b5b600182039050919050565b6000604082019050615cc76000830185615404565b615cd4602083018461484b565b9392505050565b600081519050615cea81614500565b92915050565b600060208284031215615d0657615d05614362565b5b6000615d1484828501615cdb565b91505092915050565b6000604082019050615d3260008301856148b5565b615d3f6020830184615bf5565b9392505050565b60008060408385031215615d5d57615d5c614362565b5b600083015167ffffffffffffffff811115615d7b57615d7a614367565b5b615d8785828601615b7e565b9250506020615d9885828601615680565b9150509250929050565b600061010082019050615db8600083018b61484b565b615dc5602083018a6148b5565b615dd260408301896148b5565b615ddf60608301886148b5565b615dec60808301876148b5565b615df960a0830186614f0b565b615e0660c083018561484b565b615e1360e08301846148b5565b9998505050505050505050565b615e2981614d7a565b82525050565b600060c082019050615e446000830189615404565b8181036020830152615e568188615070565b90508181036040830152615e6a8187615070565b9050615e796060830186615e20565b615e86608083018561484b565b81810360a0830152615e988184615070565b9050979650505050505050565b6000608082019050615eba600083018761484b565b615ec7602083018661484b565b615ed460408301856148b5565b8181036060830152615ee68184615070565b905095945050505050565b600081519050615f00816145f7565b92915050565b600060208284031215615f1c57615f1b614362565b5b6000615f2a84828501615ef1565b91505092915050565b6000615f3e82615522565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615f7157615f7061552c565b5b600182039050919050565b6000615f8782615522565b91507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615fba57615fb961552c565b5b60018201905091905056fea2646970667358221220465ae67298535ba81083378fd3c590767c4c1d8b44ebbd85e6f9556e058d30c464736f6c63430008090033

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

0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000514

-----Decoded View---------------
Arg [0] : _mintPrice (uint256): 5000000000000000
Arg [1] : _traverseFee (uint256): 1000000000000000
Arg [2] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [3] : _offset (uint256): 1
Arg [4] : _supply (uint256): 1300

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [1] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [2] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000514


Deployed Bytecode Sourcemap

283:4858:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;683:645:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3690:230:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3153:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3200:98:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2617:121:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4532:169:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4199:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;473:49:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2744:127:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4048:193:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2552:121:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1309:251:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5211:277:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;588:408:19;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3400:171:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2528:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;420:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3404:247:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2644:153:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1568:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5554:179:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2877:176:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3059:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2379:141:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3041:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1002:330:19;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3269:123:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2427:115:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;551:85:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2948:190:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1861:276:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1317:296:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;615:24:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2732:159:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;2326:91:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;495:51:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2145:107:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;531:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2260:111:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3362:102:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;756:44:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4768:153:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;573:29:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;442:46:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;648:26:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5799:267:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3530:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2409:202:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1794:596:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2805:126:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;681:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3579:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4987:162:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2939:94:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2141:209:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3928:112:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;683:645:16;917:10;893:35;;:12;:10;:12::i;:::-;:35;;;885:44;;;;;;940:26;969:19;:32;989:11;969:32;;;;;;;;;;;;;;;940:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1173:13;:20;1151:11;:18;:42;:96;;;;;1233:13;1223:24;;;;;;1207:11;1197:22;;;;;;:50;1151:96;1143:105;;;;;;1259:62;1278:11;1291;1304:6;1312:8;1259:18;:62::i;:::-;810:518;683:645;;;;:::o;3690:230:12:-;3807:4;3846:26;3831:41;;;:11;:41;;;;:81;;;;3876:36;3900:11;3876:23;:36::i;:::-;3831:81;3824:88;;3690:230;;;:::o;3153:108::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:8:12::1;3228:14;;:25;;;;;;;;;;;;;;;;;;3153:108:::0;:::o;3200:98:11:-;3254:13;3286:5;3279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3200:98;:::o;2617:121:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2696:10:16::1;:25;;;2722:8;2696:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2617:121:::0;:::o;4532:169:11:-;4608:7;4635:16;4643:7;4635;:16::i;:::-;4627:25;;;;;;4670:15;:24;4686:7;4670:24;;;;;;;;;;;;;;;;;;;;;4663:31;;4532:169;;;:::o;4199:272::-;4279:13;4295:25;4312:7;4295:16;:25::i;:::-;4279:41;;4344:5;4338:11;;:2;:11;;;;4330:20;;;;;;4385:5;4369:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4394:37;4411:5;4418:12;:10;:12::i;:::-;4394:16;:37::i;:::-;4369:62;4361:71;;;;;;4443:21;4452:2;4456:7;4443:8;:21::i;:::-;4269:202;4199:272;;:::o;473:49:12:-;;;;:::o;2744:127:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2826:10:16::1;:28;;;2855:8;2826:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2744:127:::0;:::o;4048:193:12:-;4104:13;4166:1;4143:12;4137:26;;;;;:::i;:::-;;;:30;:96;;;;;;;;;;;;;;;;;4194:12;4208:18;:7;:16;:18::i;:::-;4177:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4137:96;4130:103;;4048:193;;;:::o;2552:121:11:-;2604:7;2660:5;;2645:11;:9;:11::i;:::-;2638:27;;;;:::i;:::-;2623:43;;2552:121;:::o;1309:251:12:-;1365:12;:10;:12::i;:::-;1357:21;;;;;;1391:15;1409:9;:23;1419:12;:10;:12::i;:::-;1409:23;;;;;;;;;;;;;;;;1391:41;;1461:1;1451:7;:11;1443:20;;;;;;1484:30;1501:12;:10;:12::i;:::-;1484:16;:30::i;:::-;1527:25;1539:3;1544:7;1527:11;:25::i;:::-;1346:214;1309:251;:::o;5211:277:11:-;5400:41;5419:12;:10;:12::i;:::-;5433:7;5400:18;:41::i;:::-;5392:50;;;;;;5453:28;5463:4;5469:2;5473:7;5453:9;:28::i;:::-;5211:277;;;:::o;588:408:19:-;754:14;770:11;832:20;866:10;878:8;855:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;832:55;;904:10;:23;;;928:11;949:4;956:7;965;974:14;904:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;897:92;;;;;588:408;;;;;;;;:::o;3400:171:12:-;3482:7;3491;3513:14;;;;;;;;;;;3560:5;3543:13;;3530:10;:26;;;;:::i;:::-;3529:36;;;;:::i;:::-;3505:61;;;;3400:171;;;;;:::o;2528:108::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2621:7:12::1;2606:12;:22;;;;;;;;;;;;:::i;:::-;;2528:108:::0;:::o;420:46::-;;;;:::o;3404:247:16:-;3500:4;3516:26;3545:19;:32;3565:11;3545:32;;;;;;;;;;;;;;;3516:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3632:11;;3622:22;;;;;;;:::i;:::-;;;;;;;;3604:13;3594:24;;;;;;:50;3587:57;;;3404:247;;;;;:::o;2644:153:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2734:12:12::1;:10;:12::i;:::-;2733:13;2725:22;;;::::0;::::1;;2779:10;2758:18;:31;;;;2644:153:::0;:::o;1568:285::-;1648:12;:10;:12::i;:::-;1640:21;;;;;;1705:7;1693:9;;:19;;;;:::i;:::-;1680:9;:32;1672:41;;;;;;1743:2;1732:7;:13;;1724:22;;;;;;1790:16;:14;:16::i;:::-;1775:11;:9;:11::i;:::-;1765:7;:21;;;;:::i;:::-;:41;;1757:50;;;;;;1820:25;1832:3;1837:7;1820:11;:25::i;:::-;1568:285;;:::o;5554:179:11:-;5687:39;5704:4;5710:2;5714:7;5687:39;;;;;;;;;;;;:16;:39::i;:::-;5554:179;;;:::o;2877:176:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2991:10:16::1;:29;;;3021:11;3034;;2991:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2877:176:::0;;;:::o;3059:249::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3180:9:16::1;3175:127;3199:11;;:18;;3195:1;:22;3175:127;;;3277:11;;3289:1;3277:14;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;3239:19;:35;3259:11;;3271:1;3259:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3239:35;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;3219:4;;;;;:::i;:::-;;;;3175:127;;;;3059:249:::0;;;;:::o;2379:141:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2466:12:12::1;:10;:12::i;:::-;2465:13;2457:22;;;::::0;::::1;;2505:7;2490:12;:22;;;;;;;;;;;;:::i;:::-;;2379:141:::0;:::o;3041:104::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3130:7:12::1;3114:13;:23;;;;3041:104:::0;:::o;1002:330:19:-;1226:99;1232:5;1239:11;1252:10;1264:8;1274:14;1290:18;1310:14;1226:5;:99::i;:::-;1002:330;;;;;;;:::o;3269:123:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3343:8:12::1;3335:26;;:49;3362:21;3335:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3269:123:::0;:::o;2427:115:11:-;2477:7;2516:19;;2503:10;:32;;;;:::i;:::-;2496:39;;2427:115;:::o;551:85:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2948:190:11:-;3020:7;3039:13;3055:7;:16;3063:7;3055:16;;;;;;;;;;;;;;;;;;;;;3039:32;;3106:1;3089:19;;:5;:19;;;;3081:28;;;;;;3126:5;3119:12;;;2948:190;;;:::o;1861:276:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1964:9:12::1;1959:108;1983:8;:15;1979:1;:19;1959:108;;;2046:9;2021;:22;2031:8;2040:1;2031:11;;;;;;;;:::i;:::-;;;;;;;;2021:22;;;;;;;;;;;;;;;:34;;;;2000:4;;;;;:::i;:::-;;;;1959:108;;;;2119:9;2101:8;:15;:27;;;;:::i;:::-;2079:17;;:50;;;;;;;:::i;:::-;;;;;;;;1861:276:::0;;:::o;1317:296:17:-;1525:4;1501:29;;:12;:10;:12::i;:::-;:29;;;1493:38;;;;;;1541:65;1563:11;1576;1589:6;1597:8;1541:21;:65::i;:::-;1317:296;;;;:::o;615:24:12:-;;;;:::o;2732:159:11:-;2804:7;2848:1;2831:19;;:5;:19;;;;2823:28;;;;;;2868:9;:16;2878:5;2868:16;;;;;;;;;;;;;;;;2861:23;;2732:159;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;2326:91:11:-;2374:7;2400:10;2393:17;;2326:91;:::o;495:51:16:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2145:107:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2218:26:12::1;2235:8;2218:16;:26::i;:::-;2145:107:::0;:::o;531:35::-;;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2260:111:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2356:7:12::1;2337:16;:26;;;;;;;;;;;;:::i;:::-;;2260:111:::0;:::o;3362:102:11:-;3418:13;3450:7;3443:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3362:102;:::o;756:44:12:-;;;;;;;;;;;;;;;;;:::o;4768:153:11:-;4862:52;4881:12;:10;:12::i;:::-;4895:8;4905;4862:18;:52::i;:::-;4768:153;;:::o;573:29:12:-;;;;;;;;;;;;;:::o;442:46:16:-;;;:::o;648:26:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5799:267:11:-;5968:41;5987:12;:10;:12::i;:::-;6001:7;5968:18;:41::i;:::-;5960:50;;;;;;6020:39;6034:4;6040:2;6044:7;6053:5;6020:13;:39::i;:::-;5799:267;;;;:::o;3530:278::-;3603:13;3636:16;3644:7;3636;:16::i;:::-;3628:25;;;;;;3664:21;3688:10;:8;:10::i;:::-;3664:34;;3739:1;3721:7;3715:21;:25;:86;;;;;;;;;;;;;;;;;3767:7;3776:18;:7;:16;:18::i;:::-;3750:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3715:86;3708:93;;;3530:278;;;:::o;2409:202:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2542:10:16::1;:20;;;2563:8;2573;2583:11;2596:7;;2542:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2409:202:::0;;;;;:::o;1794:596:17:-;1977:19;1999:14;:27;2014:11;1999:27;;;;;;;;;;;;;;;2027:11;1999:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2040:6;1999:48;;;;;;;;;;;;;;;;1977:70;;2088:1;2080:10;;2065:11;:25;;2057:34;;;;;;2132:11;2119:8;2109:19;;;;;;:34;2101:43;;;;;;2249:1;2241:10;;2190:14;:27;2205:11;2190:27;;;;;;;;;;;;;;;2218:11;2190:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2231:6;2190:48;;;;;;;;;;;;;;;:61;;;;2318:65;2340:11;2353;2366:6;2374:8;2318:21;:65::i;:::-;1923:467;1794:596;;;;:::o;2805:126:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2913:10:12::1;2889:21;:34;;;;2805:126:::0;:::o;681:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3579:103::-;3625:13;3658:16;3651:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3579:103;:::o;4987:162:11:-;5084:4;5107:18;:25;5126:5;5107:25;;;;;;;;;;;;;;;:35;5133:8;5107:35;;;;;;;;;;;;;;;;;;;;;;;;;5100:42;;4987:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;2939:94:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3019:6:12::1;3007:9;:18;;;;2939:94:::0;:::o;2141:209:16:-;2244:12;2275:10;:20;;;2296:8;2306;2324:4;2331:11;2275:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2268:75;;2141:209;;;;;;:::o;3928:112:12:-;3971:4;4017:15;3995:18;;:37;;3988:44;;3928:112;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;792:519:17:-;987:4;:25;;;1013:11;1026;1039:6;1047:8;987:69;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;983:322;;1209:8;1199:19;;;;;;1148:14;:27;1163:11;1148:27;;;;;;;;;;;;;;;1176:11;1148:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;1189:6;1148:48;;;;;;;;;;;;;;;:70;;;;1237:57;1251:11;1264;1277:6;1285:8;1237:57;;;;;;;;;:::i;:::-;;;;;;;;983:322;;;;792:519;;;;:::o;365:217:19:-;467:4;505:30;490:45;;;:11;:45;;;;:85;;;;539:36;563:11;539:23;:36::i;:::-;490:85;483:92;;365:217;;;:::o;7484:125:11:-;7549:4;7600:1;7572:30;;:7;:16;7580:7;7572:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7565:37;;7484:125;;;:::o;13422:173::-;13523:2;13496:15;:24;13512:7;13496:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13580:7;13576:2;13540:48;;13549:25;13566:7;13549:16;:25::i;:::-;13540:48;;;;;;;;;;;;13422:173;;:::o;328:703:6:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;4249:146:12:-;4334:9;:19;4344:8;4334:19;;;;;;;;;;;;;;;;4313:17;;:40;;;;;;;:::i;:::-;;;;;;;;4386:1;4364:9;:19;4374:8;4364:19;;;;;;;;;;;;;;;:23;;;;4249:146;:::o;9576:636:11:-;9677:9;9661:25;;:12;:10;:12::i;:::-;:25;;;9653:34;;;;;;9719:1;9705:16;;:2;:16;;;;9697:25;;;;;;9753:1;9740:10;:14;9732:23;;;;;;9774:30;9807:19;;9774:52;;9841:9;9836:267;9856:10;9852:1;:14;9836:267;;;9887:15;9905:56;9931:2;9935:25;9905;:56::i;:::-;9887:74;;9988:50;10016:2;10030:7;10020;:17;;;;:::i;:::-;9988:27;:50::i;:::-;10065:27;;;;:::i;:::-;;;9873:230;9868:3;;;;:::i;:::-;;;9836:267;;;;10143:25;10121:19;:47;;;;10195:10;10178:9;:13;10188:2;10178:13;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9643:569;9576:636;;:::o;7767:298::-;7860:4;7884:16;7892:7;7884;:16::i;:::-;7876:25;;;;;;7911:13;7927:25;7944:7;7927:16;:25::i;:::-;7911:41;;7981:5;7970:16;;:7;:16;;;:51;;;;8014:7;7990:31;;:20;8002:7;7990:11;:20::i;:::-;:31;;;7970:51;:87;;;;8025:32;8042:5;8049:7;8025:16;:32::i;:::-;7970:87;7962:96;;;7767:298;;;;:::o;12785:526::-;12941:4;12912:33;;:25;12929:7;12912:16;:25::i;:::-;:33;;;12904:42;;;;;;12978:1;12964:16;;:2;:16;;;;12956:25;;;;;;12992:39;13013:4;13019:2;13023:7;12992:20;:39::i;:::-;13093:29;13110:1;13114:7;13093:8;:29::i;:::-;13152:1;13133:9;:15;13143:4;13133:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;13180:1;13163:9;:13;13173:2;13163:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;13210:2;13191:7;:16;13199:7;13191:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;13247:7;13243:2;13228:27;;13237:4;13228:27;;;;;;;;;;;;13266:38;13286:4;13292:2;13296:7;13266:19;:38::i;:::-;12785:526;;;:::o;4923:213:12:-;4972:7;5020:15;4996:21;;:39;4992:108;;;5071:17;;5059:9;:7;:9::i;:::-;:29;;;;:::i;:::-;5052:36;;;;4992:108;5119:9;:7;:9::i;:::-;5112:16;;4923:213;;:::o;1338:578:19:-;1544:52;1555:5;1562:11;1575:10;1587:8;1544:10;:52::i;:::-;1607:20;1641:10;1653:8;1630:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1607:55;;1672:81;1680:11;1693:7;1702:14;1718:18;1738:14;1672:7;:81::i;:::-;1764:12;1779:10;:27;;;1807:11;1828:4;1779:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1764:70;;1881:10;1849:60;;;;;;:::i;:::-;;;;;;;;1868:11;1849:60;;1861:5;1849:60;;;1893:8;1903:5;1849:60;;;;;;;:::i;:::-;;;;;;;;1534:382;;1338:578;;;;;;;:::o;1922:531::-;2115:27;2144:12;2171:8;2160:35;;;;;;;;;;;;:::i;:::-;2114:81;;;;2205:17;2294:2;2278:14;2274:23;2268:30;2255:43;;2318:42;2328:11;2341:9;2352:7;2318:9;:42::i;:::-;2419:9;2376:70;;2406:11;2376:70;;;;;;:::i;:::-;;;;;;;;2393:11;2376:70;;;2430:7;2439:6;2376:70;;;;;;;:::i;:::-;;;;;;;;2063:390;;;1922:531;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;13730:278:11:-;13880:8;13871:17;;:5;:17;;;;13863:26;;;;;;13937:8;13899:18;:25;13918:5;13899:25;;;;;;;;;;;;;;;:35;13925:8;13899:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13982:8;13960:41;;13975:5;13960:41;;;13992:8;13960:41;;;;;;:::i;:::-;;;;;;;;13730:278;;;:::o;6928:253::-;7079:28;7089:4;7095:2;7099:7;7079:9;:28::i;:::-;7125:48;7148:4;7154:2;7158:7;7167:5;7125:22;:48::i;:::-;7117:57;;;;;;6928:253;;;;:::o;4802:113:12:-;4862:13;4895:12;4888:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4802:113;:::o;2020:300:11:-;2122:4;2172:25;2157:40;;;:11;:40;;;;:104;;;;2228:33;2213:48;;;:11;:48;;;;2157:104;:156;;;;2277:36;2301:11;2277:23;:36::i;:::-;2157:156;2138:175;;2020:300;;;:::o;10226:710::-;10339:7;10362:17;10462:2;10486:11;10519:12;10553:15;10590:16;10653:1;10638:12;:16;;;;:::i;:::-;10628:27;10685:4;10712:25;10430:325;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10403:366;;;;;;10382:397;;10362:417;;10789:19;10823:25;10811:9;:37;;;;:::i;:::-;10789:59;;10865:64;10890:11;10903:25;10865:24;:64::i;:::-;10858:71;;;;10226:710;;;;:::o;9274:296::-;9358:45;9387:1;9391:2;9395:7;9358:20;:45::i;:::-;9441:2;9422:7;:16;9430:7;9422:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9492:7;9488:2;9467:33;;9484:1;9467:33;;;;;;;;;;;;9519:44;9547:1;9551:2;9555:7;9519:19;:44::i;:::-;9274:296;;:::o;15843:122::-;;;;:::o;16337:121::-;;;;:::o;4403:249:12:-;4520:42;4539:12;:10;:12::i;:::-;4553:8;4520:18;:42::i;:::-;4512:51;;;;;;4612:5;4582:35;;:26;4599:8;4582:16;:26::i;:::-;:35;;;4574:44;;;;;;4629:15;4635:8;4629:5;:15::i;:::-;4403:249;;;;:::o;1612:427:16:-;1788:26;1817:19;:32;1837:11;1817:32;;;;;;;;;;;;;;;1788:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1891:1;1867:13;:20;:25;;1859:34;;;;;;1903:10;:15;;;1938:3;1926:9;:15;;;;:::i;:::-;1943:11;1956:13;1971:8;1981:14;1997:18;2017:14;1903:129;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1778:261;1612:427;;;;;:::o;4660:134:12:-;4759:27;4765:10;4777:8;4759:5;:27::i;:::-;4660:134;;;:::o;14561:726:11:-;14711:4;14731:15;:2;:13;;;:15::i;:::-;14727:554;;;14782:2;14766:36;;;14803:12;:10;:12::i;:::-;14817:4;14823:7;14832:5;14766:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14762:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15022:1;15005:6;:13;:18;15001:214;;;15047:8;;;15001:214;15167:6;15161:13;15152:6;15148:2;15144:15;15137:38;14762:467;14898:41;;;14888:51;;;:6;:51;;;;14881:58;;;;;14727:554;15266:4;15259:11;;14561:726;;;;;;;:::o;829:155:7:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;11051:1410:11:-;11171:7;11194:18;11215:16;:28;11232:10;11215:28;;;;;;;;;;;;11194:49;;11253:14;11295:1;11281:10;:15;11277:286;;;11392:10;11383:19;;11277:286;;;11542:10;11533:19;;11277:286;11573:17;11621:1;11593:25;:29;;;;:::i;:::-;11573:49;;11650:9;11636:10;:23;11632:791;;11880:22;11905:16;:27;11922:9;11905:27;;;;;;;;;;;;11880:52;;11968:1;11950:14;:19;11946:467;;;12095:9;12064:16;:28;12081:10;12064:28;;;;;;;;;;;:40;;;;11946:467;;;12278:14;12247:16;:28;12264:10;12247:28;;;;;;;;;;;:45;;;;12371:16;:27;12388:9;12371:27;;;;;;;;;;;12364:34;;;11946:467;11661:762;11632:791;12448:6;12441:13;;;;;11051:1410;;;;:::o;8841:427::-;8900:13;8916:25;8933:7;8916:16;:25::i;:::-;8900:41;;8952:48;8973:5;8988:1;8992:7;8952:20;:48::i;:::-;9038:29;9055:1;9059:7;9038:8;:29::i;:::-;9098:1;9078:9;:16;9088:5;9078:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9116:7;:16;9124:7;9116:16;;;;;;;;;;;;9109:23;;;;;;;;;;;9143:5;;:8;;;;;;;;;:::i;:::-;;;;;;9195:7;9191:1;9167:36;;9176:5;9167:36;;;;;;;;;;;;9214:47;9234:5;9249:1;9253:7;9214:19;:47::i;:::-;8890:378;8841:427;:::o;8387:237::-;8480:1;8466:16;;:2;:16;;;;8458:25;;;;;;8502:16;8510:7;8502;:16::i;:::-;8501:17;8493:26;;;;;;8547:1;8530:9;:13;8540:2;8530:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;8558:40;8586:2;8590:7;8558:27;:40::i;:::-;8609:5;;:8;;;;;;;;;:::i;:::-;;;;;;8387:237;;:::o;1175:320:4:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:20:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:102;985:6;1036:2;1032:7;1027:2;1020:5;1016:14;1012:28;1002:38;;944:102;;;:::o;1052:180::-;1100:77;1097:1;1090:88;1197:4;1194:1;1187:15;1221:4;1218:1;1211:15;1238:281;1321:27;1343:4;1321:27;:::i;:::-;1313:6;1309:40;1451:6;1439:10;1436:22;1415:18;1403:10;1400:34;1397:62;1394:88;;;1462:18;;:::i;:::-;1394:88;1502:10;1498:2;1491:22;1281:238;1238:281;;:::o;1525:129::-;1559:6;1586:20;;:::i;:::-;1576:30;;1615:33;1643:4;1635:6;1615:33;:::i;:::-;1525:129;;;:::o;1660:307::-;1721:4;1811:18;1803:6;1800:30;1797:56;;;1833:18;;:::i;:::-;1797:56;1871:29;1893:6;1871:29;:::i;:::-;1863:37;;1955:4;1949;1945:15;1937:23;;1660:307;;;:::o;1973:154::-;2057:6;2052:3;2047;2034:30;2119:1;2110:6;2105:3;2101:16;2094:27;1973:154;;;:::o;2133:410::-;2210:5;2235:65;2251:48;2292:6;2251:48;:::i;:::-;2235:65;:::i;:::-;2226:74;;2323:6;2316:5;2309:21;2361:4;2354:5;2350:16;2399:3;2390:6;2385:3;2381:16;2378:25;2375:112;;;2406:79;;:::i;:::-;2375:112;2496:41;2530:6;2525:3;2520;2496:41;:::i;:::-;2216:327;2133:410;;;;;:::o;2562:338::-;2617:5;2666:3;2659:4;2651:6;2647:17;2643:27;2633:122;;2674:79;;:::i;:::-;2633:122;2791:6;2778:20;2816:78;2890:3;2882:6;2875:4;2867:6;2863:17;2816:78;:::i;:::-;2807:87;;2623:277;2562:338;;;;:::o;2906:101::-;2942:7;2982:18;2975:5;2971:30;2960:41;;2906:101;;;:::o;3013:120::-;3085:23;3102:5;3085:23;:::i;:::-;3078:5;3075:34;3065:62;;3123:1;3120;3113:12;3065:62;3013:120;:::o;3139:137::-;3184:5;3222:6;3209:20;3200:29;;3238:32;3264:5;3238:32;:::i;:::-;3139:137;;;;:::o;3282:1117::-;3384:6;3392;3400;3408;3457:3;3445:9;3436:7;3432:23;3428:33;3425:120;;;3464:79;;:::i;:::-;3425:120;3584:1;3609:52;3653:7;3644:6;3633:9;3629:22;3609:52;:::i;:::-;3599:62;;3555:116;3738:2;3727:9;3723:18;3710:32;3769:18;3761:6;3758:30;3755:117;;;3791:79;;:::i;:::-;3755:117;3896:62;3950:7;3941:6;3930:9;3926:22;3896:62;:::i;:::-;3886:72;;3681:287;4007:2;4033:52;4077:7;4068:6;4057:9;4053:22;4033:52;:::i;:::-;4023:62;;3978:117;4162:2;4151:9;4147:18;4134:32;4193:18;4185:6;4182:30;4179:117;;;4215:79;;:::i;:::-;4179:117;4320:62;4374:7;4365:6;4354:9;4350:22;4320:62;:::i;:::-;4310:72;;4105:287;3282:1117;;;;;;;:::o;4405:149::-;4441:7;4481:66;4474:5;4470:78;4459:89;;4405:149;;;:::o;4560:120::-;4632:23;4649:5;4632:23;:::i;:::-;4625:5;4622:34;4612:62;;4670:1;4667;4660:12;4612:62;4560:120;:::o;4686:137::-;4731:5;4769:6;4756:20;4747:29;;4785:32;4811:5;4785:32;:::i;:::-;4686:137;;;;:::o;4829:327::-;4887:6;4936:2;4924:9;4915:7;4911:23;4907:32;4904:119;;;4942:79;;:::i;:::-;4904:119;5062:1;5087:52;5131:7;5122:6;5111:9;5107:22;5087:52;:::i;:::-;5077:62;;5033:116;4829:327;;;;:::o;5162:90::-;5196:7;5239:5;5232:13;5225:21;5214:32;;5162:90;;;:::o;5258:109::-;5339:21;5354:5;5339:21;:::i;:::-;5334:3;5327:34;5258:109;;:::o;5373:210::-;5460:4;5498:2;5487:9;5483:18;5475:26;;5511:65;5573:1;5562:9;5558:17;5549:6;5511:65;:::i;:::-;5373:210;;;;:::o;5589:126::-;5626:7;5666:42;5659:5;5655:54;5644:65;;5589:126;;;:::o;5721:96::-;5758:7;5787:24;5805:5;5787:24;:::i;:::-;5776:35;;5721:96;;;:::o;5823:122::-;5896:24;5914:5;5896:24;:::i;:::-;5889:5;5886:35;5876:63;;5935:1;5932;5925:12;5876:63;5823:122;:::o;5951:139::-;5997:5;6035:6;6022:20;6013:29;;6051:33;6078:5;6051:33;:::i;:::-;5951:139;;;;:::o;6096:329::-;6155:6;6204:2;6192:9;6183:7;6179:23;6175:32;6172:119;;;6210:79;;:::i;:::-;6172:119;6330:1;6355:53;6400:7;6391:6;6380:9;6376:22;6355:53;:::i;:::-;6345:63;;6301:117;6096:329;;;;:::o;6431:99::-;6483:6;6517:5;6511:12;6501:22;;6431:99;;;:::o;6536:169::-;6620:11;6654:6;6649:3;6642:19;6694:4;6689:3;6685:14;6670:29;;6536:169;;;;:::o;6711:307::-;6779:1;6789:113;6803:6;6800:1;6797:13;6789:113;;;6888:1;6883:3;6879:11;6873:18;6869:1;6864:3;6860:11;6853:39;6825:2;6822:1;6818:10;6813:15;;6789:113;;;6920:6;6917:1;6914:13;6911:101;;;7000:1;6991:6;6986:3;6982:16;6975:27;6911:101;6760:258;6711:307;;;:::o;7024:364::-;7112:3;7140:39;7173:5;7140:39;:::i;:::-;7195:71;7259:6;7254:3;7195:71;:::i;:::-;7188:78;;7275:52;7320:6;7315:3;7308:4;7301:5;7297:16;7275:52;:::i;:::-;7352:29;7374:6;7352:29;:::i;:::-;7347:3;7343:39;7336:46;;7116:272;7024:364;;;;:::o;7394:313::-;7507:4;7545:2;7534:9;7530:18;7522:26;;7594:9;7588:4;7584:20;7580:1;7569:9;7565:17;7558:47;7622:78;7695:4;7686:6;7622:78;:::i;:::-;7614:86;;7394:313;;;;:::o;7713:327::-;7771:6;7820:2;7808:9;7799:7;7795:23;7791:32;7788:119;;;7826:79;;:::i;:::-;7788:119;7946:1;7971:52;8015:7;8006:6;7995:9;7991:22;7971:52;:::i;:::-;7961:62;;7917:116;7713:327;;;;:::o;8046:77::-;8083:7;8112:5;8101:16;;8046:77;;;:::o;8129:122::-;8202:24;8220:5;8202:24;:::i;:::-;8195:5;8192:35;8182:63;;8241:1;8238;8231:12;8182:63;8129:122;:::o;8257:139::-;8303:5;8341:6;8328:20;8319:29;;8357:33;8384:5;8357:33;:::i;:::-;8257:139;;;;:::o;8402:329::-;8461:6;8510:2;8498:9;8489:7;8485:23;8481:32;8478:119;;;8516:79;;:::i;:::-;8478:119;8636:1;8661:53;8706:7;8697:6;8686:9;8682:22;8661:53;:::i;:::-;8651:63;;8607:117;8402:329;;;;:::o;8737:118::-;8824:24;8842:5;8824:24;:::i;:::-;8819:3;8812:37;8737:118;;:::o;8861:222::-;8954:4;8992:2;8981:9;8977:18;8969:26;;9005:71;9073:1;9062:9;9058:17;9049:6;9005:71;:::i;:::-;8861:222;;;;:::o;9089:474::-;9157:6;9165;9214:2;9202:9;9193:7;9189:23;9185:32;9182:119;;;9220:79;;:::i;:::-;9182:119;9340:1;9365:53;9410:7;9401:6;9390:9;9386:22;9365:53;:::i;:::-;9355:63;;9311:117;9467:2;9493:53;9538:7;9529:6;9518:9;9514:22;9493:53;:::i;:::-;9483:63;;9438:118;9089:474;;;;;:::o;9569:118::-;9656:24;9674:5;9656:24;:::i;:::-;9651:3;9644:37;9569:118;;:::o;9693:222::-;9786:4;9824:2;9813:9;9809:18;9801:26;;9837:71;9905:1;9894:9;9890:17;9881:6;9837:71;:::i;:::-;9693:222;;;;:::o;9921:619::-;9998:6;10006;10014;10063:2;10051:9;10042:7;10038:23;10034:32;10031:119;;;10069:79;;:::i;:::-;10031:119;10189:1;10214:53;10259:7;10250:6;10239:9;10235:22;10214:53;:::i;:::-;10204:63;;10160:117;10316:2;10342:53;10387:7;10378:6;10367:9;10363:22;10342:53;:::i;:::-;10332:63;;10287:118;10444:2;10470:53;10515:7;10506:6;10495:9;10491:22;10470:53;:::i;:::-;10460:63;;10415:118;9921:619;;;;;:::o;10546:116::-;10616:21;10631:5;10616:21;:::i;:::-;10609:5;10606:32;10596:60;;10652:1;10649;10642:12;10596:60;10546:116;:::o;10668:133::-;10711:5;10749:6;10736:20;10727:29;;10765:30;10789:5;10765:30;:::i;:::-;10668:133;;;;:::o;10807:1259::-;10916:6;10924;10932;10940;10948;10997:3;10985:9;10976:7;10972:23;10968:33;10965:120;;;11004:79;;:::i;:::-;10965:120;11124:1;11149:52;11193:7;11184:6;11173:9;11169:22;11149:52;:::i;:::-;11139:62;;11095:116;11278:2;11267:9;11263:18;11250:32;11309:18;11301:6;11298:30;11295:117;;;11331:79;;:::i;:::-;11295:117;11436:62;11490:7;11481:6;11470:9;11466:22;11436:62;:::i;:::-;11426:72;;11221:287;11547:2;11573:53;11618:7;11609:6;11598:9;11594:22;11573:53;:::i;:::-;11563:63;;11518:118;11675:2;11701:50;11743:7;11734:6;11723:9;11719:22;11701:50;:::i;:::-;11691:60;;11646:115;11828:3;11817:9;11813:19;11800:33;11860:18;11852:6;11849:30;11846:117;;;11882:79;;:::i;:::-;11846:117;11987:62;12041:7;12032:6;12021:9;12017:22;11987:62;:::i;:::-;11977:72;;11771:288;10807:1259;;;;;;;;:::o;12072:332::-;12193:4;12231:2;12220:9;12216:18;12208:26;;12244:71;12312:1;12301:9;12297:17;12288:6;12244:71;:::i;:::-;12325:72;12393:2;12382:9;12378:18;12369:6;12325:72;:::i;:::-;12072:332;;;;;:::o;12410:474::-;12478:6;12486;12535:2;12523:9;12514:7;12510:23;12506:32;12503:119;;;12541:79;;:::i;:::-;12503:119;12661:1;12686:53;12731:7;12722:6;12711:9;12707:22;12686:53;:::i;:::-;12676:63;;12632:117;12788:2;12814:53;12859:7;12850:6;12839:9;12835:22;12814:53;:::i;:::-;12804:63;;12759:118;12410:474;;;;;:::o;12890:332::-;13011:4;13049:2;13038:9;13034:18;13026:26;;13062:71;13130:1;13119:9;13115:17;13106:6;13062:71;:::i;:::-;13143:72;13211:2;13200:9;13196:18;13187:6;13143:72;:::i;:::-;12890:332;;;;;:::o;13228:308::-;13290:4;13380:18;13372:6;13369:30;13366:56;;;13402:18;;:::i;:::-;13366:56;13440:29;13462:6;13440:29;:::i;:::-;13432:37;;13524:4;13518;13514:15;13506:23;;13228:308;;;:::o;13542:412::-;13620:5;13645:66;13661:49;13703:6;13661:49;:::i;:::-;13645:66;:::i;:::-;13636:75;;13734:6;13727:5;13720:21;13772:4;13765:5;13761:16;13810:3;13801:6;13796:3;13792:16;13789:25;13786:112;;;13817:79;;:::i;:::-;13786:112;13907:41;13941:6;13936:3;13931;13907:41;:::i;:::-;13626:328;13542:412;;;;;:::o;13974:340::-;14030:5;14079:3;14072:4;14064:6;14060:17;14056:27;14046:122;;14087:79;;:::i;:::-;14046:122;14204:6;14191:20;14229:79;14304:3;14296:6;14289:4;14281:6;14277:17;14229:79;:::i;:::-;14220:88;;14036:278;13974:340;;;;:::o;14320:509::-;14389:6;14438:2;14426:9;14417:7;14413:23;14409:32;14406:119;;;14444:79;;:::i;:::-;14406:119;14592:1;14581:9;14577:17;14564:31;14622:18;14614:6;14611:30;14608:117;;;14644:79;;:::i;:::-;14608:117;14749:63;14804:7;14795:6;14784:9;14780:22;14749:63;:::i;:::-;14739:73;;14535:287;14320:509;;;;:::o;14835:117::-;14944:1;14941;14934:12;14958:117;15067:1;15064;15057:12;15094:552;15151:8;15161:6;15211:3;15204:4;15196:6;15192:17;15188:27;15178:122;;15219:79;;:::i;:::-;15178:122;15332:6;15319:20;15309:30;;15362:18;15354:6;15351:30;15348:117;;;15384:79;;:::i;:::-;15348:117;15498:4;15490:6;15486:17;15474:29;;15552:3;15544:4;15536:6;15532:17;15522:8;15518:32;15515:41;15512:128;;;15559:79;;:::i;:::-;15512:128;15094:552;;;;;:::o;15652:670::-;15730:6;15738;15746;15795:2;15783:9;15774:7;15770:23;15766:32;15763:119;;;15801:79;;:::i;:::-;15763:119;15921:1;15946:52;15990:7;15981:6;15970:9;15966:22;15946:52;:::i;:::-;15936:62;;15892:116;16075:2;16064:9;16060:18;16047:32;16106:18;16098:6;16095:30;16092:117;;;16128:79;;:::i;:::-;16092:117;16241:64;16297:7;16288:6;16277:9;16273:22;16241:64;:::i;:::-;16223:82;;;;16018:297;15652:670;;;;;:::o;16344:567::-;16416:8;16426:6;16476:3;16469:4;16461:6;16457:17;16453:27;16443:122;;16484:79;;:::i;:::-;16443:122;16597:6;16584:20;16574:30;;16627:18;16619:6;16616:30;16613:117;;;16649:79;;:::i;:::-;16613:117;16763:4;16755:6;16751:17;16739:29;;16817:3;16809:4;16801:6;16797:17;16787:8;16783:32;16780:41;16777:128;;;16824:79;;:::i;:::-;16777:128;16344:567;;;;;:::o;16932:579::-;17016:8;17026:6;17076:3;17069:4;17061:6;17057:17;17053:27;17043:122;;17084:79;;:::i;:::-;17043:122;17197:6;17184:20;17174:30;;17227:18;17219:6;17216:30;17213:117;;;17249:79;;:::i;:::-;17213:117;17363:4;17355:6;17351:17;17339:29;;17417:3;17409:4;17401:6;17397:17;17387:8;17383:32;17380:41;17377:128;;;17424:79;;:::i;:::-;17377:128;16932:579;;;;;:::o;17517:954::-;17649:6;17657;17665;17673;17722:2;17710:9;17701:7;17697:23;17693:32;17690:119;;;17728:79;;:::i;:::-;17690:119;17876:1;17865:9;17861:17;17848:31;17906:18;17898:6;17895:30;17892:117;;;17928:79;;:::i;:::-;17892:117;18041:79;18112:7;18103:6;18092:9;18088:22;18041:79;:::i;:::-;18023:97;;;;17819:311;18197:2;18186:9;18182:18;18169:32;18228:18;18220:6;18217:30;18214:117;;;18250:79;;:::i;:::-;18214:117;18363:91;18446:7;18437:6;18426:9;18422:22;18363:91;:::i;:::-;18345:109;;;;18140:324;17517:954;;;;;;;:::o;18477:104::-;18522:7;18551:24;18569:5;18551:24;:::i;:::-;18540:35;;18477:104;;;:::o;18587:138::-;18668:32;18694:5;18668:32;:::i;:::-;18661:5;18658:43;18648:71;;18715:1;18712;18705:12;18648:71;18587:138;:::o;18731:155::-;18785:5;18823:6;18810:20;18801:29;;18839:41;18874:5;18839:41;:::i;:::-;18731:155;;;;:::o;18892:1573::-;19030:6;19038;19046;19054;19062;19070;19078;19127:3;19115:9;19106:7;19102:23;19098:33;19095:120;;;19134:79;;:::i;:::-;19095:120;19254:1;19279:53;19324:7;19315:6;19304:9;19300:22;19279:53;:::i;:::-;19269:63;;19225:117;19381:2;19407:52;19451:7;19442:6;19431:9;19427:22;19407:52;:::i;:::-;19397:62;;19352:117;19536:2;19525:9;19521:18;19508:32;19567:18;19559:6;19556:30;19553:117;;;19589:79;;:::i;:::-;19553:117;19694:62;19748:7;19739:6;19728:9;19724:22;19694:62;:::i;:::-;19684:72;;19479:287;19805:2;19831:53;19876:7;19867:6;19856:9;19852:22;19831:53;:::i;:::-;19821:63;;19776:118;19933:3;19960:61;20013:7;20004:6;19993:9;19989:22;19960:61;:::i;:::-;19950:71;;19904:127;20070:3;20097:53;20142:7;20133:6;20122:9;20118:22;20097:53;:::i;:::-;20087:63;;20041:119;20227:3;20216:9;20212:19;20199:33;20259:18;20251:6;20248:30;20245:117;;;20281:79;;:::i;:::-;20245:117;20386:62;20440:7;20431:6;20420:9;20416:22;20386:62;:::i;:::-;20376:72;;20170:288;18892:1573;;;;;;;;;;:::o;20471:793::-;20555:6;20563;20571;20620:2;20608:9;20599:7;20595:23;20591:32;20588:119;;;20626:79;;:::i;:::-;20588:119;20746:1;20771:52;20815:7;20806:6;20795:9;20791:22;20771:52;:::i;:::-;20761:62;;20717:116;20900:2;20889:9;20885:18;20872:32;20931:18;20923:6;20920:30;20917:117;;;20953:79;;:::i;:::-;20917:117;21058:62;21112:7;21103:6;21092:9;21088:22;21058:62;:::i;:::-;21048:72;;20843:287;21169:2;21195:52;21239:7;21230:6;21219:9;21215:22;21195:52;:::i;:::-;21185:62;;21140:117;20471:793;;;;;:::o;21270:77::-;21307:7;21336:5;21325:16;;21270:77;;;:::o;21353:118::-;21440:24;21458:5;21440:24;:::i;:::-;21435:3;21428:37;21353:118;;:::o;21477:222::-;21570:4;21608:2;21597:9;21593:18;21585:26;;21621:71;21689:1;21678:9;21674:17;21665:6;21621:71;:::i;:::-;21477:222;;;;:::o;21705:311::-;21782:4;21872:18;21864:6;21861:30;21858:56;;;21894:18;;:::i;:::-;21858:56;21944:4;21936:6;21932:17;21924:25;;22004:4;21998;21994:15;21986:23;;21705:311;;;:::o;22039:710::-;22135:5;22160:81;22176:64;22233:6;22176:64;:::i;:::-;22160:81;:::i;:::-;22151:90;;22261:5;22290:6;22283:5;22276:21;22324:4;22317:5;22313:16;22306:23;;22377:4;22369:6;22365:17;22357:6;22353:30;22406:3;22398:6;22395:15;22392:122;;;22425:79;;:::i;:::-;22392:122;22540:6;22523:220;22557:6;22552:3;22549:15;22523:220;;;22632:3;22661:37;22694:3;22682:10;22661:37;:::i;:::-;22656:3;22649:50;22728:4;22723:3;22719:14;22712:21;;22599:144;22583:4;22578:3;22574:14;22567:21;;22523:220;;;22527:21;22141:608;;22039:710;;;;;:::o;22772:370::-;22843:5;22892:3;22885:4;22877:6;22873:17;22869:27;22859:122;;22900:79;;:::i;:::-;22859:122;23017:6;23004:20;23042:94;23132:3;23124:6;23117:4;23109:6;23105:17;23042:94;:::i;:::-;23033:103;;22849:293;22772:370;;;;:::o;23148:684::-;23241:6;23249;23298:2;23286:9;23277:7;23273:23;23269:32;23266:119;;;23304:79;;:::i;:::-;23266:119;23452:1;23441:9;23437:17;23424:31;23482:18;23474:6;23471:30;23468:117;;;23504:79;;:::i;:::-;23468:117;23609:78;23679:7;23670:6;23659:9;23655:22;23609:78;:::i;:::-;23599:88;;23395:302;23736:2;23762:53;23807:7;23798:6;23787:9;23783:22;23762:53;:::i;:::-;23752:63;;23707:118;23148:684;;;;;:::o;23838:98::-;23889:6;23923:5;23917:12;23907:22;;23838:98;;;:::o;23942:168::-;24025:11;24059:6;24054:3;24047:19;24099:4;24094:3;24090:14;24075:29;;23942:168;;;;:::o;24116:360::-;24202:3;24230:38;24262:5;24230:38;:::i;:::-;24284:70;24347:6;24342:3;24284:70;:::i;:::-;24277:77;;24363:52;24408:6;24403:3;24396:4;24389:5;24385:16;24363:52;:::i;:::-;24440:29;24462:6;24440:29;:::i;:::-;24435:3;24431:39;24424:46;;24206:270;24116:360;;;;:::o;24482:309::-;24593:4;24631:2;24620:9;24616:18;24608:26;;24680:9;24674:4;24670:20;24666:1;24655:9;24651:17;24644:47;24708:76;24779:4;24770:6;24708:76;:::i;:::-;24700:84;;24482:309;;;;:::o;24797:468::-;24862:6;24870;24919:2;24907:9;24898:7;24894:23;24890:32;24887:119;;;24925:79;;:::i;:::-;24887:119;25045:1;25070:53;25115:7;25106:6;25095:9;25091:22;25070:53;:::i;:::-;25060:63;;25016:117;25172:2;25198:50;25240:7;25231:6;25220:9;25216:22;25198:50;:::i;:::-;25188:60;;25143:115;24797:468;;;;;:::o;25271:60::-;25299:3;25320:5;25313:12;;25271:60;;;:::o;25337:142::-;25387:9;25420:53;25438:34;25447:24;25465:5;25447:24;:::i;:::-;25438:34;:::i;:::-;25420:53;:::i;:::-;25407:66;;25337:142;;;:::o;25485:126::-;25535:9;25568:37;25599:5;25568:37;:::i;:::-;25555:50;;25485:126;;;:::o;25617:153::-;25694:9;25727:37;25758:5;25727:37;:::i;:::-;25714:50;;25617:153;;;:::o;25776:185::-;25890:64;25948:5;25890:64;:::i;:::-;25885:3;25878:77;25776:185;;:::o;25967:276::-;26087:4;26125:2;26114:9;26110:18;26102:26;;26138:98;26233:1;26222:9;26218:17;26209:6;26138:98;:::i;:::-;25967:276;;;;:::o;26249:943::-;26344:6;26352;26360;26368;26417:3;26405:9;26396:7;26392:23;26388:33;26385:120;;;26424:79;;:::i;:::-;26385:120;26544:1;26569:53;26614:7;26605:6;26594:9;26590:22;26569:53;:::i;:::-;26559:63;;26515:117;26671:2;26697:53;26742:7;26733:6;26722:9;26718:22;26697:53;:::i;:::-;26687:63;;26642:118;26799:2;26825:53;26870:7;26861:6;26850:9;26846:22;26825:53;:::i;:::-;26815:63;;26770:118;26955:2;26944:9;26940:18;26927:32;26986:18;26978:6;26975:30;26972:117;;;27008:79;;:::i;:::-;26972:117;27113:62;27167:7;27158:6;27147:9;27143:22;27113:62;:::i;:::-;27103:72;;26898:287;26249:943;;;;;;;:::o;27198:959::-;27293:6;27301;27309;27317;27325;27374:3;27362:9;27353:7;27349:23;27345:33;27342:120;;;27381:79;;:::i;:::-;27342:120;27501:1;27526:52;27570:7;27561:6;27550:9;27546:22;27526:52;:::i;:::-;27516:62;;27472:116;27627:2;27653:52;27697:7;27688:6;27677:9;27673:22;27653:52;:::i;:::-;27643:62;;27598:117;27754:2;27780:53;27825:7;27816:6;27805:9;27801:22;27780:53;:::i;:::-;27770:63;;27725:118;27910:2;27899:9;27895:18;27882:32;27941:18;27933:6;27930:30;27927:117;;;27963:79;;:::i;:::-;27927:117;28076:64;28132:7;28123:6;28112:9;28108:22;28076:64;:::i;:::-;28058:82;;;;27853:297;27198:959;;;;;;;;:::o;28163:474::-;28231:6;28239;28288:2;28276:9;28267:7;28263:23;28259:32;28256:119;;;28294:79;;:::i;:::-;28256:119;28414:1;28439:53;28484:7;28475:6;28464:9;28460:22;28439:53;:::i;:::-;28429:63;;28385:117;28541:2;28567:53;28612:7;28603:6;28592:9;28588:22;28567:53;:::i;:::-;28557:63;;28512:118;28163:474;;;;;:::o;28643:761::-;28727:6;28735;28743;28751;28800:3;28788:9;28779:7;28775:23;28771:33;28768:120;;;28807:79;;:::i;:::-;28768:120;28927:1;28952:52;28996:7;28987:6;28976:9;28972:22;28952:52;:::i;:::-;28942:62;;28898:116;29053:2;29079:52;29123:7;29114:6;29103:9;29099:22;29079:52;:::i;:::-;29069:62;;29024:117;29180:2;29206:53;29251:7;29242:6;29231:9;29227:22;29206:53;:::i;:::-;29196:63;;29151:118;29308:2;29334:53;29379:7;29370:6;29359:9;29355:22;29334:53;:::i;:::-;29324:63;;29279:118;28643:761;;;;;;;:::o;29410:180::-;29458:77;29455:1;29448:88;29555:4;29552:1;29545:15;29579:4;29576:1;29569:15;29596:320;29640:6;29677:1;29671:4;29667:12;29657:22;;29724:1;29718:4;29714:12;29745:18;29735:81;;29801:4;29793:6;29789:17;29779:27;;29735:81;29863:2;29855:6;29852:14;29832:18;29829:38;29826:84;;;29882:18;;:::i;:::-;29826:84;29647:269;29596:320;;;:::o;29922:182::-;30062:34;30058:1;30050:6;30046:14;30039:58;29922:182;:::o;30110:366::-;30252:3;30273:67;30337:2;30332:3;30273:67;:::i;:::-;30266:74;;30349:93;30438:3;30349:93;:::i;:::-;30467:2;30462:3;30458:12;30451:19;;30110:366;;;:::o;30482:419::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:115::-;30992:23;31009:5;30992:23;:::i;:::-;30987:3;30980:36;30907:115;;:::o;31028:218::-;31119:4;31157:2;31146:9;31142:18;31134:26;;31170:69;31236:1;31225:9;31221:17;31212:6;31170:69;:::i;:::-;31028:218;;;;:::o;31252:148::-;31354:11;31391:3;31376:18;;31252:148;;;;:::o;31406:141::-;31455:4;31478:3;31470:11;;31501:3;31498:1;31491:14;31535:4;31532:1;31522:18;31514:26;;31406:141;;;:::o;31577:845::-;31680:3;31717:5;31711:12;31746:36;31772:9;31746:36;:::i;:::-;31798:89;31880:6;31875:3;31798:89;:::i;:::-;31791:96;;31918:1;31907:9;31903:17;31934:1;31929:137;;;;32080:1;32075:341;;;;31896:520;;31929:137;32013:4;32009:9;31998;31994:25;31989:3;31982:38;32049:6;32044:3;32040:16;32033:23;;31929:137;;32075:341;32142:38;32174:5;32142:38;:::i;:::-;32202:1;32216:154;32230:6;32227:1;32224:13;32216:154;;;32304:7;32298:14;32294:1;32289:3;32285:11;32278:35;32354:1;32345:7;32341:15;32330:26;;32252:4;32249:1;32245:12;32240:17;;32216:154;;;32399:6;32394:3;32390:16;32383:23;;32082:334;;31896:520;;31684:738;;31577:845;;;;:::o;32428:377::-;32534:3;32562:39;32595:5;32562:39;:::i;:::-;32617:89;32699:6;32694:3;32617:89;:::i;:::-;32610:96;;32715:52;32760:6;32755:3;32748:4;32741:5;32737:16;32715:52;:::i;:::-;32792:6;32787:3;32783:16;32776:23;;32538:267;32428:377;;;;:::o;32811:429::-;32988:3;33010:92;33098:3;33089:6;33010:92;:::i;:::-;33003:99;;33119:95;33210:3;33201:6;33119:95;:::i;:::-;33112:102;;33231:3;33224:10;;32811:429;;;;;:::o;33246:76::-;33282:7;33311:5;33300:16;;33246:76;;;:::o;33328:180::-;33376:77;33373:1;33366:88;33473:4;33470:1;33463:15;33497:4;33494:1;33487:15;33514:525;33553:3;33572:19;33589:1;33572:19;:::i;:::-;33567:24;;33605:19;33622:1;33605:19;:::i;:::-;33600:24;;33793:1;33725:66;33721:74;33718:1;33714:82;33709:1;33706;33702:9;33695:17;33691:106;33688:132;;;33800:18;;:::i;:::-;33688:132;33980:1;33912:66;33908:74;33905:1;33901:82;33897:1;33894;33890:9;33886:98;33883:124;;;33987:18;;:::i;:::-;33883:124;34031:1;34028;34024:9;34017:16;;33514:525;;;;:::o;34045:419::-;34184:4;34222:2;34211:9;34207:18;34199:26;;34271:9;34265:4;34261:20;34257:1;34246:9;34242:17;34235:47;34299:76;34370:4;34361:6;34299:76;:::i;:::-;34291:84;;34385:72;34453:2;34442:9;34438:18;34429:6;34385:72;:::i;:::-;34045:419;;;;;:::o;34470:822::-;34703:4;34741:3;34730:9;34726:19;34718:27;;34755:69;34821:1;34810:9;34806:17;34797:6;34755:69;:::i;:::-;34834:72;34902:2;34891:9;34887:18;34878:6;34834:72;:::i;:::-;34953:9;34947:4;34943:20;34938:2;34927:9;34923:18;34916:48;34981:76;35052:4;35043:6;34981:76;:::i;:::-;34973:84;;35067:66;35129:2;35118:9;35114:18;35105:6;35067:66;:::i;:::-;35181:9;35175:4;35171:20;35165:3;35154:9;35150:19;35143:49;35209:76;35280:4;35271:6;35209:76;:::i;:::-;35201:84;;34470:822;;;;;;;;:::o;35298:143::-;35355:5;35386:6;35380:13;35371:22;;35402:33;35429:5;35402:33;:::i;:::-;35298:143;;;;:::o;35447:507::-;35526:6;35534;35583:2;35571:9;35562:7;35558:23;35554:32;35551:119;;;35589:79;;:::i;:::-;35551:119;35709:1;35734:64;35790:7;35781:6;35770:9;35766:22;35734:64;:::i;:::-;35724:74;;35680:128;35847:2;35873:64;35929:7;35920:6;35909:9;35905:22;35873:64;:::i;:::-;35863:74;;35818:129;35447:507;;;;;:::o;35960:348::-;36000:7;36023:20;36041:1;36023:20;:::i;:::-;36018:25;;36057:20;36075:1;36057:20;:::i;:::-;36052:25;;36245:1;36177:66;36173:74;36170:1;36167:81;36162:1;36155:9;36148:17;36144:105;36141:131;;;36252:18;;:::i;:::-;36141:131;36300:1;36297;36293:9;36282:20;;35960:348;;;;:::o;36314:180::-;36362:77;36359:1;36352:88;36459:4;36456:1;36449:15;36483:4;36480:1;36473:15;36500:185;36540:1;36557:20;36575:1;36557:20;:::i;:::-;36552:25;;36591:20;36609:1;36591:20;:::i;:::-;36586:25;;36630:1;36620:35;;36635:18;;:::i;:::-;36620:35;36677:1;36674;36670:9;36665:14;;36500:185;;;;:::o;36691:147::-;36792:11;36829:3;36814:18;;36691:147;;;;:::o;36866:314::-;36980:3;37001:88;37082:6;37077:3;37001:88;:::i;:::-;36994:95;;37099:43;37135:6;37130:3;37123:5;37099:43;:::i;:::-;37167:6;37162:3;37158:16;37151:23;;36866:314;;;;;:::o;37186:291::-;37326:3;37348:103;37447:3;37438:6;37430;37348:103;:::i;:::-;37341:110;;37468:3;37461:10;;37186:291;;;;;:::o;37483:305::-;37523:3;37542:20;37560:1;37542:20;:::i;:::-;37537:25;;37576:20;37594:1;37576:20;:::i;:::-;37571:25;;37730:1;37662:66;37658:74;37655:1;37652:81;37649:107;;;37736:18;;:::i;:::-;37649:107;37780:1;37777;37773:9;37766:16;;37483:305;;;;:::o;37816:301::-;37912:3;37933:70;37996:6;37991:3;37933:70;:::i;:::-;37926:77;;38013:43;38049:6;38044:3;38037:5;38013:43;:::i;:::-;38081:29;38103:6;38081:29;:::i;:::-;38076:3;38072:39;38065:46;;37816:301;;;;;:::o;38123:435::-;38270:4;38308:2;38297:9;38293:18;38285:26;;38321:69;38387:1;38376:9;38372:17;38363:6;38321:69;:::i;:::-;38437:9;38431:4;38427:20;38422:2;38411:9;38407:18;38400:48;38465:86;38546:4;38537:6;38529;38465:86;:::i;:::-;38457:94;;38123:435;;;;;;:::o;38564:180::-;38612:77;38609:1;38602:88;38709:4;38706:1;38699:15;38733:4;38730:1;38723:15;38750:117;38859:1;38856;38849:12;38873:117;38982:1;38979;38972:12;38996:117;39105:1;39102;39095:12;39119:724;39196:4;39202:6;39258:11;39245:25;39358:1;39352:4;39348:12;39337:8;39321:14;39317:29;39313:48;39293:18;39289:73;39279:168;;39366:79;;:::i;:::-;39279:168;39478:18;39468:8;39464:33;39456:41;;39530:4;39517:18;39507:28;;39558:18;39550:6;39547:30;39544:117;;;39580:79;;:::i;:::-;39544:117;39688:2;39682:4;39678:13;39670:21;;39745:4;39737:6;39733:17;39717:14;39713:38;39707:4;39703:49;39700:136;;;39755:79;;:::i;:::-;39700:136;39209:634;39119:724;;;;;:::o;39849:233::-;39888:3;39911:24;39929:5;39911:24;:::i;:::-;39902:33;;39957:66;39950:5;39947:77;39944:103;;;40027:18;;:::i;:::-;39944:103;40074:1;40067:5;40063:13;40056:20;;39849:233;;;:::o;40088:191::-;40128:4;40148:20;40166:1;40148:20;:::i;:::-;40143:25;;40182:20;40200:1;40182:20;:::i;:::-;40177:25;;40221:1;40218;40215:8;40212:34;;;40226:18;;:::i;:::-;40212:34;40271:1;40268;40264:9;40256:17;;40088:191;;;;:::o;40285:435::-;40465:3;40487:95;40578:3;40569:6;40487:95;:::i;:::-;40480:102;;40599:95;40690:3;40681:6;40599:95;:::i;:::-;40592:102;;40711:3;40704:10;;40285:435;;;;;:::o;40726:652::-;40927:4;40965:3;40954:9;40950:19;40942:27;;40979:69;41045:1;41034:9;41030:17;41021:6;40979:69;:::i;:::-;41058:70;41124:2;41113:9;41109:18;41100:6;41058:70;:::i;:::-;41138:72;41206:2;41195:9;41191:18;41182:6;41138:72;:::i;:::-;41257:9;41251:4;41247:20;41242:2;41231:9;41227:18;41220:48;41285:86;41366:4;41357:6;41349;41285:86;:::i;:::-;41277:94;;40726:652;;;;;;;;:::o;41384:373::-;41488:3;41516:38;41548:5;41516:38;:::i;:::-;41570:88;41651:6;41646:3;41570:88;:::i;:::-;41563:95;;41667:52;41712:6;41707:3;41700:4;41693:5;41689:16;41667:52;:::i;:::-;41744:6;41739:3;41735:16;41728:23;;41492:265;41384:373;;;;:::o;41763:271::-;41893:3;41915:93;42004:3;41995:6;41915:93;:::i;:::-;41908:100;;42025:3;42018:10;;41763:271;;;;:::o;42040:225::-;42180:34;42176:1;42168:6;42164:14;42157:58;42249:8;42244:2;42236:6;42232:15;42225:33;42040:225;:::o;42271:366::-;42413:3;42434:67;42498:2;42493:3;42434:67;:::i;:::-;42427:74;;42510:93;42599:3;42510:93;:::i;:::-;42628:2;42623:3;42619:12;42612:19;;42271:366;;;:::o;42643:419::-;42809:4;42847:2;42836:9;42832:18;42824:26;;42896:9;42890:4;42886:20;42882:1;42871:9;42867:17;42860:47;42924:131;43050:4;42924:131;:::i;:::-;42916:139;;42643:419;;;:::o;43068:545::-;43241:4;43279:3;43268:9;43264:19;43256:27;;43293:69;43359:1;43348:9;43344:17;43335:6;43293:69;:::i;:::-;43372:70;43438:2;43427:9;43423:18;43414:6;43372:70;:::i;:::-;43452:72;43520:2;43509:9;43505:18;43496:6;43452:72;:::i;:::-;43534;43602:2;43591:9;43587:18;43578:6;43534:72;:::i;:::-;43068:545;;;;;;;:::o;43619:419::-;43707:5;43732:65;43748:48;43789:6;43748:48;:::i;:::-;43732:65;:::i;:::-;43723:74;;43820:6;43813:5;43806:21;43858:4;43851:5;43847:16;43896:3;43887:6;43882:3;43878:16;43875:25;43872:112;;;43903:79;;:::i;:::-;43872:112;43993:39;44025:6;44020:3;44015;43993:39;:::i;:::-;43713:325;43619:419;;;;;:::o;44057:353::-;44123:5;44172:3;44165:4;44157:6;44153:17;44149:27;44139:122;;44180:79;;:::i;:::-;44139:122;44290:6;44284:13;44315:89;44400:3;44392:6;44385:4;44377:6;44373:17;44315:89;:::i;:::-;44306:98;;44129:281;44057:353;;;;:::o;44416:522::-;44495:6;44544:2;44532:9;44523:7;44519:23;44515:32;44512:119;;;44550:79;;:::i;:::-;44512:119;44691:1;44680:9;44676:17;44670:24;44721:18;44713:6;44710:30;44707:117;;;44743:79;;:::i;:::-;44707:117;44848:73;44913:7;44904:6;44893:9;44889:22;44848:73;:::i;:::-;44838:83;;44641:290;44416:522;;;;:::o;44944:115::-;45029:23;45046:5;45029:23;:::i;:::-;45024:3;45017:36;44944:115;;:::o;45065:719::-;45274:4;45312:3;45301:9;45297:19;45289:27;;45326:69;45392:1;45381:9;45377:17;45368:6;45326:69;:::i;:::-;45442:9;45436:4;45432:20;45427:2;45416:9;45412:18;45405:48;45470:76;45541:4;45532:6;45470:76;:::i;:::-;45462:84;;45556:70;45622:2;45611:9;45607:18;45598:6;45556:70;:::i;:::-;45673:9;45667:4;45663:20;45658:2;45647:9;45643:18;45636:48;45701:76;45772:4;45763:6;45701:76;:::i;:::-;45693:84;;45065:719;;;;;;;:::o;45790:176::-;45822:1;45839:20;45857:1;45839:20;:::i;:::-;45834:25;;45873:20;45891:1;45873:20;:::i;:::-;45868:25;;45912:1;45902:35;;45917:18;;:::i;:::-;45902:35;45958:1;45955;45951:9;45946:14;;45790:176;;;;:::o;45972:171::-;46011:3;46034:24;46052:5;46034:24;:::i;:::-;46025:33;;46080:4;46073:5;46070:15;46067:41;;;46088:18;;:::i;:::-;46067:41;46135:1;46128:5;46124:13;46117:20;;45972:171;;;:::o;46149:328::-;46268:4;46306:2;46295:9;46291:18;46283:26;;46319:69;46385:1;46374:9;46370:17;46361:6;46319:69;:::i;:::-;46398:72;46466:2;46455:9;46451:18;46442:6;46398:72;:::i;:::-;46149:328;;;;;:::o;46483:141::-;46539:5;46570:6;46564:13;46555:22;;46586:32;46612:5;46586:32;:::i;:::-;46483:141;;;;:::o;46630:349::-;46699:6;46748:2;46736:9;46727:7;46723:23;46719:32;46716:119;;;46754:79;;:::i;:::-;46716:119;46874:1;46899:63;46954:7;46945:6;46934:9;46930:22;46899:63;:::i;:::-;46889:73;;46845:127;46630:349;;;;:::o;46985:328::-;47104:4;47142:2;47131:9;47127:18;47119:26;;47155:71;47223:1;47212:9;47208:17;47199:6;47155:71;:::i;:::-;47236:70;47302:2;47291:9;47287:18;47278:6;47236:70;:::i;:::-;46985:328;;;;;:::o;47319:678::-;47407:6;47415;47464:2;47452:9;47443:7;47439:23;47435:32;47432:119;;;47470:79;;:::i;:::-;47432:119;47611:1;47600:9;47596:17;47590:24;47641:18;47633:6;47630:30;47627:117;;;47663:79;;:::i;:::-;47627:117;47768:73;47833:7;47824:6;47813:9;47809:22;47768:73;:::i;:::-;47758:83;;47561:290;47890:2;47916:64;47972:7;47963:6;47952:9;47948:22;47916:64;:::i;:::-;47906:74;;47861:129;47319:678;;;;;:::o;48003:997::-;48292:4;48330:3;48319:9;48315:19;48307:27;;48344:71;48412:1;48401:9;48397:17;48388:6;48344:71;:::i;:::-;48425:72;48493:2;48482:9;48478:18;48469:6;48425:72;:::i;:::-;48507;48575:2;48564:9;48560:18;48551:6;48507:72;:::i;:::-;48589;48657:2;48646:9;48642:18;48633:6;48589:72;:::i;:::-;48671:73;48739:3;48728:9;48724:19;48715:6;48671:73;:::i;:::-;48754;48822:3;48811:9;48807:19;48798:6;48754:73;:::i;:::-;48837;48905:3;48894:9;48890:19;48881:6;48837:73;:::i;:::-;48920;48988:3;48977:9;48973:19;48964:6;48920:73;:::i;:::-;48003:997;;;;;;;;;;;:::o;49006:142::-;49109:32;49135:5;49109:32;:::i;:::-;49104:3;49097:45;49006:142;;:::o;49154:1064::-;49455:4;49493:3;49482:9;49478:19;49470:27;;49507:69;49573:1;49562:9;49558:17;49549:6;49507:69;:::i;:::-;49623:9;49617:4;49613:20;49608:2;49597:9;49593:18;49586:48;49651:76;49722:4;49713:6;49651:76;:::i;:::-;49643:84;;49774:9;49768:4;49764:20;49759:2;49748:9;49744:18;49737:48;49802:76;49873:4;49864:6;49802:76;:::i;:::-;49794:84;;49888:88;49972:2;49961:9;49957:18;49948:6;49888:88;:::i;:::-;49986:73;50054:3;50043:9;50039:19;50030:6;49986:73;:::i;:::-;50107:9;50101:4;50097:20;50091:3;50080:9;50076:19;50069:49;50135:76;50206:4;50197:6;50135:76;:::i;:::-;50127:84;;49154:1064;;;;;;;;;:::o;50224:640::-;50419:4;50457:3;50446:9;50442:19;50434:27;;50471:71;50539:1;50528:9;50524:17;50515:6;50471:71;:::i;:::-;50552:72;50620:2;50609:9;50605:18;50596:6;50552:72;:::i;:::-;50634;50702:2;50691:9;50687:18;50678:6;50634:72;:::i;:::-;50753:9;50747:4;50743:20;50738:2;50727:9;50723:18;50716:48;50781:76;50852:4;50843:6;50781:76;:::i;:::-;50773:84;;50224:640;;;;;;;:::o;50870:141::-;50926:5;50957:6;50951:13;50942:22;;50973:32;50999:5;50973:32;:::i;:::-;50870:141;;;;:::o;51017:349::-;51086:6;51135:2;51123:9;51114:7;51110:23;51106:32;51103:119;;;51141:79;;:::i;:::-;51103:119;51261:1;51286:63;51341:7;51332:6;51321:9;51317:22;51286:63;:::i;:::-;51276:73;;51232:127;51017:349;;;;:::o;51372:231::-;51410:3;51433:23;51450:5;51433:23;:::i;:::-;51424:32;;51478:66;51471:5;51468:77;51465:103;;;51548:18;;:::i;:::-;51465:103;51595:1;51588:5;51584:13;51577:20;;51372:231;;;:::o;51609:::-;51647:3;51670:23;51687:5;51670:23;:::i;:::-;51661:32;;51715:66;51708:5;51705:77;51702:103;;;51785:18;;:::i;:::-;51702:103;51832:1;51825:5;51821:13;51814:20;;51609:231;;;:::o

Swarm Source

ipfs://465ae67298535ba81083378fd3c590767c4c1d8b44ebbd85e6f9556e058d30c4
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.