ETH Price: $3,038.95 (+3.01%)

Token

Alien Cloaks (ALC)
 

Overview

Max Total Supply

1,568 ALC

Holders

278

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sirioncrypto.eth
Balance
3 ALC
0x997AA3a651b90878EcCEFcb6f4d85af0237428dA
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:
AlienCloaks

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-23
*/

// SPDX-License-Identifier: MIT     

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 public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

     modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view 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);
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

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 AlienCloaks 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 = "https://nftstorage.link/ipfs/bafybeifpiywhgfb3mjdxefauvcpkz4cf4i2o25htqzn4wh3akvlgfigzb4/";
bool public isPublicMintEnabled = false;
uint public COLLECTION_SIZE = 1700; 
uint public MINT_PRICE = 0.002 ether; 
uint public MAX_BATCH_SIZE = 25;
uint public SUPPLY_PER_WALLET = 57;
uint public FREE_SUPPLY_PER_WALLET = 1;
constructor() ERC721A("Alien Cloaks", "ALC") {}


    function TeamMint(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Alien 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, "Mint not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more left!");

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

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint 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 override(ERC721A, IERC721A) payable onlyAllowedOperator(from) {
    super.transferFrom(from, to, tokenId);
    }

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public
    override(ERC721A, IERC721A)
    payable
    onlyAllowedOperator(from)
    {
    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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"TeamMint","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"}]

