ETH Price: $3,420.48 (-1.37%)
Gas: 3 Gwei

Token

Pillooze (PILLOOZE)
 

Overview

Max Total Supply

1,274 PILLOOZE

Holders

739

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 PILLOOZE
0xcad38c80a79e8ea8f08a83008706e3ab006f4b55
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:
Pilloze

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-02
*/

// SPDX-License-Identifier: MIT     

//
//
// ██████╗ ██╗██╗     ██╗      ██████╗  ██████╗ ███████╗███████╗
// ██╔══██╗██║██║     ██║     ██╔═══██╗██╔═══██╗╚══███╔╝██╔════╝
// ██████╔╝██║██║     ██║     ██║   ██║██║   ██║  ███╔╝ █████╗  
// ██╔═══╝ ██║██║     ██║     ██║   ██║██║   ██║ ███╔╝  ██╔══╝  
// ██║     ██║███████╗███████╗╚██████╔╝╚██████╔╝███████╗███████╗
// ╚═╝     ╚═╝╚══════╝╚══════╝ ╚═════╝  ╚═════╝ ╚══════╝╚══════╝
//                                                            
//
// Web: https://pillooz.wtf
// Twitter: https://twitter.com/pilloozenft
//

pragma solidity ^0.8.0;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;
abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        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);
    }
}

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

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;


