ETH Price: $3,934.47 (+0.74%)

Token

Hobgoblintown (HGT)
 

Overview

Max Total Supply

10,000 HGT

Holders

4,809

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HGT
0xfdb818a6e5514e3e53b6bd5d4841122b52213ce9
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:
Hobgoblintown

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        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);
    }
 
    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);
    }
 
    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);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    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");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    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");
    }
 
    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);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    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);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    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);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract Hobgoblintown is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;


  uint256 public MAX_PER_Transaction = 1; // maximam amount that user can mint/Transaction
  uint256 public MAX_PER_WALLET = 1; // maximam amount that user can mint/Wallet

  mapping(address => uint256) public publicClaimedBy;

  uint256 public  PRICE = 0 ether; 

  uint256 private constant TotalCollectionSize_ = 10000; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 20; //max mint per transaction

  string private _baseTokenURI;
  uint public reserve = 0;


  uint public status = 0; //0-pause 1-public

  constructor() ERC721A("Hobgoblintown","HGT") {

  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 1 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");

    publicClaimedBy[msg.sender] += quantity;
    require(publicClaimedBy[msg.sender] <= MAX_PER_WALLET, "Purchase exceeds max allowed");


    _safeMint(msg.sender, quantity);
  }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }

   function changeMAX_PER_WALLET(uint256 q) external onlyOwner
  {
      MAX_PER_WALLET = q;
  }

  function changeMAX_PER_Transaction(uint256 q) external onlyOwner
  {
      MAX_PER_Transaction = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

  function airdrop(address sendTo, uint quantity)public onlyOwner{
    require(totalSupply() + quantity <= TotalCollectionSize_, "reached max supply");
    _safeMint(sendTo, quantity);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sendTo","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600a556001600b556000600d556000600f5560006010553480156200002a57600080fd5b506040518060400160405280600d81526020017f486f62676f626c696e746f776e000000000000000000000000000000000000008152506040518060400160405280600381526020017f4847540000000000000000000000000000000000000000000000000000000000815250620000b7620000ab6200010f60201b60201c565b6200011760201b60201c565b8160039080519060200190620000cf929190620001e4565b508060049080519060200190620000e8929190620001e4565b50620000f9620001db60201b60201c565b60018190555050506001600981905550620002f9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001f29062000294565b90600052602060002090601f01602090048101928262000216576000855562000262565b82601f106200023157805160ff191683800117855562000262565b8280016001018555821562000262579182015b828111156200026157825182559160200191906001019062000244565b5b50905062000271919062000275565b5090565b5b808211156200029057600081600090555060010162000276565b5090565b60006002820490506001821680620002ad57607f821691505b60208210811415620002c457620002c3620002ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fd680620003096000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a22cb465116100ab578063cd3293de1161006f578063cd3293de146107ac578063dc33e681146107d7578063e757223014610814578063e985e9c514610851578063f2fde38b1461088e5761021a565b8063a22cb465146106dd578063a40ece7a14610706578063ac4460021461072f578063b88d4fde14610746578063c87b56dd1461076f5761021a565b80638d859f3e116100f25780638d859f3e146106035780638da5cb5b1461062e5780639231ab2a1461065957806395d89b4114610696578063a0712d68146106c15761021a565b806370a0823114610549578063715018a614610586578063752361431461059d5780638ba4cc3c146105da5761021a565b80632ba2865b116101a657806351d7ff931161017557806351d7ff931461046657806355f804b3146104915780636352211e146104ba57806369ba1a75146104f75780636a44e173146105205761021a565b80632ba2865b146103c05780633fd17366146103e957806342842e0e146104125780634e69d5601461043b5761021a565b80630f2cdd6c116101ed5780630f2cdd6c146102ed57806318160ddd14610318578063200d2ed21461034357806323b872dd1461036e578063288bd8fd146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061312b565b6108b7565b60405161025391906135fd565b60405180910390f35b34801561026857600080fd5b50610271610999565b60405161027e9190613618565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906131ce565b610a2b565b6040516102bb9190613596565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906130eb565b610aa7565b005b3480156102f957600080fd5b50610302610bb2565b60405161030f91906137d5565b60405180910390f35b34801561032457600080fd5b5061032d610bb8565b60405161033a91906137d5565b60405180910390f35b34801561034f57600080fd5b50610358610bcf565b60405161036591906137d5565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612fd5565b610bd5565b005b3480156103a357600080fd5b506103be60048036038101906103b991906131ce565b610be5565b005b3480156103cc57600080fd5b506103e760048036038101906103e291906131ce565b610ccc565b005b3480156103f557600080fd5b50610410600480360381019061040b91906131ce565b610d52565b005b34801561041e57600080fd5b5061043960048036038101906104349190612fd5565b610dd8565b005b34801561044757600080fd5b50610450610df8565b60405161045d91906137d5565b60405180910390f35b34801561047257600080fd5b5061047b610e02565b60405161048891906137d5565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613185565b610e08565b005b3480156104c657600080fd5b506104e160048036038101906104dc91906131ce565b610e9e565b6040516104ee9190613596565b60405180910390f35b34801561050357600080fd5b5061051e600480360381019061051991906131ce565b610eb4565b005b34801561052c57600080fd5b50610547600480360381019061054291906131ce565b610f3a565b005b34801561055557600080fd5b50610570600480360381019061056b9190612f68565b610fc0565b60405161057d91906137d5565b60405180910390f35b34801561059257600080fd5b5061059b611090565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190612f68565b611118565b6040516105d191906137d5565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906130eb565b611130565b005b34801561060f57600080fd5b50610618611211565b60405161062591906137d5565b60405180910390f35b34801561063a57600080fd5b50610643611217565b6040516106509190613596565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b91906131ce565b611240565b60405161068d91906137ba565b60405180910390f35b3480156106a257600080fd5b506106ab611258565b6040516106b89190613618565b60405180910390f35b6106db60048036038101906106d691906131ce565b6112ea565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906130ab565b61157d565b005b34801561071257600080fd5b5061072d600480360381019061072891906131ce565b6116f5565b005b34801561073b57600080fd5b5061074461177b565b005b34801561075257600080fd5b5061076d60048036038101906107689190613028565b6118fc565b005b34801561077b57600080fd5b50610796600480360381019061079191906131ce565b611978565b6040516107a39190613618565b60405180910390f35b3480156107b857600080fd5b506107c1611a1f565b6040516107ce91906137d5565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190612f68565b611a25565b60405161080b91906137d5565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906131ce565b611a37565b60405161084891906137d5565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190612f95565b611a4e565b60405161088591906135fd565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190612f68565b611ae2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610992575061099182611bda565b5b9050919050565b6060600380546109a890613aa4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490613aa4565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a3682611c44565b610a6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab282610e9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b39611c92565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b6b5750610b6981610b64611c92565b611a4e565b155b15610ba2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bad838383611c9a565b505050565b600b5481565b6000610bc2611d4c565b6002546001540303905090565b60105481565b610be0838383611d55565b505050565b610bed611c92565b73ffffffffffffffffffffffffffffffffffffffff16610c0b611217565b73ffffffffffffffffffffffffffffffffffffffff1614610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906136da565b60405180910390fd5b600f54811115610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d9061365a565b60405180910390fd5b80600f6000828254610cb891906139a6565b92505081905550610cc9338261220b565b50565b610cd4611c92565b73ffffffffffffffffffffffffffffffffffffffff16610cf2611217565b73ffffffffffffffffffffffffffffffffffffffff1614610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906136da565b60405180910390fd5b80600b8190555050565b610d5a611c92565b73ffffffffffffffffffffffffffffffffffffffff16610d78611217565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906136da565b60405180910390fd5b80600d8190555050565b610df3838383604051806020016040528060008152506118fc565b505050565b6000601054905090565b600a5481565b610e10611c92565b73ffffffffffffffffffffffffffffffffffffffff16610e2e611217565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906136da565b60405180910390fd5b80600e9080519060200190610e9a929190612d39565b5050565b6000610ea982612229565b600001519050919050565b610ebc611c92565b73ffffffffffffffffffffffffffffffffffffffff16610eda611217565b73ffffffffffffffffffffffffffffffffffffffff1614610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906136da565b60405180910390fd5b8060108190555050565b610f42611c92565b73ffffffffffffffffffffffffffffffffffffffff16610f60611217565b73ffffffffffffffffffffffffffffffffffffffff1614610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad906136da565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611028576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611098611c92565b73ffffffffffffffffffffffffffffffffffffffff166110b6611217565b73ffffffffffffffffffffffffffffffffffffffff161461110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611103906136da565b60405180910390fd5b61111660006124b8565b565b600c6020528060005260406000206000915090505481565b611138611c92565b73ffffffffffffffffffffffffffffffffffffffff16611156611217565b73ffffffffffffffffffffffffffffffffffffffff16146111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906136da565b60405180910390fd5b612710816111b8610bb8565b6111c291906138c5565b1115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906136ba565b60405180910390fd5b61120d828261220b565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611248612dbf565b61125182612229565b9050919050565b60606004805461126790613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461129390613aa4565b80156112e05780601f106112b5576101008083540402835291602001916112e0565b820191906000526020600020905b8154815290600101906020018083116112c357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f9061369a565b60405180910390fd5b60016010541461139d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113949061367a565b60405180910390fd5b600f546127106113ad91906139a6565b816113b6610bb8565b6113c091906138c5565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906136ba565b60405180910390fd5b600a54811115611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d9061375a565b60405180910390fd5b80600d54611454919061394c565b341015611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061373a565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e591906138c5565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061377a565b60405180910390fd5b61157a338261220b565b50565b611585611c92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006115f7611c92565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a4611c92565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e991906135fd565b60405180910390a35050565b6116fd611c92565b73ffffffffffffffffffffffffffffffffffffffff1661171b611217565b73ffffffffffffffffffffffffffffffffffffffff1614611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611768906136da565b60405180910390fd5b80600a8190555050565b611783611c92565b73ffffffffffffffffffffffffffffffffffffffff166117a1611217565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee906136da565b60405180910390fd5b6002600954141561183d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118349061379a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161186b90613581565b60006040518083038185875af1925050503d80600081146118a8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ad565b606091505b50509050806118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061371a565b60405180910390fd5b506001600981905550565b611907848484611d55565b6119268373ffffffffffffffffffffffffffffffffffffffff1661257c565b801561193b57506119398484848461258f565b155b15611972576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061198382611c44565b6119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906136fa565b60405180910390fd5b60006119cc6126ef565b905060008151116119ec5760405180602001604052806000815250611a17565b806119f684612781565b604051602001611a07929190613547565b6040516020818303038152906040525b915050919050565b600f5481565b6000611a30826128e2565b9050919050565b6000600d5482611a47919061394c565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aea611c92565b73ffffffffffffffffffffffffffffffffffffffff16611b08611217565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906136da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061363a565b60405180910390fd5b611bd7816124b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c4f611d4c565b11158015611c5e575060015482105b8015611c8b575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611d6082612229565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611dcb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611dec611c92565b73ffffffffffffffffffffffffffffffffffffffff161480611e1b5750611e1a85611e15611c92565b611a4e565b5b80611e605750611e29611c92565b73ffffffffffffffffffffffffffffffffffffffff16611e4884610a2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f00576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f0d858585600161294c565b611f1960008487611c9a565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219957600154821461219857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122048585856001612952565b5050505050565b612225828260405180602001604052806000815250612958565b5050565b612231612dbf565b60008290508061223f611d4c565b1115801561224e575060015481105b15612481576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161247f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123635780925050506124b3565b5b60011561247e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124795780925050506124b3565b612364565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125b5611c92565b8786866040518563ffffffff1660e01b81526004016125d794939291906135b1565b602060405180830381600087803b1580156125f157600080fd5b505af192505050801561262257506040513d601f19601f8201168201806040525081019061261f9190613158565b60015b61269c573d8060008114612652576040519150601f19603f3d011682016040523d82523d6000602084013e612657565b606091505b50600081511415612694576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546126fe90613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461272a90613aa4565b80156127775780601f1061274c57610100808354040283529160200191612777565b820191906000526020600020905b81548152906001019060200180831161275a57829003601f168201915b5050505050905090565b606060008214156127c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128dd565b600082905060005b600082146127fb5780806127e490613b07565b915050600a826127f4919061391b565b91506127d1565b60008167ffffffffffffffff81111561281757612816613c3d565b5b6040519080825280601f01601f1916602001820160405280156128495781602001600182028036833780820191505090505b5090505b600085146128d65760018261286291906139a6565b9150600a856128719190613b50565b603061287d91906138c5565b60f81b81838151811061289357612892613c0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128cf919061391b565b945061284d565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612965838383600161296a565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129d8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a20600086838761294c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bea5750612be98773ffffffffffffffffffffffffffffffffffffffff1661257c565b5b15612cb0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c5f600088848060010195508861258f565b612c95576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612bf0578260015414612cab57600080fd5b612d1c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612cb1575b816001819055505050612d326000868387612952565b5050505050565b828054612d4590613aa4565b90600052602060002090601f016020900481019282612d675760008555612dae565b82601f10612d8057805160ff1916838001178555612dae565b82800160010185558215612dae579182015b82811115612dad578251825591602001919060010190612d92565b5b509050612dbb9190612e02565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e1b576000816000905550600101612e03565b5090565b6000612e32612e2d84613815565b6137f0565b905082815260208101848484011115612e4e57612e4d613c71565b5b612e59848285613a62565b509392505050565b6000612e74612e6f84613846565b6137f0565b905082815260208101848484011115612e9057612e8f613c71565b5b612e9b848285613a62565b509392505050565b600081359050612eb281613f44565b92915050565b600081359050612ec781613f5b565b92915050565b600081359050612edc81613f72565b92915050565b600081519050612ef181613f72565b92915050565b600082601f830112612f0c57612f0b613c6c565b5b8135612f1c848260208601612e1f565b91505092915050565b600082601f830112612f3a57612f39613c6c565b5b8135612f4a848260208601612e61565b91505092915050565b600081359050612f6281613f89565b92915050565b600060208284031215612f7e57612f7d613c7b565b5b6000612f8c84828501612ea3565b91505092915050565b60008060408385031215612fac57612fab613c7b565b5b6000612fba85828601612ea3565b9250506020612fcb85828601612ea3565b9150509250929050565b600080600060608486031215612fee57612fed613c7b565b5b6000612ffc86828701612ea3565b935050602061300d86828701612ea3565b925050604061301e86828701612f53565b9150509250925092565b6000806000806080858703121561304257613041613c7b565b5b600061305087828801612ea3565b945050602061306187828801612ea3565b935050604061307287828801612f53565b925050606085013567ffffffffffffffff81111561309357613092613c76565b5b61309f87828801612ef7565b91505092959194509250565b600080604083850312156130c2576130c1613c7b565b5b60006130d085828601612ea3565b92505060206130e185828601612eb8565b9150509250929050565b6000806040838503121561310257613101613c7b565b5b600061311085828601612ea3565b925050602061312185828601612f53565b9150509250929050565b60006020828403121561314157613140613c7b565b5b600061314f84828501612ecd565b91505092915050565b60006020828403121561316e5761316d613c7b565b5b600061317c84828501612ee2565b91505092915050565b60006020828403121561319b5761319a613c7b565b5b600082013567ffffffffffffffff8111156131b9576131b8613c76565b5b6131c584828501612f25565b91505092915050565b6000602082840312156131e4576131e3613c7b565b5b60006131f284828501612f53565b91505092915050565b613204816139da565b82525050565b613213816139da565b82525050565b613222816139ec565b82525050565b613231816139ec565b82525050565b600061324282613877565b61324c818561388d565b935061325c818560208601613a71565b61326581613c80565b840191505092915050565b600061327b82613882565b61328581856138a9565b9350613295818560208601613a71565b61329e81613c80565b840191505092915050565b60006132b482613882565b6132be81856138ba565b93506132ce818560208601613a71565b80840191505092915050565b60006132e76026836138a9565b91506132f282613c91565b604082019050919050565b600061330a6021836138a9565b915061331582613ce0565b604082019050919050565b600061332d6012836138a9565b915061333882613d2f565b602082019050919050565b6000613350601e836138a9565b915061335b82613d58565b602082019050919050565b60006133736012836138a9565b915061337e82613d81565b602082019050919050565b60006133966005836138ba565b91506133a182613daa565b600582019050919050565b60006133b96020836138a9565b91506133c482613dd3565b602082019050919050565b60006133dc602f836138a9565b91506133e782613dfc565b604082019050919050565b60006133ff60008361389e565b915061340a82613e4b565b600082019050919050565b60006134226010836138a9565b915061342d82613e4e565b602082019050919050565b60006134456016836138a9565b915061345082613e77565b602082019050919050565b60006134686016836138a9565b915061347382613ea0565b602082019050919050565b600061348b601c836138a9565b915061349682613ec9565b602082019050919050565b60006134ae601f836138a9565b91506134b982613ef2565b602082019050919050565b60006134d16001836138ba565b91506134dc82613f1b565b600182019050919050565b6060820160008201516134fd60008501826131fb565b5060208201516135106020850182613538565b5060408201516135236040850182613219565b50505050565b61353281613a44565b82525050565b61354181613a4e565b82525050565b600061355382856132a9565b915061355e826134c4565b915061356a82846132a9565b915061357582613389565b91508190509392505050565b600061358c826133f2565b9150819050919050565b60006020820190506135ab600083018461320a565b92915050565b60006080820190506135c6600083018761320a565b6135d3602083018661320a565b6135e06040830185613529565b81810360608301526135f28184613237565b905095945050505050565b60006020820190506136126000830184613228565b92915050565b600060208201905081810360008301526136328184613270565b905092915050565b60006020820190508181036000830152613653816132da565b9050919050565b60006020820190508181036000830152613673816132fd565b9050919050565b6000602082019050818103600083015261369381613320565b9050919050565b600060208201905081810360008301526136b381613343565b9050919050565b600060208201905081810360008301526136d381613366565b9050919050565b600060208201905081810360008301526136f3816133ac565b9050919050565b60006020820190508181036000830152613713816133cf565b9050919050565b6000602082019050818103600083015261373381613415565b9050919050565b6000602082019050818103600083015261375381613438565b9050919050565b600060208201905081810360008301526137738161345b565b9050919050565b600060208201905081810360008301526137938161347e565b9050919050565b600060208201905081810360008301526137b3816134a1565b9050919050565b60006060820190506137cf60008301846134e7565b92915050565b60006020820190506137ea6000830184613529565b92915050565b60006137fa61380b565b90506138068282613ad6565b919050565b6000604051905090565b600067ffffffffffffffff8211156138305761382f613c3d565b5b61383982613c80565b9050602081019050919050565b600067ffffffffffffffff82111561386157613860613c3d565b5b61386a82613c80565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d082613a44565b91506138db83613a44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139105761390f613b81565b5b828201905092915050565b600061392682613a44565b915061393183613a44565b92508261394157613940613bb0565b5b828204905092915050565b600061395782613a44565b915061396283613a44565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399b5761399a613b81565b5b828202905092915050565b60006139b182613a44565b91506139bc83613a44565b9250828210156139cf576139ce613b81565b5b828203905092915050565b60006139e582613a24565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613a8f578082015181840152602081019050613a74565b83811115613a9e576000848401525b50505050565b60006002820490506001821680613abc57607f821691505b60208210811415613ad057613acf613bdf565b5b50919050565b613adf82613c80565b810181811067ffffffffffffffff82111715613afe57613afd613c3d565b5b80604052505050565b6000613b1282613a44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4557613b44613b81565b5b600182019050919050565b6000613b5b82613a44565b9150613b6683613a44565b925082613b7657613b75613bb0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b613f4d816139da565b8114613f5857600080fd5b50565b613f64816139ec565b8114613f6f57600080fd5b50565b613f7b816139f8565b8114613f8657600080fd5b50565b613f9281613a44565b8114613f9d57600080fd5b5056fea26469706673582212203fafc9272fb99b75c2e8b58b96151e8f9c795ac01c5d1112406caa0ef65b556464736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a22cb465116100ab578063cd3293de1161006f578063cd3293de146107ac578063dc33e681146107d7578063e757223014610814578063e985e9c514610851578063f2fde38b1461088e5761021a565b8063a22cb465146106dd578063a40ece7a14610706578063ac4460021461072f578063b88d4fde14610746578063c87b56dd1461076f5761021a565b80638d859f3e116100f25780638d859f3e146106035780638da5cb5b1461062e5780639231ab2a1461065957806395d89b4114610696578063a0712d68146106c15761021a565b806370a0823114610549578063715018a614610586578063752361431461059d5780638ba4cc3c146105da5761021a565b80632ba2865b116101a657806351d7ff931161017557806351d7ff931461046657806355f804b3146104915780636352211e146104ba57806369ba1a75146104f75780636a44e173146105205761021a565b80632ba2865b146103c05780633fd17366146103e957806342842e0e146104125780634e69d5601461043b5761021a565b80630f2cdd6c116101ed5780630f2cdd6c146102ed57806318160ddd14610318578063200d2ed21461034357806323b872dd1461036e578063288bd8fd146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061312b565b6108b7565b60405161025391906135fd565b60405180910390f35b34801561026857600080fd5b50610271610999565b60405161027e9190613618565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906131ce565b610a2b565b6040516102bb9190613596565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906130eb565b610aa7565b005b3480156102f957600080fd5b50610302610bb2565b60405161030f91906137d5565b60405180910390f35b34801561032457600080fd5b5061032d610bb8565b60405161033a91906137d5565b60405180910390f35b34801561034f57600080fd5b50610358610bcf565b60405161036591906137d5565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612fd5565b610bd5565b005b3480156103a357600080fd5b506103be60048036038101906103b991906131ce565b610be5565b005b3480156103cc57600080fd5b506103e760048036038101906103e291906131ce565b610ccc565b005b3480156103f557600080fd5b50610410600480360381019061040b91906131ce565b610d52565b005b34801561041e57600080fd5b5061043960048036038101906104349190612fd5565b610dd8565b005b34801561044757600080fd5b50610450610df8565b60405161045d91906137d5565b60405180910390f35b34801561047257600080fd5b5061047b610e02565b60405161048891906137d5565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613185565b610e08565b005b3480156104c657600080fd5b506104e160048036038101906104dc91906131ce565b610e9e565b6040516104ee9190613596565b60405180910390f35b34801561050357600080fd5b5061051e600480360381019061051991906131ce565b610eb4565b005b34801561052c57600080fd5b50610547600480360381019061054291906131ce565b610f3a565b005b34801561055557600080fd5b50610570600480360381019061056b9190612f68565b610fc0565b60405161057d91906137d5565b60405180910390f35b34801561059257600080fd5b5061059b611090565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190612f68565b611118565b6040516105d191906137d5565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906130eb565b611130565b005b34801561060f57600080fd5b50610618611211565b60405161062591906137d5565b60405180910390f35b34801561063a57600080fd5b50610643611217565b6040516106509190613596565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b91906131ce565b611240565b60405161068d91906137ba565b60405180910390f35b3480156106a257600080fd5b506106ab611258565b6040516106b89190613618565b60405180910390f35b6106db60048036038101906106d691906131ce565b6112ea565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906130ab565b61157d565b005b34801561071257600080fd5b5061072d600480360381019061072891906131ce565b6116f5565b005b34801561073b57600080fd5b5061074461177b565b005b34801561075257600080fd5b5061076d60048036038101906107689190613028565b6118fc565b005b34801561077b57600080fd5b50610796600480360381019061079191906131ce565b611978565b6040516107a39190613618565b60405180910390f35b3480156107b857600080fd5b506107c1611a1f565b6040516107ce91906137d5565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190612f68565b611a25565b60405161080b91906137d5565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906131ce565b611a37565b60405161084891906137d5565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190612f95565b611a4e565b60405161088591906135fd565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190612f68565b611ae2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610992575061099182611bda565b5b9050919050565b6060600380546109a890613aa4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490613aa4565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a3682611c44565b610a6c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab282610e9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b39611c92565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b6b5750610b6981610b64611c92565b611a4e565b155b15610ba2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bad838383611c9a565b505050565b600b5481565b6000610bc2611d4c565b6002546001540303905090565b60105481565b610be0838383611d55565b505050565b610bed611c92565b73ffffffffffffffffffffffffffffffffffffffff16610c0b611217565b73ffffffffffffffffffffffffffffffffffffffff1614610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906136da565b60405180910390fd5b600f54811115610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d9061365a565b60405180910390fd5b80600f6000828254610cb891906139a6565b92505081905550610cc9338261220b565b50565b610cd4611c92565b73ffffffffffffffffffffffffffffffffffffffff16610cf2611217565b73ffffffffffffffffffffffffffffffffffffffff1614610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f906136da565b60405180910390fd5b80600b8190555050565b610d5a611c92565b73ffffffffffffffffffffffffffffffffffffffff16610d78611217565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906136da565b60405180910390fd5b80600d8190555050565b610df3838383604051806020016040528060008152506118fc565b505050565b6000601054905090565b600a5481565b610e10611c92565b73ffffffffffffffffffffffffffffffffffffffff16610e2e611217565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906136da565b60405180910390fd5b80600e9080519060200190610e9a929190612d39565b5050565b6000610ea982612229565b600001519050919050565b610ebc611c92565b73ffffffffffffffffffffffffffffffffffffffff16610eda611217565b73ffffffffffffffffffffffffffffffffffffffff1614610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906136da565b60405180910390fd5b8060108190555050565b610f42611c92565b73ffffffffffffffffffffffffffffffffffffffff16610f60611217565b73ffffffffffffffffffffffffffffffffffffffff1614610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad906136da565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611028576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611098611c92565b73ffffffffffffffffffffffffffffffffffffffff166110b6611217565b73ffffffffffffffffffffffffffffffffffffffff161461110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611103906136da565b60405180910390fd5b61111660006124b8565b565b600c6020528060005260406000206000915090505481565b611138611c92565b73ffffffffffffffffffffffffffffffffffffffff16611156611217565b73ffffffffffffffffffffffffffffffffffffffff16146111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906136da565b60405180910390fd5b612710816111b8610bb8565b6111c291906138c5565b1115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa906136ba565b60405180910390fd5b61120d828261220b565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611248612dbf565b61125182612229565b9050919050565b60606004805461126790613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461129390613aa4565b80156112e05780601f106112b5576101008083540402835291602001916112e0565b820191906000526020600020905b8154815290600101906020018083116112c357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f9061369a565b60405180910390fd5b60016010541461139d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113949061367a565b60405180910390fd5b600f546127106113ad91906139a6565b816113b6610bb8565b6113c091906138c5565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906136ba565b60405180910390fd5b600a54811115611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d9061375a565b60405180910390fd5b80600d54611454919061394c565b341015611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061373a565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e591906138c5565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061377a565b60405180910390fd5b61157a338261220b565b50565b611585611c92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006115f7611c92565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a4611c92565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e991906135fd565b60405180910390a35050565b6116fd611c92565b73ffffffffffffffffffffffffffffffffffffffff1661171b611217565b73ffffffffffffffffffffffffffffffffffffffff1614611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611768906136da565b60405180910390fd5b80600a8190555050565b611783611c92565b73ffffffffffffffffffffffffffffffffffffffff166117a1611217565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee906136da565b60405180910390fd5b6002600954141561183d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118349061379a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161186b90613581565b60006040518083038185875af1925050503d80600081146118a8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ad565b606091505b50509050806118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061371a565b60405180910390fd5b506001600981905550565b611907848484611d55565b6119268373ffffffffffffffffffffffffffffffffffffffff1661257c565b801561193b57506119398484848461258f565b155b15611972576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061198382611c44565b6119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906136fa565b60405180910390fd5b60006119cc6126ef565b905060008151116119ec5760405180602001604052806000815250611a17565b806119f684612781565b604051602001611a07929190613547565b6040516020818303038152906040525b915050919050565b600f5481565b6000611a30826128e2565b9050919050565b6000600d5482611a47919061394c565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aea611c92565b73ffffffffffffffffffffffffffffffffffffffff16611b08611217565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906136da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061363a565b60405180910390fd5b611bd7816124b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c4f611d4c565b11158015611c5e575060015482105b8015611c8b575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611d6082612229565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611dcb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611dec611c92565b73ffffffffffffffffffffffffffffffffffffffff161480611e1b5750611e1a85611e15611c92565b611a4e565b5b80611e605750611e29611c92565b73ffffffffffffffffffffffffffffffffffffffff16611e4884610a2b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f00576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f0d858585600161294c565b611f1960008487611c9a565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219957600154821461219857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122048585856001612952565b5050505050565b612225828260405180602001604052806000815250612958565b5050565b612231612dbf565b60008290508061223f611d4c565b1115801561224e575060015481105b15612481576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161247f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123635780925050506124b3565b5b60011561247e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124795780925050506124b3565b612364565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125b5611c92565b8786866040518563ffffffff1660e01b81526004016125d794939291906135b1565b602060405180830381600087803b1580156125f157600080fd5b505af192505050801561262257506040513d601f19601f8201168201806040525081019061261f9190613158565b60015b61269c573d8060008114612652576040519150601f19603f3d011682016040523d82523d6000602084013e612657565b606091505b50600081511415612694576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546126fe90613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461272a90613aa4565b80156127775780601f1061274c57610100808354040283529160200191612777565b820191906000526020600020905b81548152906001019060200180831161275a57829003601f168201915b5050505050905090565b606060008214156127c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128dd565b600082905060005b600082146127fb5780806127e490613b07565b915050600a826127f4919061391b565b91506127d1565b60008167ffffffffffffffff81111561281757612816613c3d565b5b6040519080825280601f01601f1916602001820160405280156128495781602001600182028036833780820191505090505b5090505b600085146128d65760018261286291906139a6565b9150600a856128719190613b50565b603061287d91906138c5565b60f81b81838151811061289357612892613c0e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128cf919061391b565b945061284d565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612965838383600161296a565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129d8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a20600086838761294c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bea5750612be98773ffffffffffffffffffffffffffffffffffffffff1661257c565b5b15612cb0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c5f600088848060010195508861258f565b612c95576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612bf0578260015414612cab57600080fd5b612d1c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612cb1575b816001819055505050612d326000868387612952565b5050505050565b828054612d4590613aa4565b90600052602060002090601f016020900481019282612d675760008555612dae565b82601f10612d8057805160ff1916838001178555612dae565b82800160010185558215612dae579182015b82811115612dad578251825591602001919060010190612d92565b5b509050612dbb9190612e02565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e1b576000816000905550600101612e03565b5090565b6000612e32612e2d84613815565b6137f0565b905082815260208101848484011115612e4e57612e4d613c71565b5b612e59848285613a62565b509392505050565b6000612e74612e6f84613846565b6137f0565b905082815260208101848484011115612e9057612e8f613c71565b5b612e9b848285613a62565b509392505050565b600081359050612eb281613f44565b92915050565b600081359050612ec781613f5b565b92915050565b600081359050612edc81613f72565b92915050565b600081519050612ef181613f72565b92915050565b600082601f830112612f0c57612f0b613c6c565b5b8135612f1c848260208601612e1f565b91505092915050565b600082601f830112612f3a57612f39613c6c565b5b8135612f4a848260208601612e61565b91505092915050565b600081359050612f6281613f89565b92915050565b600060208284031215612f7e57612f7d613c7b565b5b6000612f8c84828501612ea3565b91505092915050565b60008060408385031215612fac57612fab613c7b565b5b6000612fba85828601612ea3565b9250506020612fcb85828601612ea3565b9150509250929050565b600080600060608486031215612fee57612fed613c7b565b5b6000612ffc86828701612ea3565b935050602061300d86828701612ea3565b925050604061301e86828701612f53565b9150509250925092565b6000806000806080858703121561304257613041613c7b565b5b600061305087828801612ea3565b945050602061306187828801612ea3565b935050604061307287828801612f53565b925050606085013567ffffffffffffffff81111561309357613092613c76565b5b61309f87828801612ef7565b91505092959194509250565b600080604083850312156130c2576130c1613c7b565b5b60006130d085828601612ea3565b92505060206130e185828601612eb8565b9150509250929050565b6000806040838503121561310257613101613c7b565b5b600061311085828601612ea3565b925050602061312185828601612f53565b9150509250929050565b60006020828403121561314157613140613c7b565b5b600061314f84828501612ecd565b91505092915050565b60006020828403121561316e5761316d613c7b565b5b600061317c84828501612ee2565b91505092915050565b60006020828403121561319b5761319a613c7b565b5b600082013567ffffffffffffffff8111156131b9576131b8613c76565b5b6131c584828501612f25565b91505092915050565b6000602082840312156131e4576131e3613c7b565b5b60006131f284828501612f53565b91505092915050565b613204816139da565b82525050565b613213816139da565b82525050565b613222816139ec565b82525050565b613231816139ec565b82525050565b600061324282613877565b61324c818561388d565b935061325c818560208601613a71565b61326581613c80565b840191505092915050565b600061327b82613882565b61328581856138a9565b9350613295818560208601613a71565b61329e81613c80565b840191505092915050565b60006132b482613882565b6132be81856138ba565b93506132ce818560208601613a71565b80840191505092915050565b60006132e76026836138a9565b91506132f282613c91565b604082019050919050565b600061330a6021836138a9565b915061331582613ce0565b604082019050919050565b600061332d6012836138a9565b915061333882613d2f565b602082019050919050565b6000613350601e836138a9565b915061335b82613d58565b602082019050919050565b60006133736012836138a9565b915061337e82613d81565b602082019050919050565b60006133966005836138ba565b91506133a182613daa565b600582019050919050565b60006133b96020836138a9565b91506133c482613dd3565b602082019050919050565b60006133dc602f836138a9565b91506133e782613dfc565b604082019050919050565b60006133ff60008361389e565b915061340a82613e4b565b600082019050919050565b60006134226010836138a9565b915061342d82613e4e565b602082019050919050565b60006134456016836138a9565b915061345082613e77565b602082019050919050565b60006134686016836138a9565b915061347382613ea0565b602082019050919050565b600061348b601c836138a9565b915061349682613ec9565b602082019050919050565b60006134ae601f836138a9565b91506134b982613ef2565b602082019050919050565b60006134d16001836138ba565b91506134dc82613f1b565b600182019050919050565b6060820160008201516134fd60008501826131fb565b5060208201516135106020850182613538565b5060408201516135236040850182613219565b50505050565b61353281613a44565b82525050565b61354181613a4e565b82525050565b600061355382856132a9565b915061355e826134c4565b915061356a82846132a9565b915061357582613389565b91508190509392505050565b600061358c826133f2565b9150819050919050565b60006020820190506135ab600083018461320a565b92915050565b60006080820190506135c6600083018761320a565b6135d3602083018661320a565b6135e06040830185613529565b81810360608301526135f28184613237565b905095945050505050565b60006020820190506136126000830184613228565b92915050565b600060208201905081810360008301526136328184613270565b905092915050565b60006020820190508181036000830152613653816132da565b9050919050565b60006020820190508181036000830152613673816132fd565b9050919050565b6000602082019050818103600083015261369381613320565b9050919050565b600060208201905081810360008301526136b381613343565b9050919050565b600060208201905081810360008301526136d381613366565b9050919050565b600060208201905081810360008301526136f3816133ac565b9050919050565b60006020820190508181036000830152613713816133cf565b9050919050565b6000602082019050818103600083015261373381613415565b9050919050565b6000602082019050818103600083015261375381613438565b9050919050565b600060208201905081810360008301526137738161345b565b9050919050565b600060208201905081810360008301526137938161347e565b9050919050565b600060208201905081810360008301526137b3816134a1565b9050919050565b60006060820190506137cf60008301846134e7565b92915050565b60006020820190506137ea6000830184613529565b92915050565b60006137fa61380b565b90506138068282613ad6565b919050565b6000604051905090565b600067ffffffffffffffff8211156138305761382f613c3d565b5b61383982613c80565b9050602081019050919050565b600067ffffffffffffffff82111561386157613860613c3d565b5b61386a82613c80565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d082613a44565b91506138db83613a44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139105761390f613b81565b5b828201905092915050565b600061392682613a44565b915061393183613a44565b92508261394157613940613bb0565b5b828204905092915050565b600061395782613a44565b915061396283613a44565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399b5761399a613b81565b5b828202905092915050565b60006139b182613a44565b91506139bc83613a44565b9250828210156139cf576139ce613b81565b5b828203905092915050565b60006139e582613a24565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613a8f578082015181840152602081019050613a74565b83811115613a9e576000848401525b50505050565b60006002820490506001821680613abc57607f821691505b60208210811415613ad057613acf613bdf565b5b50919050565b613adf82613c80565b810181811067ffffffffffffffff82111715613afe57613afd613c3d565b5b80604052505050565b6000613b1282613a44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4557613b44613b81565b5b600182019050919050565b6000613b5b82613a44565b9150613b6683613a44565b925082613b7657613b75613bb0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b613f4d816139da565b8114613f5857600080fd5b50565b613f64816139ec565b8114613f6f57600080fd5b50565b613f7b816139f8565b8114613f8657600080fd5b50565b613f9281613a44565b8114613f9d57600080fd5b5056fea26469706673582212203fafc9272fb99b75c2e8b58b96151e8f9c795ac01c5d1112406caa0ef65b556464736f6c63430008070033

Deployed Bytecode Sourcemap

32868:3512:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15123:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18236:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19739:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19302:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33061:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14372:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33468:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20604:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35965:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35364:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35259:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20845:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35657:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32969:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34591:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18044:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35578:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35735:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15492:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5154:103;;;;;;;;;;;;;:::i;:::-;;33145:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36188:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33202:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4931:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34918:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18405:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33693:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20015:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35466:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35072:181;;;;;;;;;;;;;:::i;:::-;;21101:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34238:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33436:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34807:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35843:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20373:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5266:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15123:305;15225:4;15277:25;15262:40;;;:11;:40;;;;:105;;;;15334:33;15319:48;;;:11;:48;;;;15262:105;:158;;;;15384:36;15408:11;15384:23;:36::i;:::-;15262:158;15242:178;;15123:305;;;:::o;18236:100::-;18290:13;18323:5;18316:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:100;:::o;19739:204::-;19807:7;19832:16;19840:7;19832;:16::i;:::-;19827:64;;19857:34;;;;;;;;;;;;;;19827:64;19911:15;:24;19927:7;19911:24;;;;;;;;;;;;;;;;;;;;;19904:31;;19739:204;;;:::o;19302:371::-;19375:13;19391:24;19407:7;19391:15;:24::i;:::-;19375:40;;19436:5;19430:11;;:2;:11;;;19426:48;;;19450:24;;;;;;;;;;;;;;19426:48;19507:5;19491:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19517:37;19534:5;19541:12;:10;:12::i;:::-;19517:16;:37::i;:::-;19516:38;19491:63;19487:138;;;19578:35;;;;;;;;;;;;;;19487:138;19637:28;19646:2;19650:7;19659:5;19637:8;:28::i;:::-;19364:309;19302:371;;:::o;33061:33::-;;;;:::o;14372:303::-;14416:7;14641:15;:13;:15::i;:::-;14626:12;;14610:13;;:28;:46;14603:53;;14372:303;:::o;33468:22::-;;;;:::o;20604:170::-;20738:28;20748:4;20754:2;20758:7;20738:9;:28::i;:::-;20604:170;;;:::o;35965:217::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36055:7:::1;;36043:8;:19;;36035:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36122:8;36111:7;;:19;;;;;;;:::i;:::-;;;;;;;;36141:31;36151:10;36163:8;36141:9;:31::i;:::-;35965:217:::0;:::o;35364:96::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35453:1:::1;35436:14;:18;;;;35364:96:::0;:::o;35259:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35342:9:::1;35334:5;:17;;;;35259:98:::0;:::o;20845:185::-;20983:39;21000:4;21006:2;21010:7;20983:39;;;;;;;;;;;;:16;:39::i;:::-;20845:185;;;:::o;35657:73::-;35697:4;35718:6;;35711:13;;35657:73;:::o;32969:38::-;;;;:::o;34591:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34676:7:::1;34660:13;:23;;;;;;;;;;;;:::i;:::-;;34591:98:::0;:::o;18044:125::-;18108:7;18135:21;18148:7;18135:12;:21::i;:::-;:26;;;18128:33;;18044:125;;;:::o;35578:72::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35643:1:::1;35634:6;:10;;;;35578:72:::0;:::o;35735:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35816:9:::1;35808:7;:17;;;;35735:98:::0;:::o;15492:206::-;15556:7;15597:1;15580:19;;:5;:19;;;15576:60;;;15608:28;;;;;;;;;;;;;;15576:60;15662:12;:19;15675:5;15662:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15654:36;;15647:43;;15492:206;;;:::o;5154:103::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5219:30:::1;5246:1;5219:18;:30::i;:::-;5154:103::o:0;33145:50::-;;;;;;;;;;;;;;;;;:::o;36188:189::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33289:5:::1;36282:8;36266:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;36258:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36344:27;36354:6;36362:8;36344:9;:27::i;:::-;36188:189:::0;;:::o;33202:31::-;;;;:::o;4931:87::-;4977:7;5004:6;;;;;;;;;;;4997:13;;4931:87;:::o;34918:148::-;34999:21;;:::i;:::-;35039;35052:7;35039:12;:21::i;:::-;35032:28;;34918:148;;;:::o;18405:104::-;18461:13;18494:7;18487:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18405:104;:::o;33693:538::-;33627:10;33614:23;;:9;:23;;;33606:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33780:1:::1;33770:6;;:11;33762:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33869:7;;33289:5;33848:28;;;;:::i;:::-;33836:8;33820:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;33812:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33926:19;;33914:8;:31;;33906:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34007:8;33999:5;;:16;;;;:::i;:::-;33986:9;:29;;33978:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34082:8;34051:15;:27;34067:10;34051:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;34136:14;;34105:15;:27;34121:10;34105:27;;;;;;;;;;;;;;;;:45;;34097:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;34194:31;34204:10;34216:8;34194:9;:31::i;:::-;33693:538:::0;:::o;20015:287::-;20126:12;:10;:12::i;:::-;20114:24;;:8;:24;;;20110:54;;;20147:17;;;;;;;;;;;;;;20110:54;20222:8;20177:18;:32;20196:12;:10;:12::i;:::-;20177:32;;;;;;;;;;;;;;;:42;20210:8;20177:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20275:8;20246:48;;20261:12;:10;:12::i;:::-;20246:48;;;20285:8;20246:48;;;;;;:::i;:::-;;;;;;;;20015:287;;:::o;35466:106::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35565:1:::1;35543:19;:23;;;;35466:106:::0;:::o;35072:181::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1:::1;2859:7;;:19;;2851:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1;2920:7;:18;;;;35137:12:::2;35155:10;:15;;35178:21;35155:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35136:68;;;35219:7;35211:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;35129:124;2669:1:::1;2963:7;:22;;;;35072:181::o:0;21101:369::-;21268:28;21278:4;21284:2;21288:7;21268:9;:28::i;:::-;21311:15;:2;:13;;;:15::i;:::-;:76;;;;;21331:56;21362:4;21368:2;21372:7;21381:5;21331:30;:56::i;:::-;21330:57;21311:76;21307:156;;;21411:40;;;;;;;;;;;;;;21307:156;21101:369;;;;:::o;34238:347::-;34311:13;34341:16;34349:7;34341;:16::i;:::-;34333:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34415:21;34439:10;:8;:10::i;:::-;34415:34;;34494:1;34476:7;34470:21;:25;:109;;;;;;;;;;;;;;;;;34531:7;34545:18;:7;:16;:18::i;:::-;34514:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34470:109;34456:123;;;34238:347;;;:::o;33436:23::-;;;;:::o;34807:107::-;34865:7;34888:20;34902:5;34888:13;:20::i;:::-;34881:27;;34807:107;;;:::o;35843:117::-;35901:7;35947:5;;35937:9;:15;;;;:::i;:::-;35930:22;;35843:117;;;:::o;20373:164::-;20470:4;20494:18;:25;20513:5;20494:25;;;;;;;;;;;;;;;:35;20520:8;20494:35;;;;;;;;;;;;;;;;;;;;;;;;;20487:42;;20373:164;;;;:::o;5266:201::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5375:1:::1;5355:22;;:8;:22;;;;5347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5431:28;5450:8;5431:18;:28::i;:::-;5266:201:::0;:::o;9584:157::-;9669:4;9708:25;9693:40;;;:11;:40;;;;9686:47;;9584:157;;;:::o;21725:174::-;21782:4;21825:7;21806:15;:13;:15::i;:::-;:26;;:53;;;;;21846:13;;21836:7;:23;21806:53;:85;;;;;21864:11;:20;21876:7;21864:20;;;;;;;;;;;:27;;;;;;;;;;;;21863:28;21806:85;21799:92;;21725:174;;;:::o;4474:98::-;4527:7;4554:10;4547:17;;4474:98;:::o;29882:196::-;30024:2;29997:15;:24;30013:7;29997:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30062:7;30058:2;30042:28;;30051:5;30042:28;;;;;;;;;;;;29882:196;;;:::o;14146:92::-;14202:7;14229:1;14222:8;;14146:92;:::o;24825:2130::-;24940:35;24978:21;24991:7;24978:12;:21::i;:::-;24940:59;;25038:4;25016:26;;:13;:18;;;:26;;;25012:67;;25051:28;;;;;;;;;;;;;;25012:67;25092:22;25134:4;25118:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25155:36;25172:4;25178:12;:10;:12::i;:::-;25155:16;:36::i;:::-;25118:73;:126;;;;25232:12;:10;:12::i;:::-;25208:36;;:20;25220:7;25208:11;:20::i;:::-;:36;;;25118:126;25092:153;;25263:17;25258:66;;25289:35;;;;;;;;;;;;;;25258:66;25353:1;25339:16;;:2;:16;;;25335:52;;;25364:23;;;;;;;;;;;;;;25335:52;25400:43;25422:4;25428:2;25432:7;25441:1;25400:21;:43::i;:::-;25508:35;25525:1;25529:7;25538:4;25508:8;:35::i;:::-;25869:1;25839:12;:18;25852:4;25839:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25913:1;25885:12;:16;25898:2;25885:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25931:31;25965:11;:20;25977:7;25965:20;;;;;;;;;;;25931:54;;26016:2;26000:8;:13;;;:18;;;;;;;;;;;;;;;;;;26066:15;26033:8;:23;;;:49;;;;;;;;;;;;;;;;;;26334:19;26366:1;26356:7;:11;26334:33;;26382:31;26416:11;:24;26428:11;26416:24;;;;;;;;;;;26382:58;;26484:1;26459:27;;:8;:13;;;;;;;;;;;;:27;;;26455:384;;;26669:13;;26654:11;:28;26650:174;;26723:4;26707:8;:13;;;:20;;;;;;;;;;;;;;;;;;26776:13;:28;;;26750:8;:23;;;:54;;;;;;;;;;;;;;;;;;26650:174;26455:384;25814:1036;;;26886:7;26882:2;26867:27;;26876:4;26867:27;;;;;;;;;;;;26905:42;26926:4;26932:2;26936:7;26945:1;26905:20;:42::i;:::-;24929:2026;;24825:2130;;;:::o;21907:104::-;21976:27;21986:2;21990:8;21976:27;;;;;;;;;;;;:9;:27::i;:::-;21907:104;;:::o;16873:1109::-;16935:21;;:::i;:::-;16969:12;16984:7;16969:22;;17052:4;17033:15;:13;:15::i;:::-;:23;;:47;;;;;17067:13;;17060:4;:20;17033:47;17029:886;;;17101:31;17135:11;:17;17147:4;17135:17;;;;;;;;;;;17101:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17176:9;:16;;;17171:729;;17247:1;17221:28;;:9;:14;;;:28;;;17217:101;;17285:9;17278:16;;;;;;17217:101;17620:261;17627:4;17620:261;;;17660:6;;;;;;;;17705:11;:17;17717:4;17705:17;;;;;;;;;;;17693:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17779:1;17753:28;;:9;:14;;;:28;;;17749:109;;17821:9;17814:16;;;;;;17749:109;17620:261;;;17171:729;17082:833;17029:886;17943:31;;;;;;;;;;;;;;16873:1109;;;;:::o;5476:191::-;5550:16;5569:6;;;;;;;;;;;5550:25;;5595:8;5586:6;;:17;;;;;;;;;;;;;;;;;;5650:8;5619:40;;5640:8;5619:40;;;;;;;;;;;;5539:128;5476:191;:::o;5699:197::-;5759:4;5777:12;5844:7;5832:20;5824:28;;5887:1;5880:4;:8;5873:15;;;5699:197;;;:::o;30570:667::-;30733:4;30770:2;30754:36;;;30791:12;:10;:12::i;:::-;30805:4;30811:7;30820:5;30754:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30750:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31005:1;30988:6;:13;:18;30984:235;;;31034:40;;;;;;;;;;;;;;30984:235;31177:6;31171:13;31162:6;31158:2;31154:15;31147:38;30750:480;30883:45;;;30873:55;;;:6;:55;;;;30866:62;;;30570:667;;;;;;:::o;34693:108::-;34753:13;34782;34775:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34693:108;:::o;3091:533::-;3147:13;3187:1;3178:5;:10;3174:53;;;3205:10;;;;;;;;;;;;;;;;;;;;;3174:53;3237:12;3252:5;3237:20;;3268:14;3293:78;3308:1;3300:4;:9;3293:78;;3326:8;;;;;:::i;:::-;;;;3357:2;3349:10;;;;;:::i;:::-;;;3293:78;;;3381:19;3413:6;3403:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:39;;3431:154;3447:1;3438:5;:10;3431:154;;3475:1;3465:11;;;;;:::i;:::-;;;3542:2;3534:5;:10;;;;:::i;:::-;3521:2;:24;;;;:::i;:::-;3508:39;;3491:6;3498;3491:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3571:2;3562:11;;;;;:::i;:::-;;;3431:154;;;3609:6;3595:21;;;;;3091:533;;;;:::o;15780:137::-;15841:7;15876:12;:19;15889:5;15876:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15868:41;;15861:48;;15780:137;;;:::o;31885:159::-;;;;;:::o;32703:158::-;;;;;:::o;22374:163::-;22497:32;22503:2;22507:8;22517:5;22524:4;22497:5;:32::i;:::-;22374:163;;;:::o;22796:1775::-;22935:20;22958:13;;22935:36;;23000:1;22986:16;;:2;:16;;;22982:48;;;23011:19;;;;;;;;;;;;;;22982:48;23057:1;23045:8;:13;23041:44;;;23067:18;;;;;;;;;;;;;;23041:44;23098:61;23128:1;23132:2;23136:12;23150:8;23098:21;:61::i;:::-;23471:8;23436:12;:16;23449:2;23436:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23535:8;23495:12;:16;23508:2;23495:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23594:2;23561:11;:25;23573:12;23561:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23661:15;23611:11;:25;23623:12;23611:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23694:20;23717:12;23694:35;;23744:11;23773:8;23758:12;:23;23744:37;;23802:4;:23;;;;;23810:15;:2;:13;;;:15::i;:::-;23802:23;23798:641;;;23846:314;23902:12;23898:2;23877:38;;23894:1;23877:38;;;;;;;;;;;;23943:69;23982:1;23986:2;23990:14;;;;;;24006:5;23943:30;:69::i;:::-;23938:174;;24048:40;;;;;;;;;;;;;;23938:174;24155:3;24139:12;:19;;23846:314;;24241:12;24224:13;;:29;24220:43;;24255:8;;;24220:43;23798:641;;;24304:120;24360:14;;;;;;24356:2;24335:40;;24352:1;24335:40;;;;;;;;;;;;24419:3;24403:12;:19;;24304:120;;23798:641;24469:12;24453:13;:28;;;;23411:1082;;24503:60;24532:1;24536:2;24540:12;24554:8;24503:20;:60::i;:::-;22924:1647;22796:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:108::-;7235:24;7253:5;7235:24;:::i;:::-;7230:3;7223:37;7158:108;;:::o;7272:118::-;7359:24;7377:5;7359:24;:::i;:::-;7354:3;7347:37;7272:118;;:::o;7396:99::-;7467:21;7482:5;7467:21;:::i;:::-;7462:3;7455:34;7396:99;;:::o;7501:109::-;7582:21;7597:5;7582:21;:::i;:::-;7577:3;7570:34;7501:109;;:::o;7616:360::-;7702:3;7730:38;7762:5;7730:38;:::i;:::-;7784:70;7847:6;7842:3;7784:70;:::i;:::-;7777:77;;7863:52;7908:6;7903:3;7896:4;7889:5;7885:16;7863:52;:::i;:::-;7940:29;7962:6;7940:29;:::i;:::-;7935:3;7931:39;7924:46;;7706:270;7616:360;;;;:::o;7982:364::-;8070:3;8098:39;8131:5;8098:39;:::i;:::-;8153:71;8217:6;8212:3;8153:71;:::i;:::-;8146:78;;8233:52;8278:6;8273:3;8266:4;8259:5;8255:16;8233:52;:::i;:::-;8310:29;8332:6;8310:29;:::i;:::-;8305:3;8301:39;8294:46;;8074:272;7982:364;;;;:::o;8352:377::-;8458:3;8486:39;8519:5;8486:39;:::i;:::-;8541:89;8623:6;8618:3;8541:89;:::i;:::-;8534:96;;8639:52;8684:6;8679:3;8672:4;8665:5;8661:16;8639:52;:::i;:::-;8716:6;8711:3;8707:16;8700:23;;8462:267;8352:377;;;;:::o;8735:366::-;8877:3;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8974:93;9063:3;8974:93;:::i;:::-;9092:2;9087:3;9083:12;9076:19;;8735:366;;;:::o;9107:::-;9249:3;9270:67;9334:2;9329:3;9270:67;:::i;:::-;9263:74;;9346:93;9435:3;9346:93;:::i;:::-;9464:2;9459:3;9455:12;9448:19;;9107:366;;;:::o;9479:::-;9621:3;9642:67;9706:2;9701:3;9642:67;:::i;:::-;9635:74;;9718:93;9807:3;9718:93;:::i;:::-;9836:2;9831:3;9827:12;9820:19;;9479:366;;;:::o;9851:::-;9993:3;10014:67;10078:2;10073:3;10014:67;:::i;:::-;10007:74;;10090:93;10179:3;10090:93;:::i;:::-;10208:2;10203:3;10199:12;10192:19;;9851:366;;;:::o;10223:::-;10365:3;10386:67;10450:2;10445:3;10386:67;:::i;:::-;10379:74;;10462:93;10551:3;10462:93;:::i;:::-;10580:2;10575:3;10571:12;10564:19;;10223:366;;;:::o;10595:400::-;10755:3;10776:84;10858:1;10853:3;10776:84;:::i;:::-;10769:91;;10869:93;10958:3;10869:93;:::i;:::-;10987:1;10982:3;10978:11;10971:18;;10595:400;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:398::-;11904:3;11925:83;12006:1;12001:3;11925:83;:::i;:::-;11918:90;;12017:93;12106:3;12017:93;:::i;:::-;12135:1;12130:3;12126:11;12119:18;;11745:398;;;:::o;12149:366::-;12291:3;12312:67;12376:2;12371:3;12312:67;:::i;:::-;12305:74;;12388:93;12477:3;12388:93;:::i;:::-;12506:2;12501:3;12497:12;12490:19;;12149:366;;;:::o;12521:::-;12663:3;12684:67;12748:2;12743:3;12684:67;:::i;:::-;12677:74;;12760:93;12849:3;12760:93;:::i;:::-;12878:2;12873:3;12869:12;12862:19;;12521:366;;;:::o;12893:::-;13035:3;13056:67;13120:2;13115:3;13056:67;:::i;:::-;13049:74;;13132:93;13221:3;13132:93;:::i;:::-;13250:2;13245:3;13241:12;13234:19;;12893:366;;;:::o;13265:::-;13407:3;13428:67;13492:2;13487:3;13428:67;:::i;:::-;13421:74;;13504:93;13593:3;13504:93;:::i;:::-;13622:2;13617:3;13613:12;13606:19;;13265:366;;;:::o;13637:::-;13779:3;13800:67;13864:2;13859:3;13800:67;:::i;:::-;13793:74;;13876:93;13965:3;13876:93;:::i;:::-;13994:2;13989:3;13985:12;13978:19;;13637:366;;;:::o;14009:400::-;14169:3;14190:84;14272:1;14267:3;14190:84;:::i;:::-;14183:91;;14283:93;14372:3;14283:93;:::i;:::-;14401:1;14396:3;14392:11;14385:18;;14009:400;;;:::o;14485:697::-;14644:4;14639:3;14635:14;14731:4;14724:5;14720:16;14714:23;14750:63;14807:4;14802:3;14798:14;14784:12;14750:63;:::i;:::-;14659:164;14915:4;14908:5;14904:16;14898:23;14934:61;14989:4;14984:3;14980:14;14966:12;14934:61;:::i;:::-;14833:172;15089:4;15082:5;15078:16;15072:23;15108:57;15159:4;15154:3;15150:14;15136:12;15108:57;:::i;:::-;15015:160;14613:569;14485:697;;:::o;15188:118::-;15275:24;15293:5;15275:24;:::i;:::-;15270:3;15263:37;15188:118;;:::o;15312:105::-;15387:23;15404:5;15387:23;:::i;:::-;15382:3;15375:36;15312:105;;:::o;15423:967::-;15805:3;15827:95;15918:3;15909:6;15827:95;:::i;:::-;15820:102;;15939:148;16083:3;15939:148;:::i;:::-;15932:155;;16104:95;16195:3;16186:6;16104:95;:::i;:::-;16097:102;;16216:148;16360:3;16216:148;:::i;:::-;16209:155;;16381:3;16374:10;;15423:967;;;;;:::o;16396:379::-;16580:3;16602:147;16745:3;16602:147;:::i;:::-;16595:154;;16766:3;16759:10;;16396:379;;;:::o;16781:222::-;16874:4;16912:2;16901:9;16897:18;16889:26;;16925:71;16993:1;16982:9;16978:17;16969:6;16925:71;:::i;:::-;16781:222;;;;:::o;17009:640::-;17204:4;17242:3;17231:9;17227:19;17219:27;;17256:71;17324:1;17313:9;17309:17;17300:6;17256:71;:::i;:::-;17337:72;17405:2;17394:9;17390:18;17381:6;17337:72;:::i;:::-;17419;17487:2;17476:9;17472:18;17463:6;17419:72;:::i;:::-;17538:9;17532:4;17528:20;17523:2;17512:9;17508:18;17501:48;17566:76;17637:4;17628:6;17566:76;:::i;:::-;17558:84;;17009:640;;;;;;;:::o;17655:210::-;17742:4;17780:2;17769:9;17765:18;17757:26;;17793:65;17855:1;17844:9;17840:17;17831:6;17793:65;:::i;:::-;17655:210;;;;:::o;17871:313::-;17984:4;18022:2;18011:9;18007:18;17999:26;;18071:9;18065:4;18061:20;18057:1;18046:9;18042:17;18035:47;18099:78;18172:4;18163:6;18099:78;:::i;:::-;18091:86;;17871:313;;;;:::o;18190:419::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:131;18597:4;18471:131;:::i;:::-;18463:139;;18190:419;;;:::o;18615:::-;18781:4;18819:2;18808:9;18804:18;18796:26;;18868:9;18862:4;18858:20;18854:1;18843:9;18839:17;18832:47;18896:131;19022:4;18896:131;:::i;:::-;18888:139;;18615:419;;;:::o;19040:::-;19206:4;19244:2;19233:9;19229:18;19221:26;;19293:9;19287:4;19283:20;19279:1;19268:9;19264:17;19257:47;19321:131;19447:4;19321:131;:::i;:::-;19313:139;;19040:419;;;:::o;19465:::-;19631:4;19669:2;19658:9;19654:18;19646:26;;19718:9;19712:4;19708:20;19704:1;19693:9;19689:17;19682:47;19746:131;19872:4;19746:131;:::i;:::-;19738:139;;19465:419;;;:::o;19890:::-;20056:4;20094:2;20083:9;20079:18;20071:26;;20143:9;20137:4;20133:20;20129:1;20118:9;20114:17;20107:47;20171:131;20297:4;20171:131;:::i;:::-;20163:139;;19890:419;;;:::o;20315:::-;20481:4;20519:2;20508:9;20504:18;20496:26;;20568:9;20562:4;20558:20;20554:1;20543:9;20539:17;20532:47;20596:131;20722:4;20596:131;:::i;:::-;20588:139;;20315:419;;;:::o;20740:::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20740:419;;;:::o;21165:::-;21331:4;21369:2;21358:9;21354:18;21346:26;;21418:9;21412:4;21408:20;21404:1;21393:9;21389:17;21382:47;21446:131;21572:4;21446:131;:::i;:::-;21438:139;;21165:419;;;:::o;21590:::-;21756:4;21794:2;21783:9;21779:18;21771:26;;21843:9;21837:4;21833:20;21829:1;21818:9;21814:17;21807:47;21871:131;21997:4;21871:131;:::i;:::-;21863:139;;21590:419;;;:::o;22015:::-;22181:4;22219:2;22208:9;22204:18;22196:26;;22268:9;22262:4;22258:20;22254:1;22243:9;22239:17;22232:47;22296:131;22422:4;22296:131;:::i;:::-;22288:139;;22015:419;;;:::o;22440:::-;22606:4;22644:2;22633:9;22629:18;22621:26;;22693:9;22687:4;22683:20;22679:1;22668:9;22664:17;22657:47;22721:131;22847:4;22721:131;:::i;:::-;22713:139;;22440:419;;;:::o;22865:::-;23031:4;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;22865:419;;;:::o;23290:346::-;23445:4;23483:2;23472:9;23468:18;23460:26;;23496:133;23626:1;23615:9;23611:17;23602:6;23496:133;:::i;:::-;23290:346;;;;:::o;23642:222::-;23735:4;23773:2;23762:9;23758:18;23750:26;;23786:71;23854:1;23843:9;23839:17;23830:6;23786:71;:::i;:::-;23642:222;;;;:::o;23870:129::-;23904:6;23931:20;;:::i;:::-;23921:30;;23960:33;23988:4;23980:6;23960:33;:::i;:::-;23870:129;;;:::o;24005:75::-;24038:6;24071:2;24065:9;24055:19;;24005:75;:::o;24086:307::-;24147:4;24237:18;24229:6;24226:30;24223:56;;;24259:18;;:::i;:::-;24223:56;24297:29;24319:6;24297:29;:::i;:::-;24289:37;;24381:4;24375;24371:15;24363:23;;24086:307;;;:::o;24399:308::-;24461:4;24551:18;24543:6;24540:30;24537:56;;;24573:18;;:::i;:::-;24537:56;24611:29;24633:6;24611:29;:::i;:::-;24603:37;;24695:4;24689;24685:15;24677:23;;24399:308;;;:::o;24713:98::-;24764:6;24798:5;24792:12;24782:22;;24713:98;;;:::o;24817:99::-;24869:6;24903:5;24897:12;24887:22;;24817:99;;;:::o;24922:168::-;25005:11;25039:6;25034:3;25027:19;25079:4;25074:3;25070:14;25055:29;;24922:168;;;;:::o;25096:147::-;25197:11;25234:3;25219:18;;25096:147;;;;:::o;25249:169::-;25333:11;25367:6;25362:3;25355:19;25407:4;25402:3;25398:14;25383:29;;25249:169;;;;:::o;25424:148::-;25526:11;25563:3;25548:18;;25424:148;;;;:::o;25578:305::-;25618:3;25637:20;25655:1;25637:20;:::i;:::-;25632:25;;25671:20;25689:1;25671:20;:::i;:::-;25666:25;;25825:1;25757:66;25753:74;25750:1;25747:81;25744:107;;;25831:18;;:::i;:::-;25744:107;25875:1;25872;25868:9;25861:16;;25578:305;;;;:::o;25889:185::-;25929:1;25946:20;25964:1;25946:20;:::i;:::-;25941:25;;25980:20;25998:1;25980:20;:::i;:::-;25975:25;;26019:1;26009:35;;26024:18;;:::i;:::-;26009:35;26066:1;26063;26059:9;26054:14;;25889:185;;;;:::o;26080:348::-;26120:7;26143:20;26161:1;26143:20;:::i;:::-;26138:25;;26177:20;26195:1;26177:20;:::i;:::-;26172:25;;26365:1;26297:66;26293:74;26290:1;26287:81;26282:1;26275:9;26268:17;26264:105;26261:131;;;26372:18;;:::i;:::-;26261:131;26420:1;26417;26413:9;26402:20;;26080:348;;;;:::o;26434:191::-;26474:4;26494:20;26512:1;26494:20;:::i;:::-;26489:25;;26528:20;26546:1;26528:20;:::i;:::-;26523:25;;26567:1;26564;26561:8;26558:34;;;26572:18;;:::i;:::-;26558:34;26617:1;26614;26610:9;26602:17;;26434:191;;;;:::o;26631:96::-;26668:7;26697:24;26715:5;26697:24;:::i;:::-;26686:35;;26631:96;;;:::o;26733:90::-;26767:7;26810:5;26803:13;26796:21;26785:32;;26733:90;;;:::o;26829:149::-;26865:7;26905:66;26898:5;26894:78;26883:89;;26829:149;;;:::o;26984:126::-;27021:7;27061:42;27054:5;27050:54;27039:65;;26984:126;;;:::o;27116:77::-;27153:7;27182:5;27171:16;;27116:77;;;:::o;27199:101::-;27235:7;27275:18;27268:5;27264:30;27253:41;;27199:101;;;:::o;27306:154::-;27390:6;27385:3;27380;27367:30;27452:1;27443:6;27438:3;27434:16;27427:27;27306:154;;;:::o;27466:307::-;27534:1;27544:113;27558:6;27555:1;27552:13;27544:113;;;27643:1;27638:3;27634:11;27628:18;27624:1;27619:3;27615:11;27608:39;27580:2;27577:1;27573:10;27568:15;;27544:113;;;27675:6;27672:1;27669:13;27666:101;;;27755:1;27746:6;27741:3;27737:16;27730:27;27666:101;27515:258;27466:307;;;:::o;27779:320::-;27823:6;27860:1;27854:4;27850:12;27840:22;;27907:1;27901:4;27897:12;27928:18;27918:81;;27984:4;27976:6;27972:17;27962:27;;27918:81;28046:2;28038:6;28035:14;28015:18;28012:38;28009:84;;;28065:18;;:::i;:::-;28009:84;27830:269;27779:320;;;:::o;28105:281::-;28188:27;28210:4;28188:27;:::i;:::-;28180:6;28176:40;28318:6;28306:10;28303:22;28282:18;28270:10;28267:34;28264:62;28261:88;;;28329:18;;:::i;:::-;28261:88;28369:10;28365:2;28358:22;28148:238;28105:281;;:::o;28392:233::-;28431:3;28454:24;28472:5;28454:24;:::i;:::-;28445:33;;28500:66;28493:5;28490:77;28487:103;;;28570:18;;:::i;:::-;28487:103;28617:1;28610:5;28606:13;28599:20;;28392:233;;;:::o;28631:176::-;28663:1;28680:20;28698:1;28680:20;:::i;:::-;28675:25;;28714:20;28732:1;28714:20;:::i;:::-;28709:25;;28753:1;28743:35;;28758:18;;:::i;:::-;28743:35;28799:1;28796;28792:9;28787:14;;28631:176;;;;:::o;28813:180::-;28861:77;28858:1;28851:88;28958:4;28955:1;28948:15;28982:4;28979:1;28972:15;28999:180;29047:77;29044:1;29037:88;29144:4;29141:1;29134:15;29168:4;29165:1;29158:15;29185:180;29233:77;29230:1;29223:88;29330:4;29327:1;29320:15;29354:4;29351:1;29344:15;29371:180;29419:77;29416:1;29409:88;29516:4;29513:1;29506:15;29540:4;29537:1;29530:15;29557:180;29605:77;29602:1;29595:88;29702:4;29699:1;29692:15;29726:4;29723:1;29716:15;29743:117;29852:1;29849;29842:12;29866:117;29975:1;29972;29965:12;29989:117;30098:1;30095;30088:12;30112:117;30221:1;30218;30211:12;30235:102;30276:6;30327:2;30323:7;30318:2;30311:5;30307:14;30303:28;30293:38;;30235:102;;;:::o;30343:225::-;30483:34;30479:1;30471:6;30467:14;30460:58;30552:8;30547:2;30539:6;30535:15;30528:33;30343:225;:::o;30574:220::-;30714:34;30710:1;30702:6;30698:14;30691:58;30783:3;30778:2;30770:6;30766:15;30759:28;30574:220;:::o;30800:168::-;30940:20;30936:1;30928:6;30924:14;30917:44;30800:168;:::o;30974:180::-;31114:32;31110:1;31102:6;31098:14;31091:56;30974:180;:::o;31160:168::-;31300:20;31296:1;31288:6;31284:14;31277:44;31160:168;:::o;31334:155::-;31474:7;31470:1;31462:6;31458:14;31451:31;31334:155;:::o;31495:182::-;31635:34;31631:1;31623:6;31619:14;31612:58;31495:182;:::o;31683:234::-;31823:34;31819:1;31811:6;31807:14;31800:58;31892:17;31887:2;31879:6;31875:15;31868:42;31683:234;:::o;31923:114::-;;:::o;32043:166::-;32183:18;32179:1;32171:6;32167:14;32160:42;32043:166;:::o;32215:172::-;32355:24;32351:1;32343:6;32339:14;32332:48;32215:172;:::o;32393:::-;32533:24;32529:1;32521:6;32517:14;32510:48;32393:172;:::o;32571:178::-;32711:30;32707:1;32699:6;32695:14;32688:54;32571:178;:::o;32755:181::-;32895:33;32891:1;32883:6;32879:14;32872:57;32755:181;:::o;32942:151::-;33082:3;33078:1;33070:6;33066:14;33059:27;32942:151;:::o;33099:122::-;33172:24;33190:5;33172:24;:::i;:::-;33165:5;33162:35;33152:63;;33211:1;33208;33201:12;33152:63;33099:122;:::o;33227:116::-;33297:21;33312:5;33297:21;:::i;:::-;33290:5;33287:32;33277:60;;33333:1;33330;33323:12;33277:60;33227:116;:::o;33349:120::-;33421:23;33438:5;33421:23;:::i;:::-;33414:5;33411:34;33401:62;;33459:1;33456;33449:12;33401:62;33349:120;:::o;33475:122::-;33548:24;33566:5;33548:24;:::i;:::-;33541:5;33538:35;33528:63;;33587:1;33584;33577:12;33528:63;33475:122;:::o

Swarm Source

ipfs://3fafc9272fb99b75c2e8b58b96151e8f9c795ac01c5d1112406caa0ef65b5564
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.