608060405260405180602001604052806000815250600a9081620000249190620006e9565b5060405180602001604052806000815250600d9081620000459190620006e9565b506040518060800160405280605981526020016200480460599139600e9081620000709190620006e9565b506000600f60006101000a81548160ff0219169083151502179055506106a460105566071afd498d0000601155601960125560396013556001601455348015620000b957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f416c69656e20436c6f616b7300000000000000000000000000000000000000008152506040518060400160405280600381526020017f414c4300000000000000000000000000000000000000000000000000000000008152506200015d620001516200039e60201b60201c565b620003a660201b60201c565b81600390816200016e9190620006e9565b508060049081620001809190620006e9565b50620001916200046a60201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003965780156200025c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022292919062000815565b600060405180830381600087803b1580156200023d57600080fd5b505af115801562000252573d6000803e3d6000fd5b5050505062000395565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000316576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002dc92919062000815565b600060405180830381600087803b158015620002f757600080fd5b505af11580156200030c573d6000803e3d6000fd5b5050505062000394565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200035f919062000842565b600060405180830381600087803b1580156200037a57600080fd5b505af11580156200038f573d6000803e3d6000fd5b505050505b5b5b50506200085f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f157607f821691505b602082108103620005075762000506620004a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000532565b6200057d868362000532565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ca620005c4620005be8462000595565b6200059f565b62000595565b9050919050565b6000819050919050565b620005e683620005a9565b620005fe620005f582620005d1565b8484546200053f565b825550505050565b600090565b6200061562000606565b62000622818484620005db565b505050565b5b818110156200064a576200063e6000826200060b565b60018101905062000628565b5050565b601f821115620006995762000663816200050d565b6200066e8462000522565b810160208510156200067e578190505b620006966200068d8562000522565b83018262000627565b50505b505050565b600082821c905092915050565b6000620006be600019846008026200069e565b1980831691505092915050565b6000620006d98383620006ab565b9150826002028217905092915050565b620006f4826200046f565b67ffffffffffffffff81111562000710576200070f6200047a565b5b6200071c8254620004d8565b620007298282856200064e565b600060209050601f8311600181146200076157600084156200074c578287015190505b620007588582620006cb565b865550620007c8565b601f19841662000771866200050d565b60005b828110156200079b5784890151825560018201915060208501945060208101905062000774565b86831015620007bb5784890151620007b7601f891682620006ab565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007fd82620007d0565b9050919050565b6200080f81620007f0565b82525050565b60006040820190506200082c600083018562000804565b6200083b602083018462000804565b9392505050565b600060208201905062000859600083018462000804565b92915050565b613f95806200086f6000396000f3fe60806040526004361061025c5760003560e01c806375b6447111610144578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d48514610881578063e985e9c5146108ac578063f2fde38b146108e9578063f777774714610912578063f814943d1461093b578063fb92488b146109645761025c565b8063c87b56dd14610786578063cfdbf254146107c3578063d8258d95146107ee578063dbddb26a14610819578063e7572230146108445761025c565b8063a22cb46511610108578063a22cb465146106ab578063a4cdd719146106d4578063a76a9587146106eb578063b88d4fde14610716578063c002d23d14610732578063c144a4ba1461075d5761025c565b806375b64471146105e75780638da5cb5b1461061057806395d89b411461063b578063a0712d6814610666578063a1db246e146106825761025c565b806341f43434116101dd57806356b4f673116101a157806356b4f673146104d75780635fe75587146105025780636352211e1461052d57806370a082311461056a578063715018a6146105a75780637304ff6c146105be5761025c565b806341f434341461041357806342842e0e1461043e57806342966c681461045a578063507862d11461048357806356b48d63146104ae5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661098d565b6040516102839190612ba4565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612c2b565b6109a0565b6040516102c09190612ba4565b60405180910390f35b3480156102d557600080fd5b506102de610a32565b6040516102eb9190612ce8565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612d40565b610ac4565b6040516103289190612dae565b60405180910390f35b61034b60048036038101906103469190612df5565b610b43565b005b34801561035957600080fd5b50610362610c87565b60405161036f9190612e44565b60405180910390f35b34801561038457600080fd5b5061038d610c8d565b60405161039a9190612e44565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612e5f565b610ca4565b6040516103d79190612e44565b60405180910390f35b6103fa60048036038101906103f59190612e8c565b610cbc565b005b34801561040857600080fd5b50610411610d0b565b005b34801561041f57600080fd5b50610428610e17565b6040516104359190612f3e565b60405180910390f35b61045860048036038101906104539190612e8c565b610e29565b005b34801561046657600080fd5b50610481600480360381019061047c9190612d40565b610e78565b005b34801561048f57600080fd5b50610498610e86565b6040516104a59190612ce8565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061308e565b610f14565b005b3480156104e357600080fd5b506104ec610f2f565b6040516104f99190612ce8565b60405180910390f35b34801561050e57600080fd5b50610517610fbd565b6040516105249190612e44565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612d40565b610fc3565b6040516105619190612dae565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612e5f565b610fd5565b60405161059e9190612e44565b60405180910390f35b3480156105b357600080fd5b506105bc61108d565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613103565b6110a1565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612d40565b6110d7565b005b34801561061c57600080fd5b506106256110e9565b6040516106329190612dae565b60405180910390f35b34801561064757600080fd5b50610650611112565b60405161065d9190612ce8565b60405180910390f35b610680600480360381019061067b9190612d40565b6111a4565b005b34801561068e57600080fd5b506106a960048036038101906106a49190612d40565b6115f1565b005b3480156106b757600080fd5b506106d260048036038101906106cd919061315f565b611603565b005b3480156106e057600080fd5b506106e961170e565b005b3480156106f757600080fd5b50610700611742565b60405161070d9190612ba4565b60405180910390f35b610730600480360381019061072b9190613240565b611755565b005b34801561073e57600080fd5b506107476117a6565b6040516107549190612e44565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190612d40565b6117ac565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612d40565b6117be565b6040516107ba9190612ce8565b60405180910390f35b3480156107cf57600080fd5b506107d861189a565b6040516107e59190612e44565b60405180910390f35b3480156107fa57600080fd5b506108036118a0565b6040516108109190612e44565b60405180910390f35b34801561082557600080fd5b5061082e6118a6565b60405161083b9190612ce8565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612d40565b611934565b6040516108789190612e44565b60405180910390f35b34801561088d57600080fd5b506108966119be565b6040516108a39190612ce8565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce91906132c3565b611a50565b6040516108e09190612ba4565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190612e5f565b611ae4565b005b34801561091e57600080fd5b5061093960048036038101906109349190613303565b611b67565b005b34801561094757600080fd5b50610962600480360381019061095d9190612d40565b611bd4565b005b34801561097057600080fd5b5061098b60048036038101906109869190612d40565b611be6565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a4190613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6d90613372565b8015610aba5780601f10610a8f57610100808354040283529160200191610aba565b820191906000526020600020905b815481529060010190602001808311610a9d57829003601f168201915b5050505050905090565b6000610acf82611bf8565b610b05576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4e82610fc3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6f611c57565b73ffffffffffffffffffffffffffffffffffffffff1614610bd257610b9b81610b96611c57565b611a50565b610bd1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c97611c5f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfa57610cf933611c64565b5b610d05848484611d61565b50505050565b610d13612083565b600260095403610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906133ef565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d8690613440565b60006040518083038185875af1925050503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b5050905080610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906134a1565b60405180910390fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6757610e6633611c64565b5b610e72848484612101565b50505050565b610e83816001612121565b50565b600d8054610e9390613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90613372565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b610f1c612083565b80600a9081610f2b9190613663565b5050565b600a8054610f3c90613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613372565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b505050505081565b60135481565b6000610fce82612373565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361103c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611095612083565b61109f600061243f565b565b6110a9612083565b80600e90816110b89190613663565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110df612083565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112190613372565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613372565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613781565b60405180910390fd5b600260095403611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e906133ef565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546112af91906137d0565b90508083106113665780836112c491906137d0565b6011546112d19190613804565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f9565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113b59190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906138c6565b60405180910390fd5b60105483611454610c8d565b61145e9190613846565b111561149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613932565b60405180910390fd5b601354836114ac33610fd5565b6114b69190613846565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061399e565b60405180910390fd5b60125483111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613a30565b60405180910390fd5b8134101561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613a9c565b60405180910390fd5b6115893384612503565b813411156115e4573373ffffffffffffffffffffffffffffffffffffffff166108fc83346115b791906137d0565b9081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b505b5050600160098190555050565b6115f9612083565b8060148190555050565b8060086000611610611c57565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bd611c57565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117029190612ba4565b60405180910390a35050565b611716612083565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117935761179233611c64565b5b61179f85858585612521565b5050505050565b60115481565b6117b4612083565b8060128190555050565b6060600c60009054906101000a900460ff161561180757600e6117e083612594565b6040516020016117f1929190613b7b565b6040516020818303038152906040529050611895565b600d805461181490613372565b80601f016020809104026020016040519081016040528092919081815260200182805461184090613372565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546118b390613372565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90613372565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461198691906137d0565b90508084106119af57808461199b91906137d0565b6011546119a89190613804565b91506119b4565b600091505b8192505050919050565b6060600a80546119cd90613372565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613372565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aec612083565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613c11565b60405180910390fd5b611b648161243f565b50565b611b6f612083565b60105482611b7b610c8d565b611b859190613846565b1115611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd90613c7d565b60405180910390fd5b611bd08183612503565b5050565b611bdc612083565b8060138190555050565b611bee612083565b8060118190555050565b600081611c03611c5f565b11158015611c12575060015482105b8015611c50575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cdb929190613c9d565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613cdb565b611d5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d549190612dae565b60405180910390fd5b5b50565b6000611d6c82612373565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ddf846126f4565b91509150611df58187611df0611c57565b61271b565b611e4157611e0a86611e05611c57565b611a50565b611e40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ea7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb4868686600161275f565b8015611ebf57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f8d85611f69888887612765565b7c02000000000000000000000000000000000000000000000000000000001761278d565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120135760006001850190506000600560008381526020019081526020016000205403612011576001548114612010578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461207b86868660016127b8565b505050505050565b61208b6127be565b73ffffffffffffffffffffffffffffffffffffffff166120a96110e9565b73ffffffffffffffffffffffffffffffffffffffff16146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613d54565b60405180910390fd5b565b61211c83838360405180602001604052806000815250611755565b505050565b600061212c83612373565b9050600081905060008061213f866126f4565b9150915084156121a85761215b8184612156611c57565b61271b565b6121a7576121708361216b611c57565b611a50565b6121a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6121b683600088600161275f565b80156121c157600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122698361222685600088612765565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761278d565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122ef57600060018701905060006005600083815260200190815260200160002054036122ed5760015481146122ec578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123598360008860016127b8565b600260008154809291906001019190505550505050505050565b60008082905080612382611c5f565b11612408576001548110156124075760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612405575b600081036123fb5760056000836001900393508381526020019081526020016000205490506123d1565b809250505061243a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251d8282604051806020016040528060008152506127c6565b5050565b61252c848484610cbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258e5761255784848484612864565b61258d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036125db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ef565b600082905060005b6000821461260d5780806125f690613d74565b915050600a826126069190613deb565b91506125e3565b60008167ffffffffffffffff81111561262957612628612f63565b5b6040519080825280601f01601f19166020018201604052801561265b5781602001600182028036833780820191505090505b5090505b600085146126e85760018261267491906137d0565b9150600a856126839190613e1c565b603061268f9190613846565b60f81b8183815181106126a5576126a4613e4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e19190613deb565b945061265f565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861277c8686846129b4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6127d083836129bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461285f5760006001549050600083820390505b6128116000868380600101945086612864565b612847576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127fe57816001541461285c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288a611c57565b8786866040518563ffffffff1660e01b81526004016128ac9493929190613ed1565b6020604051808303816000875af19250505080156128e857506040513d601f19601f820116820180604052508101906128e59190613f32565b60015b612961573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b506000815103612959576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036129fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0b600084838561275f565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a8283612a736000866000612765565b612a7c85612b79565b1761278d565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b2357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612ae8565b5060008203612b5e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7460008483856127b8565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612b9e81612b89565b82525050565b6000602082019050612bb96000830184612b95565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0881612bd3565b8114612c1357600080fd5b50565b600081359050612c2581612bff565b92915050565b600060208284031215612c4157612c40612bc9565b5b6000612c4f84828501612c16565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cba82612c58565b612cc48185612c63565b9350612cd4818560208601612c74565b612cdd81612c9e565b840191505092915050565b60006020820190508181036000830152612d028184612caf565b905092915050565b6000819050919050565b612d1d81612d0a565b8114612d2857600080fd5b50565b600081359050612d3a81612d14565b92915050565b600060208284031215612d5657612d55612bc9565b5b6000612d6484828501612d2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9882612d6d565b9050919050565b612da881612d8d565b82525050565b6000602082019050612dc36000830184612d9f565b92915050565b612dd281612d8d565b8114612ddd57600080fd5b50565b600081359050612def81612dc9565b92915050565b60008060408385031215612e0c57612e0b612bc9565b5b6000612e1a85828601612de0565b9250506020612e2b85828601612d2b565b9150509250929050565b612e3e81612d0a565b82525050565b6000602082019050612e596000830184612e35565b92915050565b600060208284031215612e7557612e74612bc9565b5b6000612e8384828501612de0565b91505092915050565b600080600060608486031215612ea557612ea4612bc9565b5b6000612eb386828701612de0565b9350506020612ec486828701612de0565b9250506040612ed586828701612d2b565b9150509250925092565b6000819050919050565b6000612f04612eff612efa84612d6d565b612edf565b612d6d565b9050919050565b6000612f1682612ee9565b9050919050565b6000612f2882612f0b565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9b82612c9e565b810181811067ffffffffffffffff82111715612fba57612fb9612f63565b5b80604052505050565b6000612fcd612bbf565b9050612fd98282612f92565b919050565b600067ffffffffffffffff821115612ff957612ff8612f63565b5b61300282612c9e565b9050602081019050919050565b82818337600083830152505050565b600061303161302c84612fde565b612fc3565b90508281526020810184848401111561304d5761304c612f5e565b5b61305884828561300f565b509392505050565b600082601f83011261307557613074612f59565b5b813561308584826020860161301e565b91505092915050565b6000602082840312156130a4576130a3612bc9565b5b600082013567ffffffffffffffff8111156130c2576130c1612bce565b5b6130ce84828501613060565b91505092915050565b6130e081612b89565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612bc9565b5b6000613128858286016130ee565b925050602083013567ffffffffffffffff81111561314957613148612bce565b5b61315585828601613060565b9150509250929050565b6000806040838503121561317657613175612bc9565b5b600061318485828601612de0565b9250506020613195858286016130ee565b9150509250929050565b600067ffffffffffffffff8211156131ba576131b9612f63565b5b6131c382612c9e565b9050602081019050919050565b60006131e36131de8461319f565b612fc3565b9050828152602081018484840111156131ff576131fe612f5e565b5b61320a84828561300f565b509392505050565b600082601f83011261322757613226612f59565b5b81356132378482602086016131d0565b91505092915050565b6000806000806080858703121561325a57613259612bc9565b5b600061326887828801612de0565b945050602061327987828801612de0565b935050604061328a87828801612d2b565b925050606085013567ffffffffffffffff8111156132ab576132aa612bce565b5b6132b787828801613212565b91505092959194509250565b600080604083850312156132da576132d9612bc9565b5b60006132e885828601612de0565b92505060206132f985828601612de0565b9150509250929050565b6000806040838503121561331a57613319612bc9565b5b600061332885828601612d2b565b925050602061333985828601612de0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338a57607f821691505b60208210810361339d5761339c613343565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133d9601f83612c63565b91506133e4826133a3565b602082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b600081905092915050565b50565b600061342a60008361340f565b91506134358261341a565b600082019050919050565b600061344b8261341d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061348b601083612c63565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134e6565b61352d86836134e6565b95508019841693508086168417925050509392505050565b600061356061355b61355684612d0a565b612edf565b612d0a565b9050919050565b6000819050919050565b61357a83613545565b61358e61358682613567565b8484546134f3565b825550505050565b600090565b6135a3613596565b6135ae818484613571565b505050565b5b818110156135d2576135c760008261359b565b6001810190506135b4565b5050565b601f821115613617576135e8816134c1565b6135f1846134d6565b81016020851015613600578190505b61361461360c856134d6565b8301826135b3565b50505b505050565b600082821c905092915050565b600061363a6000198460080261361c565b1980831691505092915050565b60006136538383613629565b9150826002028217905092915050565b61366c82612c58565b67ffffffffffffffff81111561368557613684612f63565b5b61368f8254613372565b61369a8282856135d6565b600060209050601f8311600181146136cd57600084156136bb578287015190505b6136c58582613647565b86555061372d565b601f1984166136db866134c1565b60005b82811015613703578489015182556001820191506020850194506020810190506136de565b86831015613720578489015161371c601f891682613629565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061376b601e83612c63565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137db82612d0a565b91506137e683612d0a565b92508282039050818111156137fe576137fd6137a1565b5b92915050565b600061380f82612d0a565b915061381a83612d0a565b925082820261382881612d0a565b9150828204841483151761383f5761383e6137a1565b5b5092915050565b600061385182612d0a565b915061385c83612d0a565b9250828201905080821115613874576138736137a1565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006138b0601383612c63565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4e6f206d6f7265206c6566742100000000000000000000000000000000000000600082015250565b600061391c600d83612c63565b9150613927826138e6565b602082019050919050565b6000602082019050818103600083015261394b8161390f565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613988601d83612c63565b915061399382613952565b602082019050919050565b600060208201905081810360008301526139b78161397b565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b6000613a1a603583612c63565b9150613a25826139be565b604082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613a86601583612c63565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b9050919050565b600081905092915050565b60008154613ad481613372565b613ade8186613abc565b94506001821660008114613af95760018114613b0e57613b41565b60ff1983168652811515820286019350613b41565b613b17856134c1565b60005b83811015613b3957815481890152600182019150602081019050613b1a565b838801955050505b50505092915050565b6000613b5582612c58565b613b5f8185613abc565b9350613b6f818560208601612c74565b80840191505092915050565b6000613b878285613ac7565b9150613b938284613b4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfb602683612c63565b9150613c0682613b9f565b604082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b7f4e6f206d6f726520416c69656e20696e2073746f636b21000000000000000000600082015250565b6000613c67601783612c63565b9150613c7282613c31565b602082019050919050565b60006020820190508181036000830152613c9681613c5a565b9050919050565b6000604082019050613cb26000830185612d9f565b613cbf6020830184612d9f565b9392505050565b600081519050613cd5816130d7565b92915050565b600060208284031215613cf157613cf0612bc9565b5b6000613cff84828501613cc6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3e602083612c63565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b6000613d7f82612d0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613db157613db06137a1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613df682612d0a565b9150613e0183612d0a565b925082613e1157613e10613dbc565b5b828204905092915050565b6000613e2782612d0a565b9150613e3283612d0a565b925082613e4257613e41613dbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613ea382613e7c565b613ead8185613e87565b9350613ebd818560208601612c74565b613ec681612c9e565b840191505092915050565b6000608082019050613ee66000830187612d9f565b613ef36020830186612d9f565b613f006040830185612e35565b8181036060830152613f128184613e98565b905095945050505050565b600081519050613f2c81612bff565b92915050565b600060208284031215613f4857613f47612bc9565b5b6000613f5684828501613f1d565b9150509291505056fea26469706673582212205640f06ccd3e22c940e1ef9c33e148086e815faff89942bbd0d642f63f4eb4b564736f6c6343000812003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569667069797768676662336d6a6478656661757663706b7a3463663469326f32356874717a6e34776833616b766c676669677a62342f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806375b6447111610144578063c87b56dd116100b6578063e8a3d4851161007a578063e8a3d48514610881578063e985e9c5146108ac578063f2fde38b146108e9578063f777774714610912578063f814943d1461093b578063fb92488b146109645761025c565b8063c87b56dd14610786578063cfdbf254146107c3578063d8258d95146107ee578063dbddb26a14610819578063e7572230146108445761025c565b8063a22cb46511610108578063a22cb465146106ab578063a4cdd719146106d4578063a76a9587146106eb578063b88d4fde14610716578063c002d23d14610732578063c144a4ba1461075d5761025c565b806375b64471146105e75780638da5cb5b1461061057806395d89b411461063b578063a0712d6814610666578063a1db246e146106825761025c565b806341f43434116101dd57806356b4f673116101a157806356b4f673146104d75780635fe75587146105025780636352211e1461052d57806370a082311461056a578063715018a6146105a75780637304ff6c146105be5761025c565b806341f434341461041357806342842e0e1461043e57806342966c681461045a578063507862d11461048357806356b48d63146104ae5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661098d565b6040516102839190612ba4565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612c2b565b6109a0565b6040516102c09190612ba4565b60405180910390f35b3480156102d557600080fd5b506102de610a32565b6040516102eb9190612ce8565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612d40565b610ac4565b6040516103289190612dae565b60405180910390f35b61034b60048036038101906103469190612df5565b610b43565b005b34801561035957600080fd5b50610362610c87565b60405161036f9190612e44565b60405180910390f35b34801561038457600080fd5b5061038d610c8d565b60405161039a9190612e44565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612e5f565b610ca4565b6040516103d79190612e44565b60405180910390f35b6103fa60048036038101906103f59190612e8c565b610cbc565b005b34801561040857600080fd5b50610411610d0b565b005b34801561041f57600080fd5b50610428610e17565b6040516104359190612f3e565b60405180910390f35b61045860048036038101906104539190612e8c565b610e29565b005b34801561046657600080fd5b50610481600480360381019061047c9190612d40565b610e78565b005b34801561048f57600080fd5b50610498610e86565b6040516104a59190612ce8565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d0919061308e565b610f14565b005b3480156104e357600080fd5b506104ec610f2f565b6040516104f99190612ce8565b60405180910390f35b34801561050e57600080fd5b50610517610fbd565b6040516105249190612e44565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612d40565b610fc3565b6040516105619190612dae565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612e5f565b610fd5565b60405161059e9190612e44565b60405180910390f35b3480156105b357600080fd5b506105bc61108d565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613103565b6110a1565b005b3480156105f357600080fd5b5061060e60048036038101906106099190612d40565b6110d7565b005b34801561061c57600080fd5b506106256110e9565b6040516106329190612dae565b60405180910390f35b34801561064757600080fd5b50610650611112565b60405161065d9190612ce8565b60405180910390f35b610680600480360381019061067b9190612d40565b6111a4565b005b34801561068e57600080fd5b506106a960048036038101906106a49190612d40565b6115f1565b005b3480156106b757600080fd5b506106d260048036038101906106cd919061315f565b611603565b005b3480156106e057600080fd5b506106e961170e565b005b3480156106f757600080fd5b50610700611742565b60405161070d9190612ba4565b60405180910390f35b610730600480360381019061072b9190613240565b611755565b005b34801561073e57600080fd5b506107476117a6565b6040516107549190612e44565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190612d40565b6117ac565b005b34801561079257600080fd5b506107ad60048036038101906107a89190612d40565b6117be565b6040516107ba9190612ce8565b60405180910390f35b3480156107cf57600080fd5b506107d861189a565b6040516107e59190612e44565b60405180910390f35b3480156107fa57600080fd5b506108036118a0565b6040516108109190612e44565b60405180910390f35b34801561082557600080fd5b5061082e6118a6565b60405161083b9190612ce8565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612d40565b611934565b6040516108789190612e44565b60405180910390f35b34801561088d57600080fd5b506108966119be565b6040516108a39190612ce8565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce91906132c3565b611a50565b6040516108e09190612ba4565b60405180910390f35b3480156108f557600080fd5b50610910600480360381019061090b9190612e5f565b611ae4565b005b34801561091e57600080fd5b5061093960048036038101906109349190613303565b611b67565b005b34801561094757600080fd5b50610962600480360381019061095d9190612d40565b611bd4565b005b34801561097057600080fd5b5061098b60048036038101906109869190612d40565b611be6565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a4190613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6d90613372565b8015610aba5780601f10610a8f57610100808354040283529160200191610aba565b820191906000526020600020905b815481529060010190602001808311610a9d57829003601f168201915b5050505050905090565b6000610acf82611bf8565b610b05576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4e82610fc3565b90508073ffffffffffffffffffffffffffffffffffffffff16610b6f611c57565b73ffffffffffffffffffffffffffffffffffffffff1614610bd257610b9b81610b96611c57565b611a50565b610bd1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c97611c5f565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfa57610cf933611c64565b5b610d05848484611d61565b50505050565b610d13612083565b600260095403610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906133ef565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d8690613440565b60006040518083038185875af1925050503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b5050905080610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906134a1565b60405180910390fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e6757610e6633611c64565b5b610e72848484612101565b50505050565b610e83816001612121565b50565b600d8054610e9390613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90613372565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b610f1c612083565b80600a9081610f2b9190613663565b5050565b600a8054610f3c90613372565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613372565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b505050505081565b60135481565b6000610fce82612373565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361103c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611095612083565b61109f600061243f565b565b6110a9612083565b80600e90816110b89190613663565b5081600c60006101000a81548160ff0219169083151502179055505050565b6110df612083565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112190613372565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613372565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613781565b60405180910390fd5b600260095403611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e906133ef565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546112af91906137d0565b90508083106113665780836112c491906137d0565b6011546112d19190613804565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f9565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113b59190613846565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906138c6565b60405180910390fd5b60105483611454610c8d565b61145e9190613846565b111561149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613932565b60405180910390fd5b601354836114ac33610fd5565b6114b69190613846565b11156114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee9061399e565b60405180910390fd5b60125483111561153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613a30565b60405180910390fd5b8134101561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613a9c565b60405180910390fd5b6115893384612503565b813411156115e4573373ffffffffffffffffffffffffffffffffffffffff166108fc83346115b791906137d0565b9081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b505b5050600160098190555050565b6115f9612083565b8060148190555050565b8060086000611610611c57565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bd611c57565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117029190612ba4565b60405180910390a35050565b611716612083565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117935761179233611c64565b5b61179f85858585612521565b5050505050565b60115481565b6117b4612083565b8060128190555050565b6060600c60009054906101000a900460ff161561180757600e6117e083612594565b6040516020016117f1929190613b7b565b6040516020818303038152906040529050611895565b600d805461181490613372565b80601f016020809104026020016040519081016040528092919081815260200182805461184090613372565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e80546118b390613372565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90613372565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461198691906137d0565b90508084106119af57808461199b91906137d0565b6011546119a89190613804565b91506119b4565b600091505b8192505050919050565b6060600a80546119cd90613372565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613372565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aec612083565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613c11565b60405180910390fd5b611b648161243f565b50565b611b6f612083565b60105482611b7b610c8d565b611b859190613846565b1115611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd90613c7d565b60405180910390fd5b611bd08183612503565b5050565b611bdc612083565b8060138190555050565b611bee612083565b8060118190555050565b600081611c03611c5f565b11158015611c12575060015482105b8015611c50575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cdb929190613c9d565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613cdb565b611d5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d549190612dae565b60405180910390fd5b5b50565b6000611d6c82612373565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611dd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ddf846126f4565b91509150611df58187611df0611c57565b61271b565b611e4157611e0a86611e05611c57565b611a50565b611e40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611ea7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb4868686600161275f565b8015611ebf57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f8d85611f69888887612765565b7c02000000000000000000000000000000000000000000000000000000001761278d565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120135760006001850190506000600560008381526020019081526020016000205403612011576001548114612010578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461207b86868660016127b8565b505050505050565b61208b6127be565b73ffffffffffffffffffffffffffffffffffffffff166120a96110e9565b73ffffffffffffffffffffffffffffffffffffffff16146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613d54565b60405180910390fd5b565b61211c83838360405180602001604052806000815250611755565b505050565b600061212c83612373565b9050600081905060008061213f866126f4565b9150915084156121a85761215b8184612156611c57565b61271b565b6121a7576121708361216b611c57565b611a50565b6121a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6121b683600088600161275f565b80156121c157600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506122698361222685600088612765565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761278d565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036122ef57600060018701905060006005600083815260200190815260200160002054036122ed5760015481146122ec578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123598360008860016127b8565b600260008154809291906001019190505550505050505050565b60008082905080612382611c5f565b11612408576001548110156124075760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612405575b600081036123fb5760056000836001900393508381526020019081526020016000205490506123d1565b809250505061243a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251d8282604051806020016040528060008152506127c6565b5050565b61252c848484610cbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258e5761255784848484612864565b61258d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036125db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ef565b600082905060005b6000821461260d5780806125f690613d74565b915050600a826126069190613deb565b91506125e3565b60008167ffffffffffffffff81111561262957612628612f63565b5b6040519080825280601f01601f19166020018201604052801561265b5781602001600182028036833780820191505090505b5090505b600085146126e85760018261267491906137d0565b9150600a856126839190613e1c565b603061268f9190613846565b60f81b8183815181106126a5576126a4613e4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e19190613deb565b945061265f565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861277c8686846129b4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6127d083836129bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461285f5760006001549050600083820390505b6128116000868380600101945086612864565b612847576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127fe57816001541461285c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288a611c57565b8786866040518563ffffffff1660e01b81526004016128ac9493929190613ed1565b6020604051808303816000875af19250505080156128e857506040513d601f19601f820116820180604052508101906128e59190613f32565b60015b612961573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b506000815103612959576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006001549050600082036129fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0b600084838561275f565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a8283612a736000866000612765565b612a7c85612b79565b1761278d565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b2357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612ae8565b5060008203612b5e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612b7460008483856127b8565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612b9e81612b89565b82525050565b6000602082019050612bb96000830184612b95565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0881612bd3565b8114612c1357600080fd5b50565b600081359050612c2581612bff565b92915050565b600060208284031215612c4157612c40612bc9565b5b6000612c4f84828501612c16565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cba82612c58565b612cc48185612c63565b9350612cd4818560208601612c74565b612cdd81612c9e565b840191505092915050565b60006020820190508181036000830152612d028184612caf565b905092915050565b6000819050919050565b612d1d81612d0a565b8114612d2857600080fd5b50565b600081359050612d3a81612d14565b92915050565b600060208284031215612d5657612d55612bc9565b5b6000612d6484828501612d2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9882612d6d565b9050919050565b612da881612d8d565b82525050565b6000602082019050612dc36000830184612d9f565b92915050565b612dd281612d8d565b8114612ddd57600080fd5b50565b600081359050612def81612dc9565b92915050565b60008060408385031215612e0c57612e0b612bc9565b5b6000612e1a85828601612de0565b9250506020612e2b85828601612d2b565b9150509250929050565b612e3e81612d0a565b82525050565b6000602082019050612e596000830184612e35565b92915050565b600060208284031215612e7557612e74612bc9565b5b6000612e8384828501612de0565b91505092915050565b600080600060608486031215612ea557612ea4612bc9565b5b6000612eb386828701612de0565b9350506020612ec486828701612de0565b9250506040612ed586828701612d2b565b9150509250925092565b6000819050919050565b6000612f04612eff612efa84612d6d565b612edf565b612d6d565b9050919050565b6000612f1682612ee9565b9050919050565b6000612f2882612f0b565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9b82612c9e565b810181811067ffffffffffffffff82111715612fba57612fb9612f63565b5b80604052505050565b6000612fcd612bbf565b9050612fd98282612f92565b919050565b600067ffffffffffffffff821115612ff957612ff8612f63565b5b61300282612c9e565b9050602081019050919050565b82818337600083830152505050565b600061303161302c84612fde565b612fc3565b90508281526020810184848401111561304d5761304c612f5e565b5b61305884828561300f565b509392505050565b600082601f83011261307557613074612f59565b5b813561308584826020860161301e565b91505092915050565b6000602082840312156130a4576130a3612bc9565b5b600082013567ffffffffffffffff8111156130c2576130c1612bce565b5b6130ce84828501613060565b91505092915050565b6130e081612b89565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612bc9565b5b6000613128858286016130ee565b925050602083013567ffffffffffffffff81111561314957613148612bce565b5b61315585828601613060565b9150509250929050565b6000806040838503121561317657613175612bc9565b5b600061318485828601612de0565b9250506020613195858286016130ee565b9150509250929050565b600067ffffffffffffffff8211156131ba576131b9612f63565b5b6131c382612c9e565b9050602081019050919050565b60006131e36131de8461319f565b612fc3565b9050828152602081018484840111156131ff576131fe612f5e565b5b61320a84828561300f565b509392505050565b600082601f83011261322757613226612f59565b5b81356132378482602086016131d0565b91505092915050565b6000806000806080858703121561325a57613259612bc9565b5b600061326887828801612de0565b945050602061327987828801612de0565b935050604061328a87828801612d2b565b925050606085013567ffffffffffffffff8111156132ab576132aa612bce565b5b6132b787828801613212565b91505092959194509250565b600080604083850312156132da576132d9612bc9565b5b60006132e885828601612de0565b92505060206132f985828601612de0565b9150509250929050565b6000806040838503121561331a57613319612bc9565b5b600061332885828601612d2b565b925050602061333985828601612de0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338a57607f821691505b60208210810361339d5761339c613343565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133d9601f83612c63565b91506133e4826133a3565b602082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b600081905092915050565b50565b600061342a60008361340f565b91506134358261341a565b600082019050919050565b600061344b8261341d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061348b601083612c63565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134e6565b61352d86836134e6565b95508019841693508086168417925050509392505050565b600061356061355b61355684612d0a565b612edf565b612d0a565b9050919050565b6000819050919050565b61357a83613545565b61358e61358682613567565b8484546134f3565b825550505050565b600090565b6135a3613596565b6135ae818484613571565b505050565b5b818110156135d2576135c760008261359b565b6001810190506135b4565b5050565b601f821115613617576135e8816134c1565b6135f1846134d6565b81016020851015613600578190505b61361461360c856134d6565b8301826135b3565b50505b505050565b600082821c905092915050565b600061363a6000198460080261361c565b1980831691505092915050565b60006136538383613629565b9150826002028217905092915050565b61366c82612c58565b67ffffffffffffffff81111561368557613684612f63565b5b61368f8254613372565b61369a8282856135d6565b600060209050601f8311600181146136cd57600084156136bb578287015190505b6136c58582613647565b86555061372d565b601f1984166136db866134c1565b60005b82811015613703578489015182556001820191506020850194506020810190506136de565b86831015613720578489015161371c601f891682613629565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061376b601e83612c63565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137db82612d0a565b91506137e683612d0a565b92508282039050818111156137fe576137fd6137a1565b5b92915050565b600061380f82612d0a565b915061381a83612d0a565b925082820261382881612d0a565b9150828204841483151761383f5761383e6137a1565b5b5092915050565b600061385182612d0a565b915061385c83612d0a565b9250828201905080821115613874576138736137a1565b5b92915050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006138b0601383612c63565b91506138bb8261387a565b602082019050919050565b600060208201905081810360008301526138df816138a3565b9050919050565b7f4e6f206d6f7265206c6566742100000000000000000000000000000000000000600082015250565b600061391c600d83612c63565b9150613927826138e6565b602082019050919050565b6000602082019050818103600083015261394b8161390f565b9050919050565b7f547269656420746f206d696e74206f766572206f766572206c696d6974000000600082015250565b6000613988601d83612c63565b915061399382613952565b602082019050919050565b600060208201905081810360008301526139b78161397b565b9050919050565b7f547269656420746f206d696e74206f766572206c696d69742c2072657472792060008201527f776974682072656475636564207175616e746974790000000000000000000000602082015250565b6000613a1a603583612c63565b9150613a25826139be565b604082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613a86601583612c63565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b9050919050565b600081905092915050565b60008154613ad481613372565b613ade8186613abc565b94506001821660008114613af95760018114613b0e57613b41565b60ff1983168652811515820286019350613b41565b613b17856134c1565b60005b83811015613b3957815481890152600182019150602081019050613b1a565b838801955050505b50505092915050565b6000613b5582612c58565b613b5f8185613abc565b9350613b6f818560208601612c74565b80840191505092915050565b6000613b878285613ac7565b9150613b938284613b4a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfb602683612c63565b9150613c0682613b9f565b604082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b7f4e6f206d6f726520416c69656e20696e2073746f636b21000000000000000000600082015250565b6000613c67601783612c63565b9150613c7282613c31565b602082019050919050565b60006020820190508181036000830152613c9681613c5a565b9050919050565b6000604082019050613cb26000830185612d9f565b613cbf6020830184612d9f565b9392505050565b600081519050613cd5816130d7565b92915050565b600060208284031215613cf157613cf0612bc9565b5b6000613cff84828501613cc6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3e602083612c63565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b6000613d7f82612d0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613db157613db06137a1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613df682612d0a565b9150613e0183612d0a565b925082613e1157613e10613dbc565b5b828204905092915050565b6000613e2782612d0a565b9150613e3283612d0a565b925082613e4257613e41613dbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613ea382613e7c565b613ead8185613e87565b9350613ebd818560208601612c74565b613ec681612c9e565b840191505092915050565b6000608082019050613ee66000830187612d9f565b613ef36020830186612d9f565b613f006040830185612e35565b8181036060830152613f128184613e98565b905095945050505050565b600081519050613f2c81612bff565b92915050565b600060208284031215613f4857613f47612bc9565b5b6000613f5684828501613f1d565b9150509291505056fea26469706673582212205640f06ccd3e22c940e1ef9c33e148086e815faff89942bbd0d642f63f4eb4b564736f6c63430008120033