library EnumerableSet {


    struct Set {
        // Storage of set values
        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);

            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                
                set._indexes[lastValue] = valueIndex; 
            }

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

    error MintERC2309QuantityExceedsLimit();

    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {

        address addr;

        uint64 startTimestamp;

        bool burned;

        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    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,
        bytes calldata data
    ) external payable;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function approve(address to, uint256 tokenId) external payable;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {

    struct TokenApprovalRef {
        address value;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {

        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {

        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

        return
            interfaceId == 0x01ffc9a7 || 
            interfaceId == 0x80ac58cd || 
            interfaceId == 0x5b5e139f; 
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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, _toString(tokenId))) : '';
    }

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

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];

                    if (packed & _BITMASK_BURNED == 0) {

                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(address to, uint256 tokenId) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {

            owner := and(owner, _BITMASK_ADDRESS)

            msgSender := and(msgSender, _BITMASK_ADDRESS)

            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];

        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {

                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            --_packedAddressData[from]; 
            ++_packedAddressData[to]; 

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {

                toMasked := and(to, _BITMASK_ADDRESS)

                log4(
                    0, 
                    0, 
                    _TRANSFER_EVENT_SIGNATURE, 
                    0, 
                    toMasked, 
                    startTokenId 
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {

                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        assembly {
            if approvedAddress {
                
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {

            let m := add(mload(0x40), 0xa0)

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)

                mstore8(str, add(48, mod(temp, 10)))

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.16;
contract Pilloze is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{
string public CONTRACT_URI = "";
mapping(address => uint) public userHasMinted;
bool public REVEALED;
string public UNREVEALED_URI = "";
string public BASE_URI = "";
bool public isPublicMintEnabled = false;
uint public COLLECTION_SIZE = 3333; 
uint public MINT_PRICE = 0.003 ether; 
uint public MAX_BATCH_SIZE = 21;
uint public SUPPLY_PER_WALLET = 21;
uint public FREE_SUPPLY_PER_WALLET = 1;
constructor() ERC721A("Pillooze", "PILLOOZE") {}


    function MintVIP(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Pillooze in stock!"
        );
        
        _safeMint(receiver, quantity);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function getPrice(uint quantity) public view returns(uint){
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
        } else {
            price = 0;
        }
        return price;
    }

    function mint(uint quantity)
        external
        payable
        callerIsUser 
        nonReentrant
    {
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + free;
        } else {
            price = 0;
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity;
        }

        require(isPublicMintEnabled, "Pillooze not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Pillooze left!");

        require(balanceOf(msg.sender) + quantity <= SUPPLY_PER_WALLET, "Tried to mint Pillooze over over limit");

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint Pillooze over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send more money!");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

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

    function CollectionUrI(bool _revealed, string memory _baseURI) public onlyOwner {
        BASE_URI = _baseURI;
        REVEALED = _revealed;
    }

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }

    function setContract(string memory _contractURI) public onlyOwner {
        CONTRACT_URI = _contractURI;
    }

    function ChangeCollectionSupply(uint256 _new) external onlyOwner {
        COLLECTION_SIZE = _new;
    }

    function ChangePrice(uint256 _newPrice) external onlyOwner {
        MINT_PRICE = _newPrice;
    }

    function ChangeFreePerWallet(uint256 _new) external onlyOwner {
        FREE_SUPPLY_PER_WALLET = _new;
    }

    function ChangeSupplyPerWallet(uint256 _new) external onlyOwner {
        SUPPLY_PER_WALLET = _new;
    }

    function SetMaxBatchSize(uint256 _new) external onlyOwner {
        MAX_BATCH_SIZE = _new;
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public payable
        override (ERC721A, IERC721A)
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override (ERC721A, IERC721A)
        returns (string memory)
    {
        if (REVEALED) {
            return
                string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId)));
        } else {
            return UNREVEALED_URI;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"ChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"CollectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"MintVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"SetMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintEnabled","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a9081620000249190620006df565b5060405180602001604052806000815250600d9081620000459190620006df565b5060405180602001604052806000815250600e9081620000669190620006df565b506000600f60006101000a81548160ff021916908315150217905550610d05601055660aa87bee538000601155601560125560156013556001601455348015620000af57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020017f50696c6c6f6f7a650000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f50494c4c4f4f5a4500000000000000000000000000000000000000000000000081525062000153620001476200039460201b60201c565b6200039c60201b60201c565b8160039081620001649190620006df565b508060049081620001769190620006df565b50620001876200046060201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038c57801562000252576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002189291906200080b565b600060405180830381600087803b1580156200023357600080fd5b505af115801562000248573d6000803e3d6000fd5b505050506200038b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200030c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002d29291906200080b565b600060405180830381600087803b158015620002ed57600080fd5b505af115801562000302573d6000803e3d6000fd5b505050506200038a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000355919062000838565b600060405180830381600087803b1580156200037057600080fd5b505af115801562000385573d6000803e3d6000fd5b505050505b5b5b505062000855565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e757607f821691505b602082108103620004fd57620004fc6200049f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005677fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000528565b62000573868362000528565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005c0620005ba620005b4846200058b565b62000595565b6200058b565b9050919050565b6000819050919050565b620005dc836200059f565b620005f4620005eb82620005c7565b84845462000535565b825550505050565b600090565b6200060b620005fc565b62000618818484620005d1565b505050565b5b8181101562000640576200063460008262000601565b6001810190506200061e565b5050565b601f8211156200068f57620006598162000503565b620006648462000518565b8101602085101562000674578190505b6200068c620006838562000518565b8301826200061d565b50505b505050565b600082821c905092915050565b6000620006b46000198460080262000694565b1980831691505092915050565b6000620006cf8383620006a1565b9150826002028217905092915050565b620006ea8262000465565b67ffffffffffffffff81111562000706576200070562000470565b5b620007128254620004ce565b6200071f82828562000644565b600060209050601f83116001811462000757576000841562000742578287015190505b6200074e8582620006c1565b865550620007be565b601f198416620007678662000503565b60005b8281101562000791578489015182556001820191506020850194506020810190506200076a565b86831015620007b15784890151620007ad601f891682620006a1565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007f382620007c6565b9050919050565b6200080581620007e6565b82525050565b6000604082019050620008226000830185620007fa565b620008316020830184620007fa565b9392505050565b60006020820190506200084f6000830184620007fa565b92915050565b61403d80620008656000396000f3fe6080604052600436106102515760003560e01c806375b6447111610139578063c144a4ba116100b6578063e75722301161007a578063e757223014610837578063e8a3d48514610874578063e985e9c51461089f578063f2fde38b146108dc578063f814943d14610905578063fb92488b1461092e57610251565b8063c144a4ba14610750578063c87b56dd14610779578063cfdbf254146107b6578063d8258d95146107e1578063dbddb26a1461080c57610251565b8063a22cb465116100fd578063a22cb4651461069e578063a4cdd719146106c7578063a76a9587146106de578063b88d4fde14610709578063c002d23d1461072557610251565b806375b64471146105da5780638da5cb5b1461060357806395d89b411461062e578063a0712d6814610659578063a1db246e1461067557610251565b806342842e0e116101d25780635746f4df116101965780635746f4df146104cc5780635fe75587146104f55780636352211e1461052057806370a082311461055d578063715018a61461059a5780637304ff6c146105b157610251565b806342842e0e1461040857806342966c6814610424578063507862d11461044d57806356b48d631461047857806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b610422600480360381019061041d9190612f7e565b610e9e565b005b34801561043057600080fd5b5061044b60048036038101906104469190612e32565b610faa565b005b34801561045957600080fd5b50610462610fb8565b60405161046f9190612dda565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613106565b611046565b005b3480156104ad57600080fd5b506104b6611061565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee919061314f565b6110ef565b005b34801561050157600080fd5b5061050a61115c565b6040516105179190612f36565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190612e32565b611162565b6040516105549190612ea0565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612f51565b611174565b6040516105919190612f36565b60405180910390f35b3480156105a657600080fd5b506105af61122c565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906131bb565b611240565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190612e32565b611276565b005b34801561060f57600080fd5b50610618611288565b6040516106259190612ea0565b60405180910390f35b34801561063a57600080fd5b506106436112b1565b6040516106509190612dda565b60405180910390f35b610673600480360381019061066e9190612e32565b611343565b005b34801561068157600080fd5b5061069c60048036038101906106979190612e32565b611790565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613217565b6117a2565b005b3480156106d357600080fd5b506106dc6118ad565b005b3480156106ea57600080fd5b506106f36118e1565b6040516107009190612c96565b60405180910390f35b610723600480360381019061071e91906132f8565b6118f4565b005b34801561073157600080fd5b5061073a611a02565b6040516107479190612f36565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190612e32565b611a08565b005b34801561078557600080fd5b506107a0600480360381019061079b9190612e32565b611a1a565b6040516107ad9190612dda565b60405180910390f35b3480156107c257600080fd5b506107cb611af6565b6040516107d89190612f36565b60405180910390f35b3480156107ed57600080fd5b506107f6611afc565b6040516108039190612f36565b60405180910390f35b34801561081857600080fd5b50610821611b02565b60405161082e9190612dda565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190612e32565b611b90565b60405161086b9190612f36565b60405180910390f35b34801561088057600080fd5b50610889611c1a565b6040516108969190612dda565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061337b565b611cac565b6040516108d39190612c96565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe9190612f51565b611d40565b005b34801561091157600080fd5b5061092c60048036038101906109279190612e32565b611dc3565b005b34801561093a57600080fd5b5061095560048036038101906109509190612e32565b611dd5565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1882611162565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cac565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f9a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f1592919061341b565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190613459565b610f9957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f909190612ea0565b60405180910390fd5b5b610fa58383836121f3565b505050565b610fb5816001612213565b50565b600d8054610fc5906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906133ea565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b61104e612175565b80600a908161105d9190613750565b5050565b600a805461106e906133ea565b80601f016020809104026020016040519081016040528092919081815260200182805461109a906133ea565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b505050505081565b6110f7612175565b60105482611103610c57565b61110d9190613851565b111561114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906138d1565b60405180910390fd5b6111588183612465565b5050565b60135481565b600061116d82612483565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611234612175565b61123e600061254f565b565b611248612175565b80600e90816112579190613750565b5081600c60006101000a81548160ff0219169083151502179055505050565b61127e612175565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c0906133ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec906133ea565b80156113395780601f1061130e57610100808354040283529160200191611339565b820191906000526020600020905b81548152906001019060200180831161131c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061393d565b60405180910390fd5b6002600954036113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461144e919061395d565b9050808310611505578083611463919061395d565b6011546114709190613991565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114bd9190613851565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611598565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115549190613851565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff166115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90613a1f565b60405180910390fd5b601054836115f3610c57565b6115fd9190613851565b111561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590613a8b565b60405180910390fd5b6013548361164b33611174565b6116559190613851565b1115611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d90613b1d565b60405180910390fd5b6012548311156116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613baf565b60405180910390fd5b8134101561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590613c1b565b60405180910390fd5b6117283384612465565b81341115611783573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611756919061395d565b9081150290604051600060405180830381858888f19350505050158015611781573d6000803e3d6000fd5b505b5050600160098190555050565b611798612175565b8060148190555050565b80600860006117af611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661185c611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118a19190612c96565b60405180910390a35050565b6118b5612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119f0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161196b92919061341b565b6020604051808303816000875af115801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190613459565b6119ef57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119e69190612ea0565b60405180910390fd5b5b6119fc84848484612613565b50505050565b60115481565b611a10612175565b8060128190555050565b6060600c60009054906101000a900460ff1615611a6357600e611a3c83612686565b604051602001611a4d929190613cfa565b6040516020818303038152906040529050611af1565b600d8054611a70906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9c906133ea565b8015611ae95780601f10611abe57610100808354040283529160200191611ae9565b820191906000526020600020905b815481529060010190602001808311611acc57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611b0f906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b906133ea565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611be2919061395d565b9050808410611c0b578084611bf7919061395d565b601154611c049190613991565b9150611c10565b600091505b8192505050919050565b6060600a8054611c29906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c55906133ea565b8015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d48612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613d90565b60405180910390fd5b611dc08161254f565b50565b611dcb612175565b8060138190555050565b611ddd612175565b8060118190555050565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612483565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cac565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b611288565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613dfc565b60405180910390fd5b565b61220e838383604051806020016040528060008152506118f4565b505050565b600061221e83612483565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cac565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b61247f8282604051806020016040528060008152506128b8565b5050565b60008082905080612492611e4e565b11612518576001548110156125175760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612515575b6000810361250b5760056000836001900393508381526020019081526020016000205490506124e1565b809250505061254a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e1c565b915050600a826126f89190613e93565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a612fdb565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da57600182612766919061395d565b9150600a856127759190613ec4565b60306127819190613851565b60f81b81838151811061279757612796613ef5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613e93565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613f79565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190613fda565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61301382612d90565b810181811067ffffffffffffffff8211171561303257613031612fdb565b5b80604052505050565b6000613045612cb1565b9050613051828261300a565b919050565b600067ffffffffffffffff82111561307157613070612fdb565b5b61307a82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130a96130a484613056565b61303b565b9050828152602081018484840111156130c5576130c4612fd6565b5b6130d0848285613087565b509392505050565b600082601f8301126130ed576130ec612fd1565b5b81356130fd848260208601613096565b91505092915050565b60006020828403121561311c5761311b612cbb565b5b600082013567ffffffffffffffff81111561313a57613139612cc0565b5b613146848285016130d8565b91505092915050565b6000806040838503121561316657613165612cbb565b5b600061317485828601612e1d565b925050602061318585828601612ed2565b9150509250929050565b61319881612c7b565b81146131a357600080fd5b50565b6000813590506131b58161318f565b92915050565b600080604083850312156131d2576131d1612cbb565b5b60006131e0858286016131a6565b925050602083013567ffffffffffffffff81111561320157613200612cc0565b5b61320d858286016130d8565b9150509250929050565b6000806040838503121561322e5761322d612cbb565b5b600061323c85828601612ed2565b925050602061324d858286016131a6565b9150509250929050565b600067ffffffffffffffff82111561327257613271612fdb565b5b61327b82612d90565b9050602081019050919050565b600061329b61329684613257565b61303b565b9050828152602081018484840111156132b7576132b6612fd6565b5b6132c2848285613087565b509392505050565b600082601f8301126132df576132de612fd1565b5b81356132ef848260208601613288565b91505092915050565b6000806000806080858703121561331257613311612cbb565b5b600061332087828801612ed2565b945050602061333187828801612ed2565b935050604061334287828801612e1d565b925050606085013567ffffffffffffffff81111561336357613362612cc0565b5b61336f878288016132ca565b91505092959194509250565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161318f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c9565b61361086836135c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061364d61364861364384612dfc565b613628565b612dfc565b9050919050565b6000819050919050565b61366783613632565b61367b61367382613654565b8484546135d6565b825550505050565b600090565b613690613683565b61369b81848461365e565b505050565b5b818110156136bf576136b4600082613688565b6001810190506136a1565b5050565b601f821115613704576136d5816135a4565b6136de846135b9565b810160208510156136ed578190505b6137016136f9856135b9565b8301826136a0565b50505b505050565b600082821c905092915050565b600061372760001984600802613709565b1980831691505092915050565b60006137408383613716565b9150826002028217905092915050565b61375982612d4a565b67ffffffffffffffff81111561377257613771612fdb565b5b61377c82546133ea565b6137878282856136c3565b600060209050601f8311600181146137ba57600084156137a8578287015190505b6137b28582613734565b86555061381a565b601f1984166137c8866135a4565b60005b828110156137f0578489015182556001820191506020850194506020810190506137cb565b8683101561380d5784890151613809601f891682613716565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385c82612dfc565b915061386783612dfc565b925082820190508082111561387f5761387e613822565b5b92915050565b7f4e6f206d6f72652050696c6c6f6f7a6520696e2073746f636b21000000000000600082015250565b60006138bb601a83612d55565b91506138c682613885565b602082019050919050565b600060208201905081810360008301526138ea816138ae565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613927601e83612d55565b9150613932826138f1565b602082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b600061396882612dfc565b915061397383612dfc565b925082820390508181111561398b5761398a613822565b5b92915050565b600061399c82612dfc565b91506139a783612dfc565b92508282026139b581612dfc565b915082820484148315176139cc576139cb613822565b5b5092915050565b7f50696c6c6f6f7a65206e6f742072656164792079657421000000000000000000600082015250565b6000613a09601783612d55565b9150613a14826139d3565b602082019050919050565b60006020820190508181036000830152613a38816139fc565b9050919050565b7f4e6f206d6f72652050696c6c6f6f7a65206c6566742100000000000000000000600082015250565b6000613a75601683612d55565b9150613a8082613a3f565b602082019050919050565b60006020820190508181036000830152613aa481613a68565b9050919050565b7f547269656420746f206d696e742050696c6c6f6f7a65206f766572206f76657260008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b6000613b07602683612d55565b9150613b1282613aab565b604082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f547269656420746f206d696e742050696c6c6f6f7a65206f766572206c696d6960008201527f742c20726574727920776974682072656475636564207175616e746974790000602082015250565b6000613b99603e83612d55565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613c05601583612d55565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b600081905092915050565b60008154613c53816133ea565b613c5d8186613c3b565b94506001821660008114613c785760018114613c8d57613cc0565b60ff1983168652811515820286019350613cc0565b613c96856135a4565b60005b83811015613cb857815481890152600182019150602081019050613c99565b838801955050505b50505092915050565b6000613cd482612d4a565b613cde8185613c3b565b9350613cee818560208601612d66565b80840191505092915050565b6000613d068285613c46565b9150613d128284613cc9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d7a602683612d55565b9150613d8582613d1e565b604082019050919050565b60006020820190508181036000830152613da981613d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613de6602083612d55565b9150613df182613db0565b602082019050919050565b60006020820190508181036000830152613e1581613dd9565b9050919050565b6000613e2782612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5957613e58613822565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e9e82612dfc565b9150613ea983612dfc565b925082613eb957613eb8613e64565b5b828204905092915050565b6000613ecf82612dfc565b9150613eda83612dfc565b925082613eea57613ee9613e64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f4b82613f24565b613f558185613f2f565b9350613f65818560208601612d66565b613f6e81612d90565b840191505092915050565b6000608082019050613f8e6000830187612e91565b613f9b6020830186612e91565b613fa86040830185612f27565b8181036060830152613fba8184613f40565b905095945050505050565b600081519050613fd481612cf1565b92915050565b600060208284031215613ff057613fef612cbb565b5b6000613ffe84828501613fc5565b9150509291505056fea2646970667358221220f1926aece43e9528264cc25e64152388b3095da631e96cc382c549164285813464736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806375b6447111610139578063c144a4ba116100b6578063e75722301161007a578063e757223014610837578063e8a3d48514610874578063e985e9c51461089f578063f2fde38b146108dc578063f814943d14610905578063fb92488b1461092e57610251565b8063c144a4ba14610750578063c87b56dd14610779578063cfdbf254146107b6578063d8258d95146107e1578063dbddb26a1461080c57610251565b8063a22cb465116100fd578063a22cb4651461069e578063a4cdd719146106c7578063a76a9587146106de578063b88d4fde14610709578063c002d23d1461072557610251565b806375b64471146105da5780638da5cb5b1461060357806395d89b411461062e578063a0712d6814610659578063a1db246e1461067557610251565b806342842e0e116101d25780635746f4df116101965780635746f4df146104cc5780635fe75587146104f55780636352211e1461052057806370a082311461055d578063715018a61461059a5780637304ff6c146105b157610251565b806342842e0e1461040857806342966c6814610424578063507862d11461044d57806356b48d631461047857806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b610422600480360381019061041d9190612f7e565b610e9e565b005b34801561043057600080fd5b5061044b60048036038101906104469190612e32565b610faa565b005b34801561045957600080fd5b50610462610fb8565b60405161046f9190612dda565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613106565b611046565b005b3480156104ad57600080fd5b506104b6611061565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee919061314f565b6110ef565b005b34801561050157600080fd5b5061050a61115c565b6040516105179190612f36565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190612e32565b611162565b6040516105549190612ea0565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612f51565b611174565b6040516105919190612f36565b60405180910390f35b3480156105a657600080fd5b506105af61122c565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906131bb565b611240565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190612e32565b611276565b005b34801561060f57600080fd5b50610618611288565b6040516106259190612ea0565b60405180910390f35b34801561063a57600080fd5b506106436112b1565b6040516106509190612dda565b60405180910390f35b610673600480360381019061066e9190612e32565b611343565b005b34801561068157600080fd5b5061069c60048036038101906106979190612e32565b611790565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613217565b6117a2565b005b3480156106d357600080fd5b506106dc6118ad565b005b3480156106ea57600080fd5b506106f36118e1565b6040516107009190612c96565b60405180910390f35b610723600480360381019061071e91906132f8565b6118f4565b005b34801561073157600080fd5b5061073a611a02565b6040516107479190612f36565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190612e32565b611a08565b005b34801561078557600080fd5b506107a0600480360381019061079b9190612e32565b611a1a565b6040516107ad9190612dda565b60405180910390f35b3480156107c257600080fd5b506107cb611af6565b6040516107d89190612f36565b60405180910390f35b3480156107ed57600080fd5b506107f6611afc565b6040516108039190612f36565b60405180910390f35b34801561081857600080fd5b50610821611b02565b60405161082e9190612dda565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190612e32565b611b90565b60405161086b9190612f36565b60405180910390f35b34801561088057600080fd5b50610889611c1a565b6040516108969190612dda565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061337b565b611cac565b6040516108d39190612c96565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe9190612f51565b611d40565b005b34801561091157600080fd5b5061092c60048036038101906109279190612e32565b611dc3565b005b34801561093a57600080fd5b5061095560048036038101906109509190612e32565b611dd5565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1882611162565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cac565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f9a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f1592919061341b565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190613459565b610f9957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f909190612ea0565b60405180910390fd5b5b610fa58383836121f3565b505050565b610fb5816001612213565b50565b600d8054610fc5906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906133ea565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b61104e612175565b80600a908161105d9190613750565b5050565b600a805461106e906133ea565b80601f016020809104026020016040519081016040528092919081815260200182805461109a906133ea565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b505050505081565b6110f7612175565b60105482611103610c57565b61110d9190613851565b111561114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906138d1565b60405180910390fd5b6111588183612465565b5050565b60135481565b600061116d82612483565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611234612175565b61123e600061254f565b565b611248612175565b80600e90816112579190613750565b5081600c60006101000a81548160ff0219169083151502179055505050565b61127e612175565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c0906133ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec906133ea565b80156113395780601f1061130e57610100808354040283529160200191611339565b820191906000526020600020905b81548152906001019060200180831161131c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061393d565b60405180910390fd5b6002600954036113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461144e919061395d565b9050808310611505578083611463919061395d565b6011546114709190613991565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114bd9190613851565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611598565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115549190613851565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff166115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90613a1f565b60405180910390fd5b601054836115f3610c57565b6115fd9190613851565b111561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590613a8b565b60405180910390fd5b6013548361164b33611174565b6116559190613851565b1115611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d90613b1d565b60405180910390fd5b6012548311156116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613baf565b60405180910390fd5b8134101561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590613c1b565b60405180910390fd5b6117283384612465565b81341115611783573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611756919061395d565b9081150290604051600060405180830381858888f19350505050158015611781573d6000803e3d6000fd5b505b5050600160098190555050565b611798612175565b8060148190555050565b80600860006117af611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661185c611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118a19190612c96565b60405180910390a35050565b6118b5612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119f0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161196b92919061341b565b6020604051808303816000875af115801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae9190613459565b6119ef57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119e69190612ea0565b60405180910390fd5b5b6119fc84848484612613565b50505050565b60115481565b611a10612175565b8060128190555050565b6060600c60009054906101000a900460ff1615611a6357600e611a3c83612686565b604051602001611a4d929190613cfa565b6040516020818303038152906040529050611af1565b600d8054611a70906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9c906133ea565b8015611ae95780601f10611abe57610100808354040283529160200191611ae9565b820191906000526020600020905b815481529060010190602001808311611acc57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611b0f906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b906133ea565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611be2919061395d565b9050808410611c0b578084611bf7919061395d565b601154611c049190613991565b9150611c10565b600091505b8192505050919050565b6060600a8054611c29906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c55906133ea565b8015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d48612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613d90565b60405180910390fd5b611dc08161254f565b50565b611dcb612175565b8060138190555050565b611ddd612175565b8060118190555050565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612483565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cac565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b611288565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613dfc565b60405180910390fd5b565b61220e838383604051806020016040528060008152506118f4565b505050565b600061221e83612483565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cac565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b61247f8282604051806020016040528060008152506128b8565b5050565b60008082905080612492611e4e565b11612518576001548110156125175760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612515575b6000810361250b5760056000836001900393508381526020019081526020016000205490506124e1565b809250505061254a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e1c565b915050600a826126f89190613e93565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a612fdb565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da57600182612766919061395d565b9150600a856127759190613ec4565b60306127819190613851565b60f81b81838151811061279757612796613ef5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613e93565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613f79565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190613fda565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61301382612d90565b810181811067ffffffffffffffff8211171561303257613031612fdb565b5b80604052505050565b6000613045612cb1565b9050613051828261300a565b919050565b600067ffffffffffffffff82111561307157613070612fdb565b5b61307a82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130a96130a484613056565b61303b565b9050828152602081018484840111156130c5576130c4612fd6565b5b6130d0848285613087565b509392505050565b600082601f8301126130ed576130ec612fd1565b5b81356130fd848260208601613096565b91505092915050565b60006020828403121561311c5761311b612cbb565b5b600082013567ffffffffffffffff81111561313a57613139612cc0565b5b613146848285016130d8565b91505092915050565b6000806040838503121561316657613165612cbb565b5b600061317485828601612e1d565b925050602061318585828601612ed2565b9150509250929050565b61319881612c7b565b81146131a357600080fd5b50565b6000813590506131b58161318f565b92915050565b600080604083850312156131d2576131d1612cbb565b5b60006131e0858286016131a6565b925050602083013567ffffffffffffffff81111561320157613200612cc0565b5b61320d858286016130d8565b9150509250929050565b6000806040838503121561322e5761322d612cbb565b5b600061323c85828601612ed2565b925050602061324d858286016131a6565b9150509250929050565b600067ffffffffffffffff82111561327257613271612fdb565b5b61327b82612d90565b9050602081019050919050565b600061329b61329684613257565b61303b565b9050828152602081018484840111156132b7576132b6612fd6565b5b6132c2848285613087565b509392505050565b600082601f8301126132df576132de612fd1565b5b81356132ef848260208601613288565b91505092915050565b6000806000806080858703121561331257613311612cbb565b5b600061332087828801612ed2565b945050602061333187828801612ed2565b935050604061334287828801612e1d565b925050606085013567ffffffffffffffff81111561336357613362612cc0565b5b61336f878288016132ca565b91505092959194509250565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161318f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c9565b61361086836135c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061364d61364861364384612dfc565b613628565b612dfc565b9050919050565b6000819050919050565b61366783613632565b61367b61367382613654565b8484546135d6565b825550505050565b600090565b613690613683565b61369b81848461365e565b505050565b5b818110156136bf576136b4600082613688565b6001810190506136a1565b5050565b601f821115613704576136d5816135a4565b6136de846135b9565b810160208510156136ed578190505b6137016136f9856135b9565b8301826136a0565b50505b505050565b600082821c905092915050565b600061372760001984600802613709565b1980831691505092915050565b60006137408383613716565b9150826002028217905092915050565b61375982612d4a565b67ffffffffffffffff81111561377257613771612fdb565b5b61377c82546133ea565b6137878282856136c3565b600060209050601f8311600181146137ba57600084156137a8578287015190505b6137b28582613734565b86555061381a565b601f1984166137c8866135a4565b60005b828110156137f0578489015182556001820191506020850194506020810190506137cb565b8683101561380d5784890151613809601f891682613716565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061385c82612dfc565b915061386783612dfc565b925082820190508082111561387f5761387e613822565b5b92915050565b7f4e6f206d6f72652050696c6c6f6f7a6520696e2073746f636b21000000000000600082015250565b60006138bb601a83612d55565b91506138c682613885565b602082019050919050565b600060208201905081810360008301526138ea816138ae565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613927601e83612d55565b9150613932826138f1565b602082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b600061396882612dfc565b915061397383612dfc565b925082820390508181111561398b5761398a613822565b5b92915050565b600061399c82612dfc565b91506139a783612dfc565b92508282026139b581612dfc565b915082820484148315176139cc576139cb613822565b5b5092915050565b7f50696c6c6f6f7a65206e6f742072656164792079657421000000000000000000600082015250565b6000613a09601783612d55565b9150613a14826139d3565b602082019050919050565b60006020820190508181036000830152613a38816139fc565b9050919050565b7f4e6f206d6f72652050696c6c6f6f7a65206c6566742100000000000000000000600082015250565b6000613a75601683612d55565b9150613a8082613a3f565b602082019050919050565b60006020820190508181036000830152613aa481613a68565b9050919050565b7f547269656420746f206d696e742050696c6c6f6f7a65206f766572206f76657260008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b6000613b07602683612d55565b9150613b1282613aab565b604082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f547269656420746f206d696e742050696c6c6f6f7a65206f766572206c696d6960008201527f742c20726574727920776974682072656475636564207175616e746974790000602082015250565b6000613b99603e83612d55565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613c05601583612d55565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b600081905092915050565b60008154613c53816133ea565b613c5d8186613c3b565b94506001821660008114613c785760018114613c8d57613cc0565b60ff1983168652811515820286019350613cc0565b613c96856135a4565b60005b83811015613cb857815481890152600182019150602081019050613c99565b838801955050505b50505092915050565b6000613cd482612d4a565b613cde8185613c3b565b9350613cee818560208601612d66565b80840191505092915050565b6000613d068285613c46565b9150613d128284613cc9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d7a602683612d55565b9150613d8582613d1e565b604082019050919050565b60006020820190508181036000830152613da981613d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613de6602083612d55565b9150613df182613db0565b602082019050919050565b60006020820190508181036000830152613e1581613dd9565b9050919050565b6000613e2782612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5957613e58613822565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e9e82612dfc565b9150613ea983612dfc565b925082613eb957613eb8613e64565b5b828204905092915050565b6000613ecf82612dfc565b9150613eda83612dfc565b925082613eea57613ee9613e64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f4b82613f24565b613f558185613f2f565b9350613f65818560208601612d66565b613f6e81612d90565b840191505092915050565b6000608082019050613f8e6000830187612e91565b613f9b6020830186612e91565b613fa86040830185612f27565b8181036060830152613fba8184613f40565b905095945050505050565b600081519050613fd481612cf1565b92915050565b600060208284031215613ff057613fef612cbb565b5b6000613ffe84828501613fc5565b9150509291505056fea2646970667358221220f1926aece43e9528264cc25e64152388b3095da631e96cc382c549164285813464736f6c63430008130033

Deployed Bytecode Sourcemap

35150:4665:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35419:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15647:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15899:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19475:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19059:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35610:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14010:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35282:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38817:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37675:191;;;;;;;;;;;;;:::i;:::-;;39010:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35023:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35353:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38136:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35248:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35709:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35573:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16547:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14475:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2005:103;;;;;;;;;;;;;:::i;:::-;;37874:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38256:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1770:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16007:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36436:1115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38478:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19701:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37557:110;;;;;;;;;;;;;:::i;:::-;;35330:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39211:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35499:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38711:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39469:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35539:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35461:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35389:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36104:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38031:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19943:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2118:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38596:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38370:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35419:39;;;;;;;;;;;;;:::o;15647:244::-;15732:4;15786:10;15771:25;;:11;:25;;;;:68;;;;15829:10;15814:25;;:11;:25;;;;15771:68;:111;;;;15872:10;15857:25;;:11;:25;;;;15771:111;15751:131;;15647:244;;;:::o;15899:100::-;15953:13;15986:5;15979:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15899:100;:::o;19475:218::-;19551:7;19576:16;19584:7;19576;:16::i;:::-;19571:64;;19601:34;;;;;;;;;;;;;;19571:64;19655:15;:24;19671:7;19655:24;;;;;;;;;;;:30;;;;;;;;;;;;19648:37;;19475:218;;;:::o;19059:408::-;19148:13;19164:16;19172:7;19164;:16::i;:::-;19148:32;;19220:5;19197:28;;:19;:17;:19::i;:::-;:28;;;19193:175;;19245:44;19262:5;19269:19;:17;:19::i;:::-;19245:16;:44::i;:::-;19240:128;;19317:35;;;;;;;;;;;;;;19240:128;19193:175;19413:2;19380:15;:24;19396:7;19380:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;19451:7;19447:2;19431:28;;19440:5;19431:28;;;;;;;;;;;;19137:330;19059:408;;:::o;35610:38::-;;;;:::o;14010:180::-;14071:7;14156:15;:13;:15::i;:::-;14141:12;;14125:13;;:28;:46;14118:53;;14010:180;:::o;35282:45::-;;;;;;;;;;;;;;;;;:::o;38817:185::-;32259:1;31470:42;32213:43;;;:47;32209:225;;;31470:42;32282:40;;;32331:4;32338:10;32282:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32277:146;;32396:10;32377:30;;;;;;;;;;;:::i;:::-;;;;;;;;32277:146;32209:225;38957:37:::1;38976:4;38982:2;38986:7;38957:18;:37::i;:::-;38817:185:::0;;;:::o;37675:191::-;1729:13;:11;:13::i;:::-;2679:1:::1;2837:7;;:19:::0;2829:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2679:1;2905:7;:18;;;;37744:12:::2;37762:10;:15;;37785:21;37762:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37743:68;;;37830:7;37822:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;37732:134;2635:1:::1;2950:7;:22;;;;37675:191::o:0;39010:193::-;32259:1;31470:42;32213:43;;;:47;32209:225;;;31470:42;32282:40;;;32331:4;32338:10;32282:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32277:146;;32396:10;32377:30;;;;;;;;;;;:::i;:::-;;;;;;;;32277:146;32209:225;39154:41:::1;39177:4;39183:2;39187:7;39154:22;:41::i;:::-;39010:193:::0;;;:::o;35023:94::-;35089:20;35095:7;35104:4;35089:5;:20::i;:::-;35023:94;:::o;35353:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38136:112::-;1729:13;:11;:13::i;:::-;38228:12:::1;38213;:27;;;;;;:::i;:::-;;38136:112:::0;:::o;35248:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35709:258::-;1729:13;:11;:13::i;:::-;35840:15:::1;;35828:8;35812:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;35790:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;35930:29;35940:8;35950;35930:9;:29::i;:::-;35709:258:::0;;:::o;35573:34::-;;;;:::o;16547:152::-;16619:7;16662:27;16681:7;16662:18;:27::i;:::-;16639:52;;16547:152;;;:::o;14475:233::-;14547:7;14588:1;14571:19;;:5;:19;;;14567:60;;14599:28;;;;;;;;;;;;;;14567:60;12283:13;14645:18;:25;14664:5;14645:25;;;;;;;;;;;;;;;;:55;14638:62;;14475:233;;;:::o;2005:103::-;1729:13;:11;:13::i;:::-;2070:30:::1;2097:1;2070:18;:30::i;:::-;2005:103::o:0;37874:149::-;1729:13;:11;:13::i;:::-;37976:8:::1;37965;:19;;;;;;:::i;:::-;;38006:9;37995:8;;:20;;;;;;;;;;;;;;;;;;37874:149:::0;;:::o;38256:106::-;1729:13;:11;:13::i;:::-;38350:4:::1;38332:15;:22;;;;38256:106:::0;:::o;1770:87::-;1816:7;1843:6;;;;;;;;;;;1836:13;;1770:87;:::o;16007:104::-;16063:13;16096:7;16089:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16007:104;:::o;36436:1115::-;36031:10;36018:23;;:9;:23;;;36010:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2679:1:::1;2837:7;;:19:::0;2829:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2679:1;2905:7;:18;;;;36561:10:::2;36582:9:::0;36619:13:::2;:25;36633:10;36619:25;;;;;;;;;;;;;;;;36594:22;;:50;;;;:::i;:::-;36582:62;;36671:4;36659:8;:16;36655:285;;36727:4;36716:8;:15;;;;:::i;:::-;36701:10;;36700:32;;;;:::i;:::-;36692:40;;36803:4;36775:13;:25;36789:10;36775:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;36747:13;:25;36761:10;36747:25;;;;;;;;;;;;;;;:60;;;;36655:285;;;36848:1;36840:9;;36920:8;36892:13;:25;36906:10;36892:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;36864:13;:25;36878:10;36864:25;;;;;;;;;;;;;;;:64;;;;36655:285;36960:19;;;;;;;;;;;36952:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37054:15;;37042:8;37026:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37018:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;37153:17;;37141:8;37117:21;37127:10;37117:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;37109:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;37246:14;;37234:8;:26;;37226:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;37359:5;37346:9;:18;;37338:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37403:31;37413:10;37425:8;37403:9;:31::i;:::-;37463:5;37451:9;:17;37447:97;;;37493:10;37485:28;;:47;37526:5;37514:9;:17;;;;:::i;:::-;37485:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;37447:97;36550:1001;;2635:1:::1;2950:7;:22;;;;36436:1115:::0;:::o;38478:110::-;1729:13;:11;:13::i;:::-;38576:4:::1;38551:22;:29;;;;38478:110:::0;:::o;19701:234::-;19848:8;19796:18;:39;19815:19;:17;:19::i;:::-;19796:39;;;;;;;;;;;;;;;:49;19836:8;19796:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;19908:8;19872:55;;19887:19;:17;:19::i;:::-;19872:55;;;19918:8;19872:55;;;;;;:::i;:::-;;;;;;;;19701:234;;:::o;37557:110::-;1729:13;:11;:13::i;:::-;37640:19:::1;;;;;;;;;;;37639:20;37617:19;;:42;;;;;;;;;;;;;;;;;;37557:110::o:0;35330:20::-;;;;;;;;;;;;;:::o;39211:250::-;32259:1;31470:42;32213:43;;;:47;32209:225;;;31470:42;32282:40;;;32331:4;32338:10;32282:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32277:146;;32396:10;32377:30;;;;;;;;;;;:::i;:::-;;;;;;;;32277:146;32209:225;39406:47:::1;39429:4;39435:2;39439:7;39448:4;39406:22;:47::i;:::-;39211:250:::0;;;;:::o;35499:36::-;;;;:::o;38711:98::-;1729:13;:11;:13::i;:::-;38797:4:::1;38780:14;:21;;;;38711:98:::0;:::o;39469:341::-;39591:13;39626:8;;;;;;;;;;;39622:181;;;39699:8;39709:26;39726:8;39709:16;:26::i;:::-;39682:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39651:86;;;;39622:181;39777:14;39770:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39469:341;;;;:::o;35539:31::-;;;;:::o;35461:34::-;;;;:::o;35389:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36104:324::-;36157:4;36173:10;36194:9;36231:13;:25;36245:10;36231:25;;;;;;;;;;;;;;;;36206:22;;:50;;;;:::i;:::-;36194:62;;36283:4;36271:8;:16;36267:131;;36339:4;36328:8;:15;;;;:::i;:::-;36313:10;;36312:32;;;;:::i;:::-;36304:40;;36267:131;;;36385:1;36377:9;;36267:131;36415:5;36408:12;;;;36104:324;;;:::o;38031:97::-;38075:13;38108:12;38101:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38031:97;:::o;19943:164::-;20040:4;20064:18;:25;20083:5;20064:25;;;;;;;;;;;;;;;:35;20090:8;20064:35;;;;;;;;;;;;;;;;;;;;;;;;;20057:42;;19943:164;;;;:::o;2118:201::-;1729:13;:11;:13::i;:::-;2227:1:::1;2207:22;;:8;:22;;::::0;2199:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2283:28;2302:8;2283:18;:28::i;:::-;2118:201:::0;:::o;38596:107::-;1729:13;:11;:13::i;:::-;38691:4:::1;38671:17;:24;;;;38596:107:::0;:::o;38370:100::-;1729:13;:11;:13::i;:::-;38453:9:::1;38440:10;:22;;;;38370:100:::0;:::o;20115:282::-;20180:4;20236:7;20217:15;:13;:15::i;:::-;:26;;:66;;;;;20270:13;;20260:7;:23;20217:66;:153;;;;;20369:1;12657:8;20321:17;:26;20339:7;20321:26;;;;;;;;;;;;:44;:49;20217:153;20197:173;;20115:282;;;:::o;30495:105::-;30555:7;30582:10;30575:17;;30495:105;:::o;13799:92::-;13855:7;13799:92;:::o;21210:1651::-;21352:27;21382;21401:7;21382:18;:27::i;:::-;21352:57;;21467:4;21426:45;;21442:19;21426:45;;;21422:86;;21480:28;;;;;;;;;;;;;;21422:86;21522:27;21551:23;21578:35;21605:7;21578:26;:35::i;:::-;21521:92;;;;21631:68;21656:15;21673:4;21679:19;:17;:19::i;:::-;21631:24;:68::i;:::-;21626:180;;21719:43;21736:4;21742:19;:17;:19::i;:::-;21719:16;:43::i;:::-;21714:92;;21771:35;;;;;;;;;;;;;;21714:92;21626:180;21837:1;21823:16;;:2;:16;;;21819:52;;21848:23;;;;;;;;;;;;;;21819:52;21884:43;21906:4;21912:2;21916:7;21925:1;21884:21;:43::i;:::-;21967:15;21964:85;;;22032:1;22011:19;22004:30;21964:85;22101:18;:24;22120:4;22101:24;;;;;;;;;;;;;;;;22099:26;;;;;;;;;;;;22143:18;:22;22162:2;22143:22;;;;;;;;;;;;;;;;22141:24;;;;;;;;;;;22212:146;22249:2;22298:45;22313:4;22319:2;22323:19;22298:14;:45::i;:::-;12791:8;22270:73;22212:18;:146::i;:::-;22183:17;:26;22201:7;22183:26;;;;;;;;;;;:175;;;;22430:1;12791:8;22379:19;:47;:52;22375:370;;22452:19;22484:1;22474:7;:11;22452:33;;22544:1;22510:17;:30;22528:11;22510:30;;;;;;;;;;;;:35;22506:224;;22591:13;;22576:11;:28;22572:139;;22668:19;22635:17;:30;22653:11;22635:30;;;;;;;;;;;:52;;;;22572:139;22506:224;22433:312;22375:370;22792:7;22788:2;22773:27;;22782:4;22773:27;;;;;;;;;;;;22811:42;22832:4;22838:2;22842:7;22851:1;22811:20;:42::i;:::-;21341:1520;;;21210:1651;;;:::o;1865:132::-;1940:12;:10;:12::i;:::-;1929:23;;:7;:5;:7::i;:::-;:23;;;1921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1865:132::o;22869:193::-;23015:39;23032:4;23038:2;23042:7;23015:39;;;;;;;;;;;;:16;:39::i;:::-;22869:193;;;:::o;27865:1679::-;27945:27;27975;27994:7;27975:18;:27::i;:::-;27945:57;;28015:12;28046:19;28015:52;;28081:27;28110:23;28137:35;28164:7;28137:26;:35::i;:::-;28080:92;;;;28189:13;28185:244;;;28238:68;28263:15;28280:4;28286:19;:17;:19::i;:::-;28238:24;:68::i;:::-;28233:184;;28330:43;28347:4;28353:19;:17;:19::i;:::-;28330:16;:43::i;:::-;28325:92;;28382:35;;;;;;;;;;;;;;28325:92;28233:184;28185:244;28441:51;28463:4;28477:1;28481:7;28490:1;28441:21;:51::i;:::-;28532:15;28529:101;;;28613:1;28592:19;28585:30;28529:101;28739:1;12414:3;28709:1;:26;;28708:32;28680:18;:24;28699:4;28680:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;28786:176;28823:4;28894:53;28909:4;28923:1;28927:19;28894:14;:53::i;:::-;12791:8;12657;28847:43;28846:101;28786:18;:176::i;:::-;28757:17;:26;28775:7;28757:26;;;;;;;;;;;:205;;;;29034:1;12791:8;28983:19;:47;:52;28979:370;;29056:19;29088:1;29078:7;:11;29056:33;;29148:1;29114:17;:30;29132:11;29114:30;;;;;;;;;;;;:35;29110:224;;29195:13;;29180:11;:28;29176:139;;29272:19;29239:17;:30;29257:11;29239:30;;;;;;;;;;;:52;;;;29176:139;29110:224;29037:312;28979:370;29404:7;29400:1;29377:35;;29386:4;29377:35;;;;;;;;;;;;29423:50;29444:4;29458:1;29462:7;29471:1;29423:20;:50::i;:::-;29511:12;;:14;;;;;;;;;;;;;27934:1610;;;;27865:1679;;:::o;27648:112::-;27725:27;27735:2;27739:8;27725:27;;;;;;;;;;;;:9;:27::i;:::-;27648:112;;:::o;17254:633::-;17321:7;17341:12;17356:7;17341:22;;17424:4;17405:15;:13;:15::i;:::-;:23;17401:419;;17458:13;;17451:4;:20;17447:373;;;17496:14;17513:17;:23;17531:4;17513:23;;;;;;;;;;;;17496:40;;17593:1;12657:8;17565:6;:24;:29;17561:240;;17625:113;17642:1;17632:6;:11;17625:113;;17685:17;:25;17703:6;;;;;;;17685:25;;;;;;;;;;;;17676:34;;17625:113;;;17771:6;17764:13;;;;;;17561:240;17473:347;17447:373;17401:419;17848:31;;;;;;;;;;;;;;17254:633;;;;:::o;2327:191::-;2401:16;2420:6;;;;;;;;;;;2401:25;;2446:8;2437:6;;:17;;;;;;;;;;;;;;;;;;2501:8;2470:40;;2491:8;2470:40;;;;;;;;;;;;2390:128;2327:191;:::o;23070:407::-;23245:31;23258:4;23264:2;23268:7;23245:12;:31::i;:::-;23309:1;23291:2;:14;;;:19;23287:183;;23330:56;23361:4;23367:2;23371:7;23380:5;23330:30;:56::i;:::-;23325:145;;23414:40;;;;;;;;;;;;;;23325:145;23287:183;23070:407;;;;:::o;3154:534::-;3210:13;3251:1;3242:5;:10;3238:53;;3269:10;;;;;;;;;;;;;;;;;;;;;3238:53;3301:12;3316:5;3301:20;;3332:14;3357:78;3372:1;3364:4;:9;3357:78;;3390:8;;;;;:::i;:::-;;;;3421:2;3413:10;;;;;:::i;:::-;;;3357:78;;;3445:19;3477:6;3467:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3445:39;;3495:154;3511:1;3502:5;:10;3495:154;;3539:1;3529:11;;;;;:::i;:::-;;;3606:2;3598:5;:10;;;;:::i;:::-;3585:2;:24;;;;:::i;:::-;3572:39;;3555:6;3562;3555:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3635:2;3626:11;;;;;:::i;:::-;;;3495:154;;;3673:6;3659:21;;;;;3154:534;;;;:::o;20810:392::-;20912:27;20941:23;20982:38;21023:15;:24;21039:7;21023:24;;;;;;;;;;;20982:65;;21107:18;21084:41;;21164:19;21158:26;21139:45;;21069:126;20810:392;;;:::o;20405:397::-;20554:11;20624:16;20617:5;20613:28;20604:37;;20685:16;20674:9;20670:32;20657:45;;20767:15;20756:9;20753:30;20745:5;20734:9;20731:20;20728:56;20718:66;;20405:397;;;;;:::o;23485:159::-;;;;;:::o;30176:311::-;30311:7;30331:16;12854:3;30357:19;:41;;30331:68;;12854:3;30425:31;30436:4;30442:2;30446:9;30425:10;:31::i;:::-;30417:40;;:62;;30410:69;;;30176:311;;;;;:::o;18269:450::-;18349:14;18517:16;18510:5;18506:28;18497:37;;18694:5;18680:11;18655:23;18651:41;18648:52;18641:5;18638:63;18628:73;;18269:450;;;;:::o;23652:158::-;;;;;:::o;1218:98::-;1271:7;1298:10;1291:17;;1218:98;:::o;26951:689::-;27082:19;27088:2;27092:8;27082:5;:19::i;:::-;27161:1;27143:2;:14;;;:19;27139:483;;27183:11;27197:13;;27183:27;;27229:13;27251:8;27245:3;:14;27229:30;;27278:233;27309:62;27348:1;27352:2;27356:7;;;;;;27365:5;27309:30;:62::i;:::-;27304:167;;27407:40;;;;;;;;;;;;;;27304:167;27506:3;27498:5;:11;27278:233;;27593:3;27576:13;;:20;27572:34;;27598:8;;;27572:34;27164:458;;27139:483;26951:689;;;:::o;23818:716::-;23981:4;24027:2;24002:45;;;24048:19;:17;:19::i;:::-;24069:4;24075:7;24084:5;24002:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23998:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24302:1;24285:6;:13;:18;24281:235;;24331:40;;;;;;;;;;;;;;24281:235;24474:6;24468:13;24459:6;24455:2;24451:15;24444:38;23998:529;24171:54;;;24161:64;;;:6;:64;;;;24154:71;;;23818:716;;;;;;:::o;30021:147::-;30158:6;30021:147;;;;;:::o;24542:1442::-;24615:20;24638:13;;24615:36;;24678:1;24666:8;:13;24662:44;;24688:18;;;;;;;;;;;;;;24662:44;24719:61;24749:1;24753:2;24757:12;24771:8;24719:21;:61::i;:::-;24889:1;12354:2;24859:1;:26;;24858:32;24846:8;:45;24820:18;:22;24839:2;24820:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;24942:139;24979:2;25033:33;25056:1;25060:2;25064:1;25033:14;:33::i;:::-;25000:30;25021:8;25000:20;:30::i;:::-;:66;24942:18;:139::i;:::-;24908:17;:31;24926:12;24908:31;;;;;;;;;;;:173;;;;25098:16;25129:11;25158:8;25143:12;:23;25129:37;;25233:16;25229:2;25225:25;25213:37;;25453:12;25421:8;25396:1;25347:25;25322:1;25297;25270:215;25565:1;25551:12;25547:20;25505:279;25606:3;25597:7;25594:16;25505:279;;25757:7;25747:8;25744:1;25717:25;25714:1;25711;25706:59;25659:1;25650:7;25646:15;25635:26;;25505:279;;;25509:77;25829:1;25817:8;:13;25813:45;;25839:19;;;;;;;;;;;;;;25813:45;25891:3;25875:13;:19;;;;24793:1113;;25916:60;25945:1;25949:2;25953:12;25967:8;25916:20;:60::i;:::-;24604:1380;24542:1442;;:::o;18727:324::-;18797:14;19030:1;19020:8;19017:15;18991:24;18987:46;18977:56;;18727:324;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:474::-;8896:6;8904;8953:2;8941:9;8932:7;8928:23;8924:32;8921:119;;;8959:79;;:::i;:::-;8921:119;9079:1;9104:53;9149:7;9140:6;9129:9;9125:22;9104:53;:::i;:::-;9094:63;;9050:117;9206:2;9232:53;9277:7;9268:6;9257:9;9253:22;9232:53;:::i;:::-;9222:63;;9177:118;8828:474;;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:648::-;9644:6;9652;9701:2;9689:9;9680:7;9676:23;9672:32;9669:119;;;9707:79;;:::i;:::-;9669:119;9827:1;9852:50;9894:7;9885:6;9874:9;9870:22;9852:50;:::i;:::-;9842:60;;9798:114;9979:2;9968:9;9964:18;9951:32;10010:18;10002:6;9999:30;9996:117;;;10032:79;;:::i;:::-;9996:117;10137:63;10192:7;10183:6;10172:9;10168:22;10137:63;:::i;:::-;10127:73;;9922:288;9569:648;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:166::-;16755:18;16751:1;16743:6;16739:14;16732:42;16615:166;:::o;16787:366::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:419::-;17325:4;17363:2;17352:9;17348:18;17340:26;;17412:9;17406:4;17402:20;17398:1;17387:9;17383:17;17376:47;17440:131;17566:4;17440:131;:::i;:::-;17432:139;;17159:419;;;:::o;17584:141::-;17633:4;17656:3;17648:11;;17679:3;17676:1;17669:14;17713:4;17710:1;17700:18;17692:26;;17584:141;;;:::o;17731:93::-;17768:6;17815:2;17810;17803:5;17799:14;17795:23;17785:33;;17731:93;;;:::o;17830:107::-;17874:8;17924:5;17918:4;17914:16;17893:37;;17830:107;;;;:::o;17943:393::-;18012:6;18062:1;18050:10;18046:18;18085:97;18115:66;18104:9;18085:97;:::i;:::-;18203:39;18233:8;18222:9;18203:39;:::i;:::-;18191:51;;18275:4;18271:9;18264:5;18260:21;18251:30;;18324:4;18314:8;18310:19;18303:5;18300:30;18290:40;;18019:317;;17943:393;;;;;:::o;18342:60::-;18370:3;18391:5;18384:12;;18342:60;;;:::o;18408:142::-;18458:9;18491:53;18509:34;18518:24;18536:5;18518:24;:::i;:::-;18509:34;:::i;:::-;18491:53;:::i;:::-;18478:66;;18408:142;;;:::o;18556:75::-;18599:3;18620:5;18613:12;;18556:75;;;:::o;18637:269::-;18747:39;18778:7;18747:39;:::i;:::-;18808:91;18857:41;18881:16;18857:41;:::i;:::-;18849:6;18842:4;18836:11;18808:91;:::i;:::-;18802:4;18795:105;18713:193;18637:269;;;:::o;18912:73::-;18957:3;18912:73;:::o;18991:189::-;19068:32;;:::i;:::-;19109:65;19167:6;19159;19153:4;19109:65;:::i;:::-;19044:136;18991:189;;:::o;19186:186::-;19246:120;19263:3;19256:5;19253:14;19246:120;;;19317:39;19354:1;19347:5;19317:39;:::i;:::-;19290:1;19283:5;19279:13;19270:22;;19246:120;;;19186:186;;:::o;19378:543::-;19479:2;19474:3;19471:11;19468:446;;;19513:38;19545:5;19513:38;:::i;:::-;19597:29;19615:10;19597:29;:::i;:::-;19587:8;19583:44;19780:2;19768:10;19765:18;19762:49;;;19801:8;19786:23;;19762:49;19824:80;19880:22;19898:3;19880:22;:::i;:::-;19870:8;19866:37;19853:11;19824:80;:::i;:::-;19483:431;;19468:446;19378:543;;;:::o;19927:117::-;19981:8;20031:5;20025:4;20021:16;20000:37;;19927:117;;;;:::o;20050:169::-;20094:6;20127:51;20175:1;20171:6;20163:5;20160:1;20156:13;20127:51;:::i;:::-;20123:56;20208:4;20202;20198:15;20188:25;;20101:118;20050:169;;;;:::o;20224:295::-;20300:4;20446:29;20471:3;20465:4;20446:29;:::i;:::-;20438:37;;20508:3;20505:1;20501:11;20495:4;20492:21;20484:29;;20224:295;;;;:::o;20524:1395::-;20641:37;20674:3;20641:37;:::i;:::-;20743:18;20735:6;20732:30;20729:56;;;20765:18;;:::i;:::-;20729:56;20809:38;20841:4;20835:11;20809:38;:::i;:::-;20894:67;20954:6;20946;20940:4;20894:67;:::i;:::-;20988:1;21012:4;20999:17;;21044:2;21036:6;21033:14;21061:1;21056:618;;;;21718:1;21735:6;21732:77;;;21784:9;21779:3;21775:19;21769:26;21760:35;;21732:77;21835:67;21895:6;21888:5;21835:67;:::i;:::-;21829:4;21822:81;21691:222;21026:887;;21056:618;21108:4;21104:9;21096:6;21092:22;21142:37;21174:4;21142:37;:::i;:::-;21201:1;21215:208;21229:7;21226:1;21223:14;21215:208;;;21308:9;21303:3;21299:19;21293:26;21285:6;21278:42;21359:1;21351:6;21347:14;21337:24;;21406:2;21395:9;21391:18;21378:31;;21252:4;21249:1;21245:12;21240:17;;21215:208;;;21451:6;21442:7;21439:19;21436:179;;;21509:9;21504:3;21500:19;21494:26;21552:48;21594:4;21586:6;21582:17;21571:9;21552:48;:::i;:::-;21544:6;21537:64;21459:156;21436:179;21661:1;21657;21649:6;21645:14;21641:22;21635:4;21628:36;21063:611;;;21026:887;;20616:1303;;;20524:1395;;:::o;21925:180::-;21973:77;21970:1;21963:88;22070:4;22067:1;22060:15;22094:4;22091:1;22084:15;22111:191;22151:3;22170:20;22188:1;22170:20;:::i;:::-;22165:25;;22204:20;22222:1;22204:20;:::i;:::-;22199:25;;22247:1;22244;22240:9;22233:16;;22268:3;22265:1;22262:10;22259:36;;;22275:18;;:::i;:::-;22259:36;22111:191;;;;:::o;22308:176::-;22448:28;22444:1;22436:6;22432:14;22425:52;22308:176;:::o;22490:366::-;22632:3;22653:67;22717:2;22712:3;22653:67;:::i;:::-;22646:74;;22729:93;22818:3;22729:93;:::i;:::-;22847:2;22842:3;22838:12;22831:19;;22490:366;;;:::o;22862:419::-;23028:4;23066:2;23055:9;23051:18;23043:26;;23115:9;23109:4;23105:20;23101:1;23090:9;23086:17;23079:47;23143:131;23269:4;23143:131;:::i;:::-;23135:139;;22862:419;;;:::o;23287:180::-;23427:32;23423:1;23415:6;23411:14;23404:56;23287:180;:::o;23473:366::-;23615:3;23636:67;23700:2;23695:3;23636:67;:::i;:::-;23629:74;;23712:93;23801:3;23712:93;:::i;:::-;23830:2;23825:3;23821:12;23814:19;;23473:366;;;:::o;23845:419::-;24011:4;24049:2;24038:9;24034:18;24026:26;;24098:9;24092:4;24088:20;24084:1;24073:9;24069:17;24062:47;24126:131;24252:4;24126:131;:::i;:::-;24118:139;;23845:419;;;:::o;24270:194::-;24310:4;24330:20;24348:1;24330:20;:::i;:::-;24325:25;;24364:20;24382:1;24364:20;:::i;:::-;24359:25;;24408:1;24405;24401:9;24393:17;;24432:1;24426:4;24423:11;24420:37;;;24437:18;;:::i;:::-;24420:37;24270:194;;;;:::o;24470:410::-;24510:7;24533:20;24551:1;24533:20;:::i;:::-;24528:25;;24567:20;24585:1;24567:20;:::i;:::-;24562:25;;24622:1;24619;24615:9;24644:30;24662:11;24644:30;:::i;:::-;24633:41;;24823:1;24814:7;24810:15;24807:1;24804:22;24784:1;24777:9;24757:83;24734:139;;24853:18;;:::i;:::-;24734:139;24518:362;24470:410;;;;:::o;24886:173::-;25026:25;25022:1;25014:6;25010:14;25003:49;24886:173;:::o;25065:366::-;25207:3;25228:67;25292:2;25287:3;25228:67;:::i;:::-;25221:74;;25304:93;25393:3;25304:93;:::i;:::-;25422:2;25417:3;25413:12;25406:19;;25065:366;;;:::o;25437:419::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25690:9;25684:4;25680:20;25676:1;25665:9;25661:17;25654:47;25718:131;25844:4;25718:131;:::i;:::-;25710:139;;25437:419;;;:::o;25862:172::-;26002:24;25998:1;25990:6;25986:14;25979:48;25862:172;:::o;26040:366::-;26182:3;26203:67;26267:2;26262:3;26203:67;:::i;:::-;26196:74;;26279:93;26368:3;26279:93;:::i;:::-;26397:2;26392:3;26388:12;26381:19;;26040:366;;;:::o;26412:419::-;26578:4;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26412:419;;;:::o;26837:225::-;26977:34;26973:1;26965:6;26961:14;26954:58;27046:8;27041:2;27033:6;27029:15;27022:33;26837:225;:::o;27068:366::-;27210:3;27231:67;27295:2;27290:3;27231:67;:::i;:::-;27224:74;;27307:93;27396:3;27307:93;:::i;:::-;27425:2;27420:3;27416:12;27409:19;;27068:366;;;:::o;27440:419::-;27606:4;27644:2;27633:9;27629:18;27621:26;;27693:9;27687:4;27683:20;27679:1;27668:9;27664:17;27657:47;27721:131;27847:4;27721:131;:::i;:::-;27713:139;;27440:419;;;:::o;27865:249::-;28005:34;28001:1;27993:6;27989:14;27982:58;28074:32;28069:2;28061:6;28057:15;28050:57;27865:249;:::o;28120:366::-;28262:3;28283:67;28347:2;28342:3;28283:67;:::i;:::-;28276:74;;28359:93;28448:3;28359:93;:::i;:::-;28477:2;28472:3;28468:12;28461:19;;28120:366;;;:::o;28492:419::-;28658:4;28696:2;28685:9;28681:18;28673:26;;28745:9;28739:4;28735:20;28731:1;28720:9;28716:17;28709:47;28773:131;28899:4;28773:131;:::i;:::-;28765:139;;28492:419;;;:::o;28917:171::-;29057:23;29053:1;29045:6;29041:14;29034:47;28917:171;:::o;29094:366::-;29236:3;29257:67;29321:2;29316:3;29257:67;:::i;:::-;29250:74;;29333:93;29422:3;29333:93;:::i;:::-;29451:2;29446:3;29442:12;29435:19;;29094:366;;;:::o;29466:419::-;29632:4;29670:2;29659:9;29655:18;29647:26;;29719:9;29713:4;29709:20;29705:1;29694:9;29690:17;29683:47;29747:131;29873:4;29747:131;:::i;:::-;29739:139;;29466:419;;;:::o;29891:148::-;29993:11;30030:3;30015:18;;29891:148;;;;:::o;30069:874::-;30172:3;30209:5;30203:12;30238:36;30264:9;30238:36;:::i;:::-;30290:89;30372:6;30367:3;30290:89;:::i;:::-;30283:96;;30410:1;30399:9;30395:17;30426:1;30421:166;;;;30601:1;30596:341;;;;30388:549;;30421:166;30505:4;30501:9;30490;30486:25;30481:3;30474:38;30567:6;30560:14;30553:22;30545:6;30541:35;30536:3;30532:45;30525:52;;30421:166;;30596:341;30663:38;30695:5;30663:38;:::i;:::-;30723:1;30737:154;30751:6;30748:1;30745:13;30737:154;;;30825:7;30819:14;30815:1;30810:3;30806:11;30799:35;30875:1;30866:7;30862:15;30851:26;;30773:4;30770:1;30766:12;30761:17;;30737:154;;;30920:6;30915:3;30911:16;30904:23;;30603:334;;30388:549;;30176:767;;30069:874;;;;:::o;30949:390::-;31055:3;31083:39;31116:5;31083:39;:::i;:::-;31138:89;31220:6;31215:3;31138:89;:::i;:::-;31131:96;;31236:65;31294:6;31289:3;31282:4;31275:5;31271:16;31236:65;:::i;:::-;31326:6;31321:3;31317:16;31310:23;;31059:280;30949:390;;;;:::o;31345:429::-;31522:3;31544:92;31632:3;31623:6;31544:92;:::i;:::-;31537:99;;31653:95;31744:3;31735:6;31653:95;:::i;:::-;31646:102;;31765:3;31758:10;;31345:429;;;;;:::o;31780:225::-;31920:34;31916:1;31908:6;31904:14;31897:58;31989:8;31984:2;31976:6;31972:15;31965:33;31780:225;:::o;32011:366::-;32153:3;32174:67;32238:2;32233:3;32174:67;:::i;:::-;32167:74;;32250:93;32339:3;32250:93;:::i;:::-;32368:2;32363:3;32359:12;32352:19;;32011:366;;;:::o;32383:419::-;32549:4;32587:2;32576:9;32572:18;32564:26;;32636:9;32630:4;32626:20;32622:1;32611:9;32607:17;32600:47;32664:131;32790:4;32664:131;:::i;:::-;32656:139;;32383:419;;;:::o;32808:182::-;32948:34;32944:1;32936:6;32932:14;32925:58;32808:182;:::o;32996:366::-;33138:3;33159:67;33223:2;33218:3;33159:67;:::i;:::-;33152:74;;33235:93;33324:3;33235:93;:::i;:::-;33353:2;33348:3;33344:12;33337:19;;32996:366;;;:::o;33368:419::-;33534:4;33572:2;33561:9;33557:18;33549:26;;33621:9;33615:4;33611:20;33607:1;33596:9;33592:17;33585:47;33649:131;33775:4;33649:131;:::i;:::-;33641:139;;33368:419;;;:::o;33793:233::-;33832:3;33855:24;33873:5;33855:24;:::i;:::-;33846:33;;33901:66;33894:5;33891:77;33888:103;;33971:18;;:::i;:::-;33888:103;34018:1;34011:5;34007:13;34000:20;;33793:233;;;:::o;34032:180::-;34080:77;34077:1;34070:88;34177:4;34174:1;34167:15;34201:4;34198:1;34191:15;34218:185;34258:1;34275:20;34293:1;34275:20;:::i;:::-;34270:25;;34309:20;34327:1;34309:20;:::i;:::-;34304:25;;34348:1;34338:35;;34353:18;;:::i;:::-;34338:35;34395:1;34392;34388:9;34383:14;;34218:185;;;;:::o;34409:176::-;34441:1;34458:20;34476:1;34458:20;:::i;:::-;34453:25;;34492:20;34510:1;34492:20;:::i;:::-;34487:25;;34531:1;34521:35;;34536:18;;:::i;:::-;34521:35;34577:1;34574;34570:9;34565:14;;34409:176;;;;:::o;34591:180::-;34639:77;34636:1;34629:88;34736:4;34733:1;34726:15;34760:4;34757:1;34750:15;34777:98;34828:6;34862:5;34856:12;34846:22;;34777:98;;;:::o;34881:168::-;34964:11;34998:6;34993:3;34986:19;35038:4;35033:3;35029:14;35014:29;;34881:168;;;;:::o;35055:373::-;35141:3;35169:38;35201:5;35169:38;:::i;:::-;35223:70;35286:6;35281:3;35223:70;:::i;:::-;35216:77;;35302:65;35360:6;35355:3;35348:4;35341:5;35337:16;35302:65;:::i;:::-;35392:29;35414:6;35392:29;:::i;:::-;35387:3;35383:39;35376:46;;35145:283;35055:373;;;;:::o;35434:640::-;35629:4;35667:3;35656:9;35652:19;35644:27;;35681:71;35749:1;35738:9;35734:17;35725:6;35681:71;:::i;:::-;35762:72;35830:2;35819:9;35815:18;35806:6;35762:72;:::i;:::-;35844;35912:2;35901:9;35897:18;35888:6;35844:72;:::i;:::-;35963:9;35957:4;35953:20;35948:2;35937:9;35933:18;35926:48;35991:76;36062:4;36053:6;35991:76;:::i;:::-;35983:84;;35434:640;;;;;;;:::o;36080:141::-;36136:5;36167:6;36161:13;36152:22;;36183:32;36209:5;36183:32;:::i;:::-;36080:141;;;;:::o;36227:349::-;36296:6;36345:2;36333:9;36324:7;36320:23;36316:32;36313:119;;;36351:79;;:::i;:::-;36313:119;36471:1;36496:63;36551:7;36542:6;36531:9;36527:22;36496:63;:::i;:::-;36486:73;;36442:127;36227:349;;;;:::o

Swarm Source

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