Deployed Bytecode Sourcemap

35561:4718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35923:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14527:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14779:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18355:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17939:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36114:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12890:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35697:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39287:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38145:191;;;;;;;;;;;;;:::i;:::-;;30259:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39481:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35432:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35768:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38606:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35663:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36077:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15427:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13355:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;885:103;;;;;;;;;;;;;:::i;:::-;;38344:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;650:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14887:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36937:1084;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38948:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18581:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38027:110;;;;;;;;;;;;;:::i;:::-;;35745:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39683:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36003:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39181:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39933:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36043:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35965:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35804:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36605:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38501:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18823:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;998:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36212:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39066:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38840:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35923:39;;;;;;;;;;;;;:::o;14527:244::-;14612:4;14666:10;14651:25;;:11;:25;;;;:68;;;;14709:10;14694:25;;:11;:25;;;;14651:68;:111;;;;14752:10;14737:25;;:11;:25;;;;14651:111;14631:131;;14527:244;;;:::o;14779:100::-;14833:13;14866:5;14859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14779:100;:::o;18355:218::-;18431:7;18456:16;18464:7;18456;:16::i;:::-;18451:64;;18481:34;;;;;;;;;;;;;;18451:64;18535:15;:24;18551:7;18535:24;;;;;;;;;;;:30;;;;;;;;;;;;18528:37;;18355:218;;;:::o;17939:408::-;18028:13;18044:16;18052:7;18044;:16::i;:::-;18028:32;;18100:5;18077:28;;:19;:17;:19::i;:::-;:28;;;18073:175;;18125:44;18142:5;18149:19;:17;:19::i;:::-;18125:16;:44::i;:::-;18120:128;;18197:35;;;;;;;;;;;;;;18120:128;18073:175;18293:2;18260:15;:24;18276:7;18260:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;18331:7;18327:2;18311:28;;18320:5;18311:28;;;;;;;;;;;;18017:330;17939:408;;:::o;36114:38::-;;;;:::o;12890:180::-;12951:7;13036:15;:13;:15::i;:::-;13021:12;;13005:13;;:28;:46;12998:53;;12890:180;:::o;35697:45::-;;;;;;;;;;;;;;;;;:::o;39287:186::-;39415:4;31609:10;31601:18;;:4;:18;;;31597:83;;31636:32;31657:10;31636:20;:32::i;:::-;31597:83;39428:37:::1;39447:4;39453:2;39457:7;39428:18;:37::i;:::-;39287:186:::0;;;;:::o;38145:191::-;609:13;:11;:13::i;:::-;1559:1:::1;1717:7;;:19:::0;1709:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1559:1;1785:7;:18;;;;38214:12:::2;38232:10;:15;;38255:21;38232:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38213:68;;;38300:7;38292:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;38202:134;1515:1:::1;1830:7;:22;;;;38145:191::o:0;30259:143::-;35076:42;30259:143;:::o;39481:194::-;39613:4;31609:10;31601:18;;:4;:18;;;31597:83;;31636:32;31657:10;31636:20;:32::i;:::-;31597:83;39626:41:::1;39649:4;39655:2;39659:7;39626:22;:41::i;:::-;39481:194:::0;;;;:::o;35432:94::-;35498:20;35504:7;35513:4;35498:5;:20::i;:::-;35432:94;:::o;35768:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38606:112::-;609:13;:11;:13::i;:::-;38698:12:::1;38683;:27;;;;;;:::i;:::-;;38606:112:::0;:::o;35663:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36077:34::-;;;;:::o;15427:152::-;15499:7;15542:27;15561:7;15542:18;:27::i;:::-;15519:52;;15427:152;;;:::o;13355:233::-;13427:7;13468:1;13451:19;;:5;:19;;;13447:60;;13479:28;;;;;;;;;;;;;;13447:60;11163:13;13525:18;:25;13544:5;13525:25;;;;;;;;;;;;;;;;:55;13518:62;;13355:233;;;:::o;885:103::-;609:13;:11;:13::i;:::-;950:30:::1;977:1;950:18;:30::i;:::-;885:103::o:0;38344:149::-;609:13;:11;:13::i;:::-;38446:8:::1;38435;:19;;;;;;:::i;:::-;;38476:9;38465:8;;:20;;;;;;;;;;;;;;;;;;38344:149:::0;;:::o;38726:106::-;609:13;:11;:13::i;:::-;38820:4:::1;38802:15;:22;;;;38726:106:::0;:::o;650:87::-;696:7;723:6;;;;;;;;;;;716:13;;650:87;:::o;14887:104::-;14943:13;14976:7;14969:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14887:104;:::o;36937:1084::-;36532:10;36519:23;;:9;:23;;;36511:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1559:1:::1;1717:7;;:19:::0;1709:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1559:1;1785:7;:18;;;;37062:10:::2;37083:9:::0;37120:13:::2;:25;37134:10;37120:25;;;;;;;;;;;;;;;;37095:22;;:50;;;;:::i;:::-;37083:62;;37172:4;37160:8;:16;37156:285;;37228:4;37217:8;:15;;;;:::i;:::-;37202:10;;37201:32;;;;:::i;:::-;37193:40;;37304:4;37276:13;:25;37290:10;37276:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;37248:13;:25;37262:10;37248:25;;;;;;;;;;;;;;;:60;;;;37156:285;;;37349:1;37341:9;;37421:8;37393:13;:25;37407:10;37393:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;37365:13;:25;37379:10;37365:25;;;;;;;;;;;;;;;:64;;;;37156:285;37461:19;;;;;;;;;;;37453:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;37551:15;;37539:8;37523:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37515:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37641:17;;37629:8;37605:21;37615:10;37605:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;37597:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37725:14;;37713:8;:26;;37705:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;37829:5;37816:9;:18;;37808:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37873:31;37883:10;37895:8;37873:9;:31::i;:::-;37933:5;37921:9;:17;37917:97;;;37963:10;37955:28;;:47;37996:5;37984:9;:17;;;;:::i;:::-;37955:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;37917:97;37051:970;;1515:1:::1;1830:7;:22;;;;36937:1084:::0;:::o;38948:110::-;609:13;:11;:13::i;:::-;39046:4:::1;39021:22;:29;;;;38948:110:::0;:::o;18581:234::-;18728:8;18676:18;:39;18695:19;:17;:19::i;:::-;18676:39;;;;;;;;;;;;;;;:49;18716:8;18676:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;18788:8;18752:55;;18767:19;:17;:19::i;:::-;18752:55;;;18798:8;18752:55;;;;;;:::i;:::-;;;;;;;;18581:234;;:::o;38027:110::-;609:13;:11;:13::i;:::-;38110:19:::1;;;;;;;;;;;38109:20;38087:19;;:42;;;;;;;;;;;;;;;;;;38027:110::o:0;35745:20::-;;;;;;;;;;;;;:::o;39683:244::-;39854:4;31609:10;31601:18;;:4;:18;;;31597:83;;31636:32;31657:10;31636:20;:32::i;:::-;31597:83;39872:47:::1;39895:4;39901:2;39905:7;39914:4;39872:22;:47::i;:::-;39683:244:::0;;;;;:::o;36003:36::-;;;;:::o;39181:98::-;609:13;:11;:13::i;:::-;39267:4:::1;39250:14;:21;;;;39181:98:::0;:::o;39933:341::-;40055:13;40090:8;;;;;;;;;;;40086:181;;;40163:8;40173:26;40190:8;40173:16;:26::i;:::-;40146:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40115:86;;;;40086:181;40241:14;40234:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39933:341;;;;:::o;36043:31::-;;;;:::o;35965:34::-;;;;:::o;35804:116::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36605:324::-;36658:4;36674:10;36695:9;36732:13;:25;36746:10;36732:25;;;;;;;;;;;;;;;;36707:22;;:50;;;;:::i;:::-;36695:62;;36784:4;36772:8;:16;36768:131;;36840:4;36829:8;:15;;;;:::i;:::-;36814:10;;36813:32;;;;:::i;:::-;36805:40;;36768:131;;;36886:1;36878:9;;36768:131;36916:5;36909:12;;;;36605:324;;;:::o;38501:97::-;38545:13;38578:12;38571:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38501:97;:::o;18823:164::-;18920:4;18944:18;:25;18963:5;18944:25;;;;;;;;;;;;;;;:35;18970:8;18944:35;;;;;;;;;;;;;;;;;;;;;;;;;18937:42;;18823:164;;;;:::o;998:201::-;609:13;:11;:13::i;:::-;1107:1:::1;1087:22;;:8;:22;;::::0;1079:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1163:28;1182:8;1163:18;:28::i;:::-;998:201:::0;:::o;36212:256::-;609:13;:11;:13::i;:::-;36344:15:::1;;36332:8;36316:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;36294:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;36431:29;36441:8;36451;36431:9;:29::i;:::-;36212:256:::0;;:::o;39066:107::-;609:13;:11;:13::i;:::-;39161:4:::1;39141:17;:24;;;;39066:107:::0;:::o;38840:100::-;609:13;:11;:13::i;:::-;38923:9:::1;38910:10;:22;;;;38840:100:::0;:::o;18995:282::-;19060:4;19116:7;19097:15;:13;:15::i;:::-;:26;;:66;;;;;19150:13;;19140:7;:23;19097:66;:153;;;;;19249:1;11537:8;19201:17;:26;19219:7;19201:26;;;;;;;;;;;;:44;:49;19097:153;19077:173;;18995:282;;;:::o;29375:105::-;29435:7;29462:10;29455:17;;29375:105;:::o;12679:92::-;12735:7;12679:92;:::o;32018:647::-;32257:1;35076:42;32209:45;;;:49;32205:453;;;35076:42;32508;;;32559:4;32566:8;32508:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32503:144;;32622:8;32603:28;;;;;;;;;;;:::i;:::-;;;;;;;;32503:144;32205:453;32018:647;:::o;20090:1651::-;20232:27;20262;20281:7;20262:18;:27::i;:::-;20232:57;;20347:4;20306:45;;20322:19;20306:45;;;20302:86;;20360:28;;;;;;;;;;;;;;20302:86;20402:27;20431:23;20458:35;20485:7;20458:26;:35::i;:::-;20401:92;;;;20511:68;20536:15;20553:4;20559:19;:17;:19::i;:::-;20511:24;:68::i;:::-;20506:180;;20599:43;20616:4;20622:19;:17;:19::i;:::-;20599:16;:43::i;:::-;20594:92;;20651:35;;;;;;;;;;;;;;20594:92;20506:180;20717:1;20703:16;;:2;:16;;;20699:52;;20728:23;;;;;;;;;;;;;;20699:52;20764:43;20786:4;20792:2;20796:7;20805:1;20764:21;:43::i;:::-;20847:15;20844:85;;;20912:1;20891:19;20884:30;20844:85;20981:18;:24;21000:4;20981:24;;;;;;;;;;;;;;;;20979:26;;;;;;;;;;;;21023:18;:22;21042:2;21023:22;;;;;;;;;;;;;;;;21021:24;;;;;;;;;;;21092:146;21129:2;21178:45;21193:4;21199:2;21203:19;21178:14;:45::i;:::-;11671:8;21150:73;21092:18;:146::i;:::-;21063:17;:26;21081:7;21063:26;;;;;;;;;;;:175;;;;21310:1;11671:8;21259:19;:47;:52;21255:370;;21332:19;21364:1;21354:7;:11;21332:33;;21424:1;21390:17;:30;21408:11;21390:30;;;;;;;;;;;;:35;21386:224;;21471:13;;21456:11;:28;21452:139;;21548:19;21515:17;:30;21533:11;21515:30;;;;;;;;;;;:52;;;;21452:139;21386:224;21313:312;21255:370;21672:7;21668:2;21653:27;;21662:4;21653:27;;;;;;;;;;;;21691:42;21712:4;21718:2;21722:7;21731:1;21691:20;:42::i;:::-;20221:1520;;;20090:1651;;;:::o;745:132::-;820:12;:10;:12::i;:::-;809:23;;:7;:5;:7::i;:::-;:23;;;801:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;745:132::o;21749:193::-;21895:39;21912:4;21918:2;21922:7;21895:39;;;;;;;;;;;;:16;:39::i;:::-;21749:193;;;:::o;26745:1679::-;26825:27;26855;26874:7;26855:18;:27::i;:::-;26825:57;;26895:12;26926:19;26895:52;;26961:27;26990:23;27017:35;27044:7;27017:26;:35::i;:::-;26960:92;;;;27069:13;27065:244;;;27118:68;27143:15;27160:4;27166:19;:17;:19::i;:::-;27118:24;:68::i;:::-;27113:184;;27210:43;27227:4;27233:19;:17;:19::i;:::-;27210:16;:43::i;:::-;27205:92;;27262:35;;;;;;;;;;;;;;27205:92;27113:184;27065:244;27321:51;27343:4;27357:1;27361:7;27370:1;27321:21;:51::i;:::-;27412:15;27409:101;;;27493:1;27472:19;27465:30;27409:101;27619:1;11294:3;27589:1;:26;;27588:32;27560:18;:24;27579:4;27560:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;27666:176;27703:4;27774:53;27789:4;27803:1;27807:19;27774:14;:53::i;:::-;11671:8;11537;27727:43;27726:101;27666:18;:176::i;:::-;27637:17;:26;27655:7;27637:26;;;;;;;;;;;:205;;;;27914:1;11671:8;27863:19;:47;:52;27859:370;;27936:19;27968:1;27958:7;:11;27936:33;;28028:1;27994:17;:30;28012:11;27994:30;;;;;;;;;;;;:35;27990:224;;28075:13;;28060:11;:28;28056:139;;28152:19;28119:17;:30;28137:11;28119:30;;;;;;;;;;;:52;;;;28056:139;27990:224;27917:312;27859:370;28284:7;28280:1;28257:35;;28266:4;28257:35;;;;;;;;;;;;28303:50;28324:4;28338:1;28342:7;28351:1;28303:20;:50::i;:::-;28391:12;;:14;;;;;;;;;;;;;26814:1610;;;;26745:1679;;:::o;16134:633::-;16201:7;16221:12;16236:7;16221:22;;16304:4;16285:15;:13;:15::i;:::-;:23;16281:419;;16338:13;;16331:4;:20;16327:373;;;16376:14;16393:17;:23;16411:4;16393:23;;;;;;;;;;;;16376:40;;16473:1;11537:8;16445:6;:24;:29;16441:240;;16505:113;16522:1;16512:6;:11;16505:113;;16565:17;:25;16583:6;;;;;;;16565:25;;;;;;;;;;;;16556:34;;16505:113;;;16651:6;16644:13;;;;;;16441:240;16353:347;16327:373;16281:419;16728:31;;;;;;;;;;;;;;16134:633;;;;:::o;1207:191::-;1281:16;1300:6;;;;;;;;;;;1281:25;;1326:8;1317:6;;:17;;;;;;;;;;;;;;;;;;1381:8;1350:40;;1371:8;1350:40;;;;;;;;;;;;1270:128;1207:191;:::o;26528:112::-;26605:27;26615:2;26619:8;26605:27;;;;;;;;;;;;:9;:27::i;:::-;26528:112;;:::o;21950:407::-;22125:31;22138:4;22144:2;22148:7;22125:12;:31::i;:::-;22189:1;22171:2;:14;;;:19;22167:183;;22210:56;22241:4;22247:2;22251:7;22260:5;22210:30;:56::i;:::-;22205:145;;22294:40;;;;;;;;;;;;;;22205:145;22167:183;21950:407;;;;:::o;2034:534::-;2090:13;2131:1;2122:5;:10;2118:53;;2149:10;;;;;;;;;;;;;;;;;;;;;2118:53;2181:12;2196:5;2181:20;;2212:14;2237:78;2252:1;2244:4;:9;2237:78;;2270:8;;;;;:::i;:::-;;;;2301:2;2293:10;;;;;:::i;:::-;;;2237:78;;;2325:19;2357:6;2347:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2325:39;;2375:154;2391:1;2382:5;:10;2375:154;;2419:1;2409:11;;;;;:::i;:::-;;;2486:2;2478:5;:10;;;;:::i;:::-;2465:2;:24;;;;:::i;:::-;2452:39;;2435:6;2442;2435:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2515:2;2506:11;;;;;:::i;:::-;;;2375:154;;;2553:6;2539:21;;;;;2034:534;;;;:::o;19690:392::-;19792:27;19821:23;19862:38;19903:15;:24;19919:7;19903:24;;;;;;;;;;;19862:65;;19987:18;19964:41;;20044:19;20038:26;20019:45;;19949:126;19690:392;;;:::o;19285:397::-;19434:11;19504:16;19497:5;19493:28;19484:37;;19565:16;19554:9;19550:32;19537:45;;19647:15;19636:9;19633:30;19625:5;19614:9;19611:20;19608:56;19598:66;;19285:397;;;;;:::o;22365:159::-;;;;;:::o;29056:311::-;29191:7;29211:16;11734:3;29237:19;:41;;29211:68;;11734:3;29305:31;29316:4;29322:2;29326:9;29305:10;:31::i;:::-;29297:40;;:62;;29290:69;;;29056:311;;;;;:::o;17149:450::-;17229:14;17397:16;17390:5;17386:28;17377:37;;17574:5;17560:11;17535:23;17531:41;17528:52;17521:5;17518:63;17508:73;;17149:450;;;;:::o;22532:158::-;;;;;:::o;98:98::-;151:7;178:10;171:17;;98:98;:::o;25831:689::-;25962:19;25968:2;25972:8;25962:5;:19::i;:::-;26041:1;26023:2;:14;;;:19;26019:483;;26063:11;26077:13;;26063:27;;26109:13;26131:8;26125:3;:14;26109:30;;26158:233;26189:62;26228:1;26232:2;26236:7;;;;;;26245:5;26189:30;:62::i;:::-;26184:167;;26287:40;;;;;;;;;;;;;;26184:167;26386:3;26378:5;:11;26158:233;;26473:3;26456:13;;:20;26452:34;;26478:8;;;26452:34;26044:458;;26019:483;25831:689;;;:::o;22698:716::-;22861:4;22907:2;22882:45;;;22928:19;:17;:19::i;:::-;22949:4;22955:7;22964:5;22882:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;22878:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23182:1;23165:6;:13;:18;23161:235;;23211:40;;;;;;;;;;;;;;23161:235;23354:6;23348:13;23339:6;23335:2;23331:15;23324:38;22878:529;23051:54;;;23041:64;;;:6;:64;;;;23034:71;;;22698:716;;;;;;:::o;28901:147::-;29038:6;28901:147;;;;;:::o;23422:1442::-;23495:20;23518:13;;23495:36;;23558:1;23546:8;:13;23542:44;;23568:18;;;;;;;;;;;;;;23542:44;23599:61;23629:1;23633:2;23637:12;23651:8;23599:21;:61::i;:::-;23769:1;11234:2;23739:1;:26;;23738:32;23726:8;:45;23700:18;:22;23719:2;23700:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;23822:139;23859:2;23913:33;23936:1;23940:2;23944:1;23913:14;:33::i;:::-;23880:30;23901:8;23880:20;:30::i;:::-;:66;23822:18;:139::i;:::-;23788:17;:31;23806:12;23788:31;;;;;;;;;;;:173;;;;23978:16;24009:11;24038:8;24023:12;:23;24009:37;;24113:16;24109:2;24105:25;24093:37;;24333:12;24301:8;24276:1;24227:25;24202:1;24177;24150:215;24445:1;24431:12;24427:20;24385:279;24486:3;24477:7;24474:16;24385:279;;24637:7;24627:8;24624:1;24597:25;24594:1;24591;24586:59;24539:1;24530:7;24526:15;24515:26;;24385:279;;;24389:77;24709:1;24697:8;:13;24693:45;;24719:19;;;;;;;;;;;;;;24693:45;24771:3;24755:13;:19;;;;23673:1113;;24796:60;24825:1;24829:2;24833:12;24847:8;24796:20;:60::i;:::-;23484:1380;23422:1442;;:::o;17607:324::-;17677:14;17910:1;17900:8;17897:15;17871:24;17867:46;17857:56;;17607: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:60::-;6230:3;6251:5;6244:12;;6202:60;;;:::o;6268:142::-;6318:9;6351:53;6369:34;6378:24;6396:5;6378:24;:::i;:::-;6369:34;:::i;:::-;6351:53;:::i;:::-;6338:66;;6268:142;;;:::o;6416:126::-;6466:9;6499:37;6530:5;6499:37;:::i;:::-;6486:50;;6416:126;;;:::o;6548:158::-;6630:9;6663:37;6694:5;6663:37;:::i;:::-;6650:50;;6548:158;;;:::o;6712:195::-;6831:69;6894:5;6831:69;:::i;:::-;6826:3;6819:82;6712:195;;:::o;6913:286::-;7038:4;7076:2;7065:9;7061:18;7053:26;;7089:103;7189:1;7178:9;7174:17;7165:6;7089:103;:::i;:::-;6913:286;;;;:::o;7205:117::-;7314:1;7311;7304:12;7328:117;7437:1;7434;7427:12;7451:180;7499:77;7496:1;7489:88;7596:4;7593:1;7586:15;7620:4;7617:1;7610:15;7637:281;7720:27;7742:4;7720:27;:::i;:::-;7712:6;7708:40;7850:6;7838:10;7835:22;7814:18;7802:10;7799:34;7796:62;7793:88;;;7861:18;;:::i;:::-;7793:88;7901:10;7897:2;7890:22;7680:238;7637:281;;:::o;7924:129::-;7958:6;7985:20;;:::i;:::-;7975:30;;8014:33;8042:4;8034:6;8014:33;:::i;:::-;7924:129;;;:::o;8059:308::-;8121:4;8211:18;8203:6;8200:30;8197:56;;;8233:18;;:::i;:::-;8197:56;8271:29;8293:6;8271:29;:::i;:::-;8263:37;;8355:4;8349;8345:15;8337:23;;8059:308;;;:::o;8373:146::-;8470:6;8465:3;8460;8447:30;8511:1;8502:6;8497:3;8493:16;8486:27;8373:146;;;:::o;8525:425::-;8603:5;8628:66;8644:49;8686:6;8644:49;:::i;:::-;8628:66;:::i;:::-;8619:75;;8717:6;8710:5;8703:21;8755:4;8748:5;8744:16;8793:3;8784:6;8779:3;8775:16;8772:25;8769:112;;;8800:79;;:::i;:::-;8769:112;8890:54;8937:6;8932:3;8927;8890:54;:::i;:::-;8609:341;8525:425;;;;;:::o;8970:340::-;9026:5;9075:3;9068:4;9060:6;9056:17;9052:27;9042:122;;9083:79;;:::i;:::-;9042:122;9200:6;9187:20;9225:79;9300:3;9292:6;9285:4;9277:6;9273:17;9225:79;:::i;:::-;9216:88;;9032:278;8970:340;;;;:::o;9316:509::-;9385:6;9434:2;9422:9;9413:7;9409:23;9405:32;9402:119;;;9440:79;;:::i;:::-;9402:119;9588:1;9577:9;9573:17;9560:31;9618:18;9610:6;9607:30;9604:117;;;9640:79;;:::i;:::-;9604:117;9745:63;9800:7;9791:6;9780:9;9776:22;9745:63;:::i;:::-;9735:73;;9531:287;9316:509;;;;:::o;9831:116::-;9901:21;9916:5;9901:21;:::i;:::-;9894:5;9891:32;9881:60;;9937:1;9934;9927:12;9881:60;9831:116;:::o;9953:133::-;9996:5;10034:6;10021:20;10012:29;;10050:30;10074:5;10050:30;:::i;:::-;9953:133;;;;:::o;10092:648::-;10167:6;10175;10224:2;10212:9;10203:7;10199:23;10195:32;10192:119;;;10230:79;;:::i;:::-;10192:119;10350:1;10375:50;10417:7;10408:6;10397:9;10393:22;10375:50;:::i;:::-;10365:60;;10321:114;10502:2;10491:9;10487:18;10474:32;10533:18;10525:6;10522:30;10519:117;;;10555:79;;:::i;:::-;10519:117;10660:63;10715:7;10706:6;10695:9;10691:22;10660:63;:::i;:::-;10650:73;;10445:288;10092:648;;;;;:::o;10746:468::-;10811:6;10819;10868:2;10856:9;10847:7;10843:23;10839:32;10836:119;;;10874:79;;:::i;:::-;10836:119;10994:1;11019:53;11064:7;11055:6;11044:9;11040:22;11019:53;:::i;:::-;11009:63;;10965:117;11121:2;11147:50;11189:7;11180:6;11169:9;11165:22;11147:50;:::i;:::-;11137:60;;11092:115;10746:468;;;;;:::o;11220:307::-;11281:4;11371:18;11363:6;11360:30;11357:56;;;11393:18;;:::i;:::-;11357:56;11431:29;11453:6;11431:29;:::i;:::-;11423:37;;11515:4;11509;11505:15;11497:23;;11220:307;;;:::o;11533:423::-;11610:5;11635:65;11651:48;11692:6;11651:48;:::i;:::-;11635:65;:::i;:::-;11626:74;;11723:6;11716:5;11709:21;11761:4;11754:5;11750:16;11799:3;11790:6;11785:3;11781:16;11778:25;11775:112;;;11806:79;;:::i;:::-;11775:112;11896:54;11943:6;11938:3;11933;11896:54;:::i;:::-;11616:340;11533:423;;;;;:::o;11975:338::-;12030:5;12079:3;12072:4;12064:6;12060:17;12056:27;12046:122;;12087:79;;:::i;:::-;12046:122;12204:6;12191:20;12229:78;12303:3;12295:6;12288:4;12280:6;12276:17;12229:78;:::i;:::-;12220:87;;12036:277;11975:338;;;;:::o;12319:943::-;12414:6;12422;12430;12438;12487:3;12475:9;12466:7;12462:23;12458:33;12455:120;;;12494:79;;:::i;:::-;12455:120;12614:1;12639:53;12684:7;12675:6;12664:9;12660:22;12639:53;:::i;:::-;12629:63;;12585:117;12741:2;12767:53;12812:7;12803:6;12792:9;12788:22;12767:53;:::i;:::-;12757:63;;12712:118;12869:2;12895:53;12940:7;12931:6;12920:9;12916:22;12895:53;:::i;:::-;12885:63;;12840:118;13025:2;13014:9;13010:18;12997:32;13056:18;13048:6;13045:30;13042:117;;;13078:79;;:::i;:::-;13042:117;13183:62;13237:7;13228:6;13217:9;13213:22;13183:62;:::i;:::-;13173:72;;12968:287;12319:943;;;;;;;:::o;13268:474::-;13336:6;13344;13393:2;13381:9;13372:7;13368:23;13364:32;13361:119;;;13399:79;;:::i;:::-;13361:119;13519:1;13544:53;13589:7;13580:6;13569:9;13565:22;13544:53;:::i;:::-;13534:63;;13490:117;13646:2;13672:53;13717:7;13708:6;13697:9;13693:22;13672:53;:::i;:::-;13662:63;;13617:118;13268:474;;;;;:::o;13748:::-;13816:6;13824;13873:2;13861:9;13852:7;13848:23;13844:32;13841:119;;;13879:79;;:::i;:::-;13841:119;13999:1;14024:53;14069:7;14060:6;14049:9;14045:22;14024:53;:::i;:::-;14014:63;;13970:117;14126:2;14152:53;14197:7;14188:6;14177:9;14173:22;14152:53;:::i;:::-;14142:63;;14097:118;13748:474;;;;;:::o;14228:180::-;14276:77;14273:1;14266:88;14373:4;14370:1;14363:15;14397:4;14394:1;14387:15;14414:320;14458:6;14495:1;14489:4;14485:12;14475:22;;14542:1;14536:4;14532:12;14563:18;14553:81;;14619:4;14611:6;14607:17;14597:27;;14553:81;14681:2;14673:6;14670:14;14650:18;14647:38;14644:84;;14700:18;;:::i;:::-;14644:84;14465:269;14414:320;;;:::o;14740:181::-;14880:33;14876:1;14868:6;14864:14;14857:57;14740:181;:::o;14927:366::-;15069:3;15090:67;15154:2;15149:3;15090:67;:::i;:::-;15083:74;;15166:93;15255:3;15166:93;:::i;:::-;15284:2;15279:3;15275:12;15268:19;;14927:366;;;:::o;15299:419::-;15465:4;15503:2;15492:9;15488:18;15480:26;;15552:9;15546:4;15542:20;15538:1;15527:9;15523:17;15516:47;15580:131;15706:4;15580:131;:::i;:::-;15572:139;;15299:419;;;:::o;15724:147::-;15825:11;15862:3;15847:18;;15724:147;;;;:::o;15877:114::-;;:::o;15997:398::-;16156:3;16177:83;16258:1;16253:3;16177:83;:::i;:::-;16170:90;;16269:93;16358:3;16269:93;:::i;:::-;16387:1;16382:3;16378:11;16371:18;;15997:398;;;:::o;16401:379::-;16585:3;16607:147;16750:3;16607:147;:::i;:::-;16600:154;;16771:3;16764:10;;16401:379;;;:::o;16786:166::-;16926:18;16922:1;16914:6;16910:14;16903:42;16786:166;:::o;16958:366::-;17100:3;17121:67;17185:2;17180:3;17121:67;:::i;:::-;17114:74;;17197:93;17286:3;17197:93;:::i;:::-;17315:2;17310:3;17306:12;17299:19;;16958:366;;;:::o;17330:419::-;17496:4;17534:2;17523:9;17519:18;17511:26;;17583:9;17577:4;17573:20;17569:1;17558:9;17554:17;17547:47;17611:131;17737:4;17611:131;:::i;:::-;17603:139;;17330:419;;;:::o;17755:141::-;17804:4;17827:3;17819:11;;17850:3;17847:1;17840:14;17884:4;17881:1;17871:18;17863:26;;17755:141;;;:::o;17902:93::-;17939:6;17986:2;17981;17974:5;17970:14;17966:23;17956:33;;17902:93;;;:::o;18001:107::-;18045:8;18095:5;18089:4;18085:16;18064:37;;18001:107;;;;:::o;18114:393::-;18183:6;18233:1;18221:10;18217:18;18256:97;18286:66;18275:9;18256:97;:::i;:::-;18374:39;18404:8;18393:9;18374:39;:::i;:::-;18362:51;;18446:4;18442:9;18435:5;18431:21;18422:30;;18495:4;18485:8;18481:19;18474:5;18471:30;18461:40;;18190:317;;18114:393;;;;;:::o;18513:142::-;18563:9;18596:53;18614:34;18623:24;18641:5;18623:24;:::i;:::-;18614:34;:::i;:::-;18596:53;:::i;:::-;18583:66;;18513:142;;;:::o;18661:75::-;18704:3;18725:5;18718:12;;18661:75;;;:::o;18742:269::-;18852:39;18883:7;18852:39;:::i;:::-;18913:91;18962:41;18986:16;18962:41;:::i;:::-;18954:6;18947:4;18941:11;18913:91;:::i;:::-;18907:4;18900:105;18818:193;18742:269;;;:::o;19017:73::-;19062:3;19017:73;:::o;19096:189::-;19173:32;;:::i;:::-;19214:65;19272:6;19264;19258:4;19214:65;:::i;:::-;19149:136;19096:189;;:::o;19291:186::-;19351:120;19368:3;19361:5;19358:14;19351:120;;;19422:39;19459:1;19452:5;19422:39;:::i;:::-;19395:1;19388:5;19384:13;19375:22;;19351:120;;;19291:186;;:::o;19483:543::-;19584:2;19579:3;19576:11;19573:446;;;19618:38;19650:5;19618:38;:::i;:::-;19702:29;19720:10;19702:29;:::i;:::-;19692:8;19688:44;19885:2;19873:10;19870:18;19867:49;;;19906:8;19891:23;;19867:49;19929:80;19985:22;20003:3;19985:22;:::i;:::-;19975:8;19971:37;19958:11;19929:80;:::i;:::-;19588:431;;19573:446;19483:543;;;:::o;20032:117::-;20086:8;20136:5;20130:4;20126:16;20105:37;;20032:117;;;;:::o;20155:169::-;20199:6;20232:51;20280:1;20276:6;20268:5;20265:1;20261:13;20232:51;:::i;:::-;20228:56;20313:4;20307;20303:15;20293:25;;20206:118;20155:169;;;;:::o;20329:295::-;20405:4;20551:29;20576:3;20570:4;20551:29;:::i;:::-;20543:37;;20613:3;20610:1;20606:11;20600:4;20597:21;20589:29;;20329:295;;;;:::o;20629:1395::-;20746:37;20779:3;20746:37;:::i;:::-;20848:18;20840:6;20837:30;20834:56;;;20870:18;;:::i;:::-;20834:56;20914:38;20946:4;20940:11;20914:38;:::i;:::-;20999:67;21059:6;21051;21045:4;20999:67;:::i;:::-;21093:1;21117:4;21104:17;;21149:2;21141:6;21138:14;21166:1;21161:618;;;;21823:1;21840:6;21837:77;;;21889:9;21884:3;21880:19;21874:26;21865:35;;21837:77;21940:67;22000:6;21993:5;21940:67;:::i;:::-;21934:4;21927:81;21796:222;21131:887;;21161:618;21213:4;21209:9;21201:6;21197:22;21247:37;21279:4;21247:37;:::i;:::-;21306:1;21320:208;21334:7;21331:1;21328:14;21320:208;;;21413:9;21408:3;21404:19;21398:26;21390:6;21383:42;21464:1;21456:6;21452:14;21442:24;;21511:2;21500:9;21496:18;21483:31;;21357:4;21354:1;21350:12;21345:17;;21320:208;;;21556:6;21547:7;21544:19;21541:179;;;21614:9;21609:3;21605:19;21599:26;21657:48;21699:4;21691:6;21687:17;21676:9;21657:48;:::i;:::-;21649:6;21642:64;21564:156;21541:179;21766:1;21762;21754:6;21750:14;21746:22;21740:4;21733:36;21168:611;;;21131:887;;20721:1303;;;20629:1395;;:::o;22030:180::-;22170:32;22166:1;22158:6;22154:14;22147:56;22030:180;:::o;22216:366::-;22358:3;22379:67;22443:2;22438:3;22379:67;:::i;:::-;22372:74;;22455:93;22544:3;22455:93;:::i;:::-;22573:2;22568:3;22564:12;22557:19;;22216:366;;;:::o;22588:419::-;22754:4;22792:2;22781:9;22777:18;22769:26;;22841:9;22835:4;22831:20;22827:1;22816:9;22812:17;22805:47;22869:131;22995:4;22869:131;:::i;:::-;22861:139;;22588:419;;;:::o;23013:180::-;23061:77;23058:1;23051:88;23158:4;23155:1;23148:15;23182:4;23179:1;23172:15;23199:194;23239:4;23259:20;23277:1;23259:20;:::i;:::-;23254:25;;23293:20;23311:1;23293:20;:::i;:::-;23288:25;;23337:1;23334;23330:9;23322:17;;23361:1;23355:4;23352:11;23349:37;;;23366:18;;:::i;:::-;23349:37;23199:194;;;;:::o;23399:410::-;23439:7;23462:20;23480:1;23462:20;:::i;:::-;23457:25;;23496:20;23514:1;23496:20;:::i;:::-;23491:25;;23551:1;23548;23544:9;23573:30;23591:11;23573:30;:::i;:::-;23562:41;;23752:1;23743:7;23739:15;23736:1;23733:22;23713:1;23706:9;23686:83;23663:139;;23782:18;;:::i;:::-;23663:139;23447:362;23399:410;;;;:::o;23815:191::-;23855:3;23874:20;23892:1;23874:20;:::i;:::-;23869:25;;23908:20;23926:1;23908:20;:::i;:::-;23903:25;;23951:1;23948;23944:9;23937:16;;23972:3;23969:1;23966:10;23963:36;;;23979:18;;:::i;:::-;23963:36;23815:191;;;;:::o;24012:169::-;24152:21;24148:1;24140:6;24136:14;24129:45;24012:169;:::o;24187:366::-;24329:3;24350:67;24414:2;24409:3;24350:67;:::i;:::-;24343:74;;24426:93;24515:3;24426:93;:::i;:::-;24544:2;24539:3;24535:12;24528:19;;24187:366;;;:::o;24559:419::-;24725:4;24763:2;24752:9;24748:18;24740:26;;24812:9;24806:4;24802:20;24798:1;24787:9;24783:17;24776:47;24840:131;24966:4;24840:131;:::i;:::-;24832:139;;24559:419;;;:::o;24984:163::-;25124:15;25120:1;25112:6;25108:14;25101:39;24984:163;:::o;25153:366::-;25295:3;25316:67;25380:2;25375:3;25316:67;:::i;:::-;25309:74;;25392:93;25481:3;25392:93;:::i;:::-;25510:2;25505:3;25501:12;25494:19;;25153:366;;;:::o;25525:419::-;25691:4;25729:2;25718:9;25714:18;25706:26;;25778:9;25772:4;25768:20;25764:1;25753:9;25749:17;25742:47;25806:131;25932:4;25806:131;:::i;:::-;25798:139;;25525:419;;;:::o;25950:179::-;26090:31;26086:1;26078:6;26074:14;26067:55;25950:179;:::o;26135:366::-;26277:3;26298:67;26362:2;26357:3;26298:67;:::i;:::-;26291:74;;26374:93;26463:3;26374:93;:::i;:::-;26492:2;26487:3;26483:12;26476:19;;26135:366;;;:::o;26507:419::-;26673:4;26711:2;26700:9;26696:18;26688:26;;26760:9;26754:4;26750:20;26746:1;26735:9;26731:17;26724:47;26788:131;26914:4;26788:131;:::i;:::-;26780:139;;26507:419;;;:::o;26932:240::-;27072:34;27068:1;27060:6;27056:14;27049:58;27141:23;27136:2;27128:6;27124:15;27117:48;26932:240;:::o;27178:366::-;27320:3;27341:67;27405:2;27400:3;27341:67;:::i;:::-;27334:74;;27417:93;27506:3;27417:93;:::i;:::-;27535:2;27530:3;27526:12;27519:19;;27178:366;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27550:419;;;:::o;27975:171::-;28115:23;28111:1;28103:6;28099:14;28092:47;27975:171;:::o;28152:366::-;28294:3;28315:67;28379:2;28374:3;28315:67;:::i;:::-;28308:74;;28391:93;28480:3;28391:93;:::i;:::-;28509:2;28504:3;28500:12;28493:19;;28152:366;;;:::o;28524:419::-;28690:4;28728:2;28717:9;28713:18;28705:26;;28777:9;28771:4;28767:20;28763:1;28752:9;28748:17;28741:47;28805:131;28931:4;28805:131;:::i;:::-;28797:139;;28524:419;;;:::o;28949:148::-;29051:11;29088:3;29073:18;;28949:148;;;;:::o;29127:874::-;29230:3;29267:5;29261:12;29296:36;29322:9;29296:36;:::i;:::-;29348:89;29430:6;29425:3;29348:89;:::i;:::-;29341:96;;29468:1;29457:9;29453:17;29484:1;29479:166;;;;29659:1;29654:341;;;;29446:549;;29479:166;29563:4;29559:9;29548;29544:25;29539:3;29532:38;29625:6;29618:14;29611:22;29603:6;29599:35;29594:3;29590:45;29583:52;;29479:166;;29654:341;29721:38;29753:5;29721:38;:::i;:::-;29781:1;29795:154;29809:6;29806:1;29803:13;29795:154;;;29883:7;29877:14;29873:1;29868:3;29864:11;29857:35;29933:1;29924:7;29920:15;29909:26;;29831:4;29828:1;29824:12;29819:17;;29795:154;;;29978:6;29973:3;29969:16;29962:23;;29661:334;;29446:549;;29234:767;;29127:874;;;;:::o;30007:390::-;30113:3;30141:39;30174:5;30141:39;:::i;:::-;30196:89;30278:6;30273:3;30196:89;:::i;:::-;30189:96;;30294:65;30352:6;30347:3;30340:4;30333:5;30329:16;30294:65;:::i;:::-;30384:6;30379:3;30375:16;30368:23;;30117:280;30007:390;;;;:::o;30403:429::-;30580:3;30602:92;30690:3;30681:6;30602:92;:::i;:::-;30595:99;;30711:95;30802:3;30793:6;30711:95;:::i;:::-;30704:102;;30823:3;30816:10;;30403:429;;;;;:::o;30838:225::-;30978:34;30974:1;30966:6;30962:14;30955:58;31047:8;31042:2;31034:6;31030:15;31023:33;30838:225;:::o;31069:366::-;31211:3;31232:67;31296:2;31291:3;31232:67;:::i;:::-;31225:74;;31308:93;31397:3;31308:93;:::i;:::-;31426:2;31421:3;31417:12;31410:19;;31069:366;;;:::o;31441:419::-;31607:4;31645:2;31634:9;31630:18;31622:26;;31694:9;31688:4;31684:20;31680:1;31669:9;31665:17;31658:47;31722:131;31848:4;31722:131;:::i;:::-;31714:139;;31441:419;;;:::o;31866:173::-;32006:25;32002:1;31994:6;31990:14;31983:49;31866:173;:::o;32045:366::-;32187:3;32208:67;32272:2;32267:3;32208:67;:::i;:::-;32201:74;;32284:93;32373:3;32284:93;:::i;:::-;32402:2;32397:3;32393:12;32386:19;;32045:366;;;:::o;32417:419::-;32583:4;32621:2;32610:9;32606:18;32598:26;;32670:9;32664:4;32660:20;32656:1;32645:9;32641:17;32634:47;32698:131;32824:4;32698:131;:::i;:::-;32690:139;;32417:419;;;:::o;32842:332::-;32963:4;33001:2;32990:9;32986:18;32978:26;;33014:71;33082:1;33071:9;33067:17;33058:6;33014:71;:::i;:::-;33095:72;33163:2;33152:9;33148:18;33139:6;33095:72;:::i;:::-;32842:332;;;;;:::o;33180:137::-;33234:5;33265:6;33259:13;33250:22;;33281:30;33305:5;33281:30;:::i;:::-;33180:137;;;;:::o;33323:345::-;33390:6;33439:2;33427:9;33418:7;33414:23;33410:32;33407:119;;;33445:79;;:::i;:::-;33407:119;33565:1;33590:61;33643:7;33634:6;33623:9;33619:22;33590:61;:::i;:::-;33580:71;;33536:125;33323:345;;;;:::o;33674:182::-;33814:34;33810:1;33802:6;33798:14;33791:58;33674:182;:::o;33862:366::-;34004:3;34025:67;34089:2;34084:3;34025:67;:::i;:::-;34018:74;;34101:93;34190:3;34101:93;:::i;:::-;34219:2;34214:3;34210:12;34203:19;;33862:366;;;:::o;34234:419::-;34400:4;34438:2;34427:9;34423:18;34415:26;;34487:9;34481:4;34477:20;34473:1;34462:9;34458:17;34451:47;34515:131;34641:4;34515:131;:::i;:::-;34507:139;;34234:419;;;:::o;34659:233::-;34698:3;34721:24;34739:5;34721:24;:::i;:::-;34712:33;;34767:66;34760:5;34757:77;34754:103;;34837:18;;:::i;:::-;34754:103;34884:1;34877:5;34873:13;34866:20;;34659:233;;;:::o;34898:180::-;34946:77;34943:1;34936:88;35043:4;35040:1;35033:15;35067:4;35064:1;35057:15;35084:185;35124:1;35141:20;35159:1;35141:20;:::i;:::-;35136:25;;35175:20;35193:1;35175:20;:::i;:::-;35170:25;;35214:1;35204:35;;35219:18;;:::i;:::-;35204:35;35261:1;35258;35254:9;35249:14;;35084:185;;;;:::o;35275:176::-;35307:1;35324:20;35342:1;35324:20;:::i;:::-;35319:25;;35358:20;35376:1;35358:20;:::i;:::-;35353:25;;35397:1;35387:35;;35402:18;;:::i;:::-;35387:35;35443:1;35440;35436:9;35431:14;;35275:176;;;;:::o;35457:180::-;35505:77;35502:1;35495:88;35602:4;35599:1;35592:15;35626:4;35623:1;35616:15;35643:98;35694:6;35728:5;35722:12;35712:22;;35643:98;;;:::o;35747:168::-;35830:11;35864:6;35859:3;35852:19;35904:4;35899:3;35895:14;35880:29;;35747:168;;;;:::o;35921:373::-;36007:3;36035:38;36067:5;36035:38;:::i;:::-;36089:70;36152:6;36147:3;36089:70;:::i;:::-;36082:77;;36168:65;36226:6;36221:3;36214:4;36207:5;36203:16;36168:65;:::i;:::-;36258:29;36280:6;36258:29;:::i;:::-;36253:3;36249:39;36242:46;;36011:283;35921:373;;;;:::o;36300:640::-;36495:4;36533:3;36522:9;36518:19;36510:27;;36547:71;36615:1;36604:9;36600:17;36591:6;36547:71;:::i;:::-;36628:72;36696:2;36685:9;36681:18;36672:6;36628:72;:::i;:::-;36710;36778:2;36767:9;36763:18;36754:6;36710:72;:::i;:::-;36829:9;36823:4;36819:20;36814:2;36803:9;36799:18;36792:48;36857:76;36928:4;36919:6;36857:76;:::i;:::-;36849:84;;36300:640;;;;;;;:::o;36946:141::-;37002:5;37033:6;37027:13;37018:22;;37049:32;37075:5;37049:32;:::i;:::-;36946:141;;;;:::o;37093:349::-;37162:6;37211:2;37199:9;37190:7;37186:23;37182:32;37179:119;;;37217:79;;:::i;:::-;37179:119;37337:1;37362:63;37417:7;37408:6;37397:9;37393:22;37362:63;:::i;:::-;37352:73;;37308:127;37093:349;;;;:::o

Swarm Source

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