ETH Price: $3,090.49 (+0.94%)
Gas: 5 Gwei

Token

Lost Box - Invasion (LBI)
 

Overview

Max Total Supply

712 LBI

Holders

56

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 LBI
0x42927f6c4c539ba7e7a49c1cc96e5ef2f21a8873
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:
LostBox

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-31
*/

// 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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _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; 
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            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) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

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

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

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

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

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

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

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

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

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

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

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

    modifier onlyAllowedOperator() virtual {

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

pragma solidity ^0.8.13;

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

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

pragma solidity ^0.8.13;

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

pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {

    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.16;

contract LostBox is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{

string public CONTRACT_URI = "https://api.lostbox.xyz/";

    mapping(address => uint) public userHasMinted;

    bool public REVEALED;

    string public UNREVEALED_URI = "https://api.lostbox.xyz/";

    string public BASE_URI = "https://api.lostbox.xyz/";

    bool public isPublicMintEnabled = false;

    uint public COLLECTION_SIZE = 4444;

    uint public MINT_PRICE = 0.0021 ether;

    uint public MAX_BATCH_SIZE = 52;

    uint public SUPPLY_PER_WALLET = 52;

    uint public FREE_SUPPLY_PER_WALLET = 1;

    constructor() ERC721A("Lost Box - Invasion", "LBI") {}

    function MintFreeSupporters(uint256 quantity, address receiver) public onlyOwner {
    require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "Boxes out of 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, "Public sale has not begun yet");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "Boxes out of stock");

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

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint quanity over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send enough eth for public mint");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

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

    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

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

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

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

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

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

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

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

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

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

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"MintFreeSupporters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_COLLECTION_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_FREE_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_MAX_BATCH_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_SUPPLY_PER_WALLET","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"}]

60806040526040518060400160405280601881526020017f68747470733a2f2f6170692e6c6f7374626f782e78797a2f0000000000000000815250600a90816200004a919062000751565b506040518060400160405280601881526020017f68747470733a2f2f6170692e6c6f7374626f782e78797a2f0000000000000000815250600d908162000091919062000751565b506040518060400160405280601881526020017f68747470733a2f2f6170692e6c6f7374626f782e78797a2f0000000000000000815250600e9081620000d8919062000751565b506000600f60006101000a81548160ff02191690831515021790555061115c601055660775f05a0740006011556034601255603460135560016014553480156200012157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601381526020017f4c6f737420426f78202d20496e766173696f6e000000000000000000000000008152506040518060400160405280600381526020017f4c42490000000000000000000000000000000000000000000000000000000000815250620001c5620001b96200040660201b60201c565b6200040e60201b60201c565b8160039081620001d6919062000751565b508060049081620001e8919062000751565b50620001f9620004d260201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003fe578015620002c4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200028a9291906200087d565b600060405180830381600087803b158015620002a557600080fd5b505af1158015620002ba573d6000803e3d6000fd5b50505050620003fd565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200037e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620003449291906200087d565b600060405180830381600087803b1580156200035f57600080fd5b505af115801562000374573d6000803e3d6000fd5b50505050620003fc565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003c79190620008aa565b600060405180830381600087803b158015620003e257600080fd5b505af1158015620003f7573d6000803e3d6000fd5b505050505b5b5b5050620008c7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055957607f821691505b6020821081036200056f576200056e62000511565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200059a565b620005e586836200059a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006326200062c6200062684620005fd565b62000607565b620005fd565b9050919050565b6000819050919050565b6200064e8362000611565b620006666200065d8262000639565b848454620005a7565b825550505050565b600090565b6200067d6200066e565b6200068a81848462000643565b505050565b5b81811015620006b257620006a660008262000673565b60018101905062000690565b5050565b601f8211156200070157620006cb8162000575565b620006d6846200058a565b81016020851015620006e6578190505b620006fe620006f5856200058a565b8301826200068f565b50505b505050565b600082821c905092915050565b6000620007266000198460080262000706565b1980831691505092915050565b600062000741838362000713565b9150826002028217905092915050565b6200075c82620004d7565b67ffffffffffffffff811115620007785762000777620004e2565b5b62000784825462000540565b62000791828285620006b6565b600060209050601f831160018114620007c95760008415620007b4578287015190505b620007c0858262000733565b86555062000830565b601f198416620007d98662000575565b60005b828110156200080357848901518255600182019150602085019450602081019050620007dc565b868310156200082357848901516200081f601f89168262000713565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008658262000838565b9050919050565b620008778162000858565b82525050565b60006040820190506200089460008301856200086c565b620008a360208301846200086c565b9392505050565b6000602082019050620008c160008301846200086c565b92915050565b61407b80620008d76000396000f3fe6080604052600436106102515760003560e01c806391b7f5ed11610139578063c002d23d116100b6578063dbddb26a1161007a578063dbddb26a14610835578063e113ad9514610860578063e757223014610889578063e8a3d485146108c6578063e985e9c5146108f1578063f2fde38b1461092e57610251565b8063c002d23d1461074e578063c87b56dd14610779578063cfdbf254146107b6578063d6dc61f5146107e1578063d8258d951461080a57610251565b8063a22cb465116100fd578063a22cb4651461069e578063a4cdd719146106c7578063a76a9587146106de578063a9527e8214610709578063b88d4fde1461073257610251565b806391b7f5ed146105dc578063938e3d7b1461060557806395d89b411461062e5780639e1f39d614610659578063a0712d681461068257610251565b8063336f5ec3116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806363fa5bde1461053457806370a082311461055d578063715018a61461059a5780638da5cb5b146105b157610251565b8063336f5ec31461040857806342842e0e1461043157806342966c681461044d578063507862d11461047657806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612e32565b610e9e565b005b61044b60048036038101906104469190612f7e565b610eb0565b005b34801561045957600080fd5b50610474600480360381019061046f9190612e32565b610fbc565b005b34801561048257600080fd5b5061048b610fca565b6040516104989190612dda565b60405180910390f35b3480156104ad57600080fd5b506104b6611058565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104e16110e6565b6040516104ee9190612f36565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612e32565b6110ec565b60405161052b9190612ea0565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612e32565b6110fe565b005b34801561056957600080fd5b50610584600480360381019061057f9190612f51565b611110565b6040516105919190612f36565b60405180910390f35b3480156105a657600080fd5b506105af6111c8565b005b3480156105bd57600080fd5b506105c66111dc565b6040516105d39190612ea0565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e32565b611205565b005b34801561061157600080fd5b5061062c60048036038101906106279190613106565b611217565b005b34801561063a57600080fd5b50610643611232565b6040516106509190612dda565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061317b565b6112c4565b005b61069c60048036038101906106979190612e32565b6112fa565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906131d7565b611747565b005b3480156106d357600080fd5b506106dc611852565b005b3480156106ea57600080fd5b506106f3611886565b6040516107009190612c96565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612e32565b611899565b005b61074c600480360381019061074791906132b8565b6118ab565b005b34801561075a57600080fd5b506107636119b9565b6040516107709190612f36565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190612e32565b6119bf565b6040516107ad9190612dda565b60405180910390f35b3480156107c257600080fd5b506107cb611a9b565b6040516107d89190612f36565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061333b565b611aa1565b005b34801561081657600080fd5b5061081f611b0e565b60405161082c9190612f36565b60405180910390f35b34801561084157600080fd5b5061084a611b14565b6040516108579190612dda565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190612e32565b611ba2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612e32565b611bb4565b6040516108bd9190612f36565b60405180910390f35b3480156108d257600080fd5b506108db611c3e565b6040516108e89190612dda565b60405180910390f35b3480156108fd57600080fd5b506109186004803603810190610913919061337b565b611cd0565b6040516109259190612c96565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190612f51565b611d64565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826110ec565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cd0565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b610ea6612175565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fac576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f2792919061341b565b6020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613459565b610fab57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fa29190612ea0565b60405180910390fd5b5b610fb78383836121f3565b505050565b610fc7816001612213565b50565b600d8054610fd7906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906133ea565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505081565b600a8054611065906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906133ea565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b505050505081565b60135481565b60006110f782612465565b9050919050565b611106612175565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611177576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111d0612175565b6111da6000612531565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61120d612175565b8060118190555050565b61121f612175565b80600a908161122e9190613750565b5050565b606060048054611241906133ea565b80601f016020809104026020016040519081016040528092919081815260200182805461126d906133ea565b80156112ba5780601f1061128f576101008083540402835291602001916112ba565b820191906000526020600020905b81548152906001019060200180831161129d57829003601f168201915b5050505050905090565b6112cc612175565b80600e90816112db9190613750565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f9061386e565b60405180910390fd5b6002600954036113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a4906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461140591906138bd565b90508083106114bc57808361141a91906138bd565b60115461142791906138f1565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611474919061394b565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061154f565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150b919061394b565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906139cb565b60405180910390fd5b601054836115aa610c57565b6115b4919061394b565b11156115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613a37565b60405180910390fd5b6013548361160233611110565b61160c919061394b565b111561164d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164490613ac9565b60405180910390fd5b601254831115611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613b5b565b60405180910390fd5b813410156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613bed565b60405180910390fd5b6116df33846125f5565b8134111561173a573373ffffffffffffffffffffffffffffffffffffffff166108fc833461170d91906138bd565b9081150290604051600060405180830381858888f19350505050158015611738573d6000803e3d6000fd5b505b5050600160098190555050565b8060086000611754611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611801611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118469190612c96565b60405180910390a35050565b61185a612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6118a1612175565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119a7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161192292919061341b565b6020604051808303816000875af1158015611941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119659190613459565b6119a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161199d9190612ea0565b60405180910390fd5b5b6119b384848484612613565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611a0857600e6119e183612686565b6040516020016119f2929190613ccc565b6040516020818303038152906040529050611a96565b600d8054611a15906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a41906133ea565b8015611a8e5780601f10611a6357610100808354040283529160200191611a8e565b820191906000526020600020905b815481529060010190602001808311611a7157829003601f168201915b505050505090505b919050565b60125481565b611aa9612175565b60105482611ab5610c57565b611abf919061394b565b1115611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790613d3c565b60405180910390fd5b611b0a81836125f5565b5050565b60105481565b600e8054611b21906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4d906133ea565b8015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b611baa612175565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611c0691906138bd565b9050808410611c2f578084611c1b91906138bd565b601154611c2891906138f1565b9150611c34565b600091505b8192505050919050565b6060600a8054611c4d906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c79906133ea565b8015611cc65780601f10611c9b57610100808354040283529160200191611cc6565b820191906000526020600020905b815481529060010190602001808311611ca957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d6c612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613dce565b60405180910390fd5b611de481612531565b50565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612465565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cd0565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b6111dc565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613e3a565b60405180910390fd5b565b61220e838383604051806020016040528060008152506118ab565b505050565b600061221e83612465565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cd0565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b60008082905080612474611e4e565b116124fa576001548110156124f95760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124f7575b600081036124ed5760056000836001900393508381526020019081526020016000205490506124c3565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61260f8282604051806020016040528060008152506128b8565b5050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e5a565b915050600a826126f89190613ed1565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a612fdb565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da5760018261276691906138bd565b9150600a856127759190613f02565b6030612781919061394b565b60f81b81838151811061279757612796613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613ed1565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613fb7565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190614018565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61301382612d90565b810181811067ffffffffffffffff8211171561303257613031612fdb565b5b80604052505050565b6000613045612cb1565b9050613051828261300a565b919050565b600067ffffffffffffffff82111561307157613070612fdb565b5b61307a82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130a96130a484613056565b61303b565b9050828152602081018484840111156130c5576130c4612fd6565b5b6130d0848285613087565b509392505050565b600082601f8301126130ed576130ec612fd1565b5b81356130fd848260208601613096565b91505092915050565b60006020828403121561311c5761311b612cbb565b5b600082013567ffffffffffffffff81111561313a57613139612cc0565b5b613146848285016130d8565b91505092915050565b61315881612c7b565b811461316357600080fd5b50565b6000813590506131758161314f565b92915050565b6000806040838503121561319257613191612cbb565b5b60006131a085828601613166565b925050602083013567ffffffffffffffff8111156131c1576131c0612cc0565b5b6131cd858286016130d8565b9150509250929050565b600080604083850312156131ee576131ed612cbb565b5b60006131fc85828601612ed2565b925050602061320d85828601613166565b9150509250929050565b600067ffffffffffffffff82111561323257613231612fdb565b5b61323b82612d90565b9050602081019050919050565b600061325b61325684613217565b61303b565b90508281526020810184848401111561327757613276612fd6565b5b613282848285613087565b509392505050565b600082601f83011261329f5761329e612fd1565b5b81356132af848260208601613248565b91505092915050565b600080600080608085870312156132d2576132d1612cbb565b5b60006132e087828801612ed2565b94505060206132f187828801612ed2565b935050604061330287828801612e1d565b925050606085013567ffffffffffffffff81111561332357613322612cc0565b5b61332f8782880161328a565b91505092959194509250565b6000806040838503121561335257613351612cbb565b5b600061336085828601612e1d565b925050602061337185828601612ed2565b9150509250929050565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161314f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c9565b61361086836135c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061364d61364861364384612dfc565b613628565b612dfc565b9050919050565b6000819050919050565b61366783613632565b61367b61367382613654565b8484546135d6565b825550505050565b600090565b613690613683565b61369b81848461365e565b505050565b5b818110156136bf576136b4600082613688565b6001810190506136a1565b5050565b601f821115613704576136d5816135a4565b6136de846135b9565b810160208510156136ed578190505b6137016136f9856135b9565b8301826136a0565b50505b505050565b600082821c905092915050565b600061372760001984600802613709565b1980831691505092915050565b60006137408383613716565b9150826002028217905092915050565b61375982612d4a565b67ffffffffffffffff81111561377257613771612fdb565b5b61377c82546133ea565b6137878282856136c3565b600060209050601f8311600181146137ba57600084156137a8578287015190505b6137b28582613734565b86555061381a565b601f1984166137c8866135a4565b60005b828110156137f0578489015182556001820191506020850194506020810190506137cb565b8683101561380d5784890151613809601f891682613716565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613858601e83612d55565b915061386382613822565b602082019050919050565b600060208201905081810360008301526138878161384b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c882612dfc565b91506138d383612dfc565b92508282039050818111156138eb576138ea61388e565b5b92915050565b60006138fc82612dfc565b915061390783612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139405761393f61388e565b5b828202905092915050565b600061395682612dfc565b915061396183612dfc565b92508282019050808211156139795761397861388e565b5b92915050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b60006139b5601d83612d55565b91506139c08261397f565b602082019050919050565b600060208201905081810360008301526139e4816139a8565b9050919050565b7f426f786573206f7574206f662073746f636b0000000000000000000000000000600082015250565b6000613a21601283612d55565b9150613a2c826139eb565b602082019050919050565b60006020820190508181036000830152613a5081613a14565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613ab3603183612d55565b9150613abe82613a57565b604082019050919050565b60006020820190508181036000830152613ae281613aa6565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613b45603d83612d55565b9150613b5082613ae9565b604082019050919050565b60006020820190508181036000830152613b7481613b38565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820666f72207075626c69632060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b6000613bd7602483612d55565b9150613be282613b7b565b604082019050919050565b60006020820190508181036000830152613c0681613bca565b9050919050565b600081905092915050565b60008154613c25816133ea565b613c2f8186613c0d565b94506001821660008114613c4a5760018114613c5f57613c92565b60ff1983168652811515820286019350613c92565b613c68856135a4565b60005b83811015613c8a57815481890152600182019150602081019050613c6b565b838801955050505b50505092915050565b6000613ca682612d4a565b613cb08185613c0d565b9350613cc0818560208601612d66565b80840191505092915050565b6000613cd88285613c18565b9150613ce48284613c9b565b91508190509392505050565b7f426f786573206f7574206f662073746f636b2100000000000000000000000000600082015250565b6000613d26601383612d55565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db8602683612d55565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e24602083612d55565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b6000613e6582612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9757613e9661388e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613edc82612dfc565b9150613ee783612dfc565b925082613ef757613ef6613ea2565b5b828204905092915050565b6000613f0d82612dfc565b9150613f1883612dfc565b925082613f2857613f27613ea2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f8982613f62565b613f938185613f6d565b9350613fa3818560208601612d66565b613fac81612d90565b840191505092915050565b6000608082019050613fcc6000830187612e91565b613fd96020830186612e91565b613fe66040830185612f27565b8181036060830152613ff88184613f7e565b905095945050505050565b60008151905061401281612cf1565b92915050565b60006020828403121561402e5761402d612cbb565b5b600061403c84828501614003565b9150509291505056fea2646970667358221220929f13e8fd2e9a7fbb52dfa6bf7edbe3c06ede2b27ae1310944e5e582b1dfaec64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806391b7f5ed11610139578063c002d23d116100b6578063dbddb26a1161007a578063dbddb26a14610835578063e113ad9514610860578063e757223014610889578063e8a3d485146108c6578063e985e9c5146108f1578063f2fde38b1461092e57610251565b8063c002d23d1461074e578063c87b56dd14610779578063cfdbf254146107b6578063d6dc61f5146107e1578063d8258d951461080a57610251565b8063a22cb465116100fd578063a22cb4651461069e578063a4cdd719146106c7578063a76a9587146106de578063a9527e8214610709578063b88d4fde1461073257610251565b806391b7f5ed146105dc578063938e3d7b1461060557806395d89b411461062e5780639e1f39d614610659578063a0712d681461068257610251565b8063336f5ec3116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806363fa5bde1461053457806370a082311461055d578063715018a61461059a5780638da5cb5b146105b157610251565b8063336f5ec31461040857806342842e0e1461043157806342966c681461044d578063507862d11461047657806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612e32565b610e9e565b005b61044b60048036038101906104469190612f7e565b610eb0565b005b34801561045957600080fd5b50610474600480360381019061046f9190612e32565b610fbc565b005b34801561048257600080fd5b5061048b610fca565b6040516104989190612dda565b60405180910390f35b3480156104ad57600080fd5b506104b6611058565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104e16110e6565b6040516104ee9190612f36565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612e32565b6110ec565b60405161052b9190612ea0565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612e32565b6110fe565b005b34801561056957600080fd5b50610584600480360381019061057f9190612f51565b611110565b6040516105919190612f36565b60405180910390f35b3480156105a657600080fd5b506105af6111c8565b005b3480156105bd57600080fd5b506105c66111dc565b6040516105d39190612ea0565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e32565b611205565b005b34801561061157600080fd5b5061062c60048036038101906106279190613106565b611217565b005b34801561063a57600080fd5b50610643611232565b6040516106509190612dda565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061317b565b6112c4565b005b61069c60048036038101906106979190612e32565b6112fa565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906131d7565b611747565b005b3480156106d357600080fd5b506106dc611852565b005b3480156106ea57600080fd5b506106f3611886565b6040516107009190612c96565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612e32565b611899565b005b61074c600480360381019061074791906132b8565b6118ab565b005b34801561075a57600080fd5b506107636119b9565b6040516107709190612f36565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190612e32565b6119bf565b6040516107ad9190612dda565b60405180910390f35b3480156107c257600080fd5b506107cb611a9b565b6040516107d89190612f36565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061333b565b611aa1565b005b34801561081657600080fd5b5061081f611b0e565b60405161082c9190612f36565b60405180910390f35b34801561084157600080fd5b5061084a611b14565b6040516108579190612dda565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190612e32565b611ba2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612e32565b611bb4565b6040516108bd9190612f36565b60405180910390f35b3480156108d257600080fd5b506108db611c3e565b6040516108e89190612dda565b60405180910390f35b3480156108fd57600080fd5b506109186004803603810190610913919061337b565b611cd0565b6040516109259190612c96565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190612f51565b611d64565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826110ec565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cd0565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b610ea6612175565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fac576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f2792919061341b565b6020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613459565b610fab57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fa29190612ea0565b60405180910390fd5b5b610fb78383836121f3565b505050565b610fc7816001612213565b50565b600d8054610fd7906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906133ea565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505081565b600a8054611065906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906133ea565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b505050505081565b60135481565b60006110f782612465565b9050919050565b611106612175565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611177576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111d0612175565b6111da6000612531565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61120d612175565b8060118190555050565b61121f612175565b80600a908161122e9190613750565b5050565b606060048054611241906133ea565b80601f016020809104026020016040519081016040528092919081815260200182805461126d906133ea565b80156112ba5780601f1061128f576101008083540402835291602001916112ba565b820191906000526020600020905b81548152906001019060200180831161129d57829003601f168201915b5050505050905090565b6112cc612175565b80600e90816112db9190613750565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f9061386e565b60405180910390fd5b6002600954036113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a4906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461140591906138bd565b90508083106114bc57808361141a91906138bd565b60115461142791906138f1565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611474919061394b565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061154f565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150b919061394b565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906139cb565b60405180910390fd5b601054836115aa610c57565b6115b4919061394b565b11156115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613a37565b60405180910390fd5b6013548361160233611110565b61160c919061394b565b111561164d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164490613ac9565b60405180910390fd5b601254831115611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613b5b565b60405180910390fd5b813410156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613bed565b60405180910390fd5b6116df33846125f5565b8134111561173a573373ffffffffffffffffffffffffffffffffffffffff166108fc833461170d91906138bd565b9081150290604051600060405180830381858888f19350505050158015611738573d6000803e3d6000fd5b505b5050600160098190555050565b8060086000611754611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611801611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118469190612c96565b60405180910390a35050565b61185a612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6118a1612175565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119a7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161192292919061341b565b6020604051808303816000875af1158015611941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119659190613459565b6119a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161199d9190612ea0565b60405180910390fd5b5b6119b384848484612613565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611a0857600e6119e183612686565b6040516020016119f2929190613ccc565b6040516020818303038152906040529050611a96565b600d8054611a15906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a41906133ea565b8015611a8e5780601f10611a6357610100808354040283529160200191611a8e565b820191906000526020600020905b815481529060010190602001808311611a7157829003601f168201915b505050505090505b919050565b60125481565b611aa9612175565b60105482611ab5610c57565b611abf919061394b565b1115611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af790613d3c565b60405180910390fd5b611b0a81836125f5565b5050565b60105481565b600e8054611b21906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4d906133ea565b8015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b611baa612175565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611c0691906138bd565b9050808410611c2f578084611c1b91906138bd565b601154611c2891906138f1565b9150611c34565b600091505b8192505050919050565b6060600a8054611c4d906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c79906133ea565b8015611cc65780601f10611c9b57610100808354040283529160200191611cc6565b820191906000526020600020905b815481529060010190602001808311611ca957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d6c612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613dce565b60405180910390fd5b611de481612531565b50565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612465565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cd0565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b6111dc565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613e3a565b60405180910390fd5b565b61220e838383604051806020016040528060008152506118ab565b505050565b600061221e83612465565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cd0565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b60008082905080612474611e4e565b116124fa576001548110156124f95760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124f7575b600081036124ed5760056000836001900393508381526020019081526020016000205490506124c3565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61260f8282604051806020016040528060008152506128b8565b5050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e5a565b915050600a826126f89190613ed1565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a612fdb565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da5760018261276691906138bd565b9150600a856127759190613f02565b6030612781919061394b565b60f81b81838151811061279757612796613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613ed1565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613fb7565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190614018565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61301382612d90565b810181811067ffffffffffffffff8211171561303257613031612fdb565b5b80604052505050565b6000613045612cb1565b9050613051828261300a565b919050565b600067ffffffffffffffff82111561307157613070612fdb565b5b61307a82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130a96130a484613056565b61303b565b9050828152602081018484840111156130c5576130c4612fd6565b5b6130d0848285613087565b509392505050565b600082601f8301126130ed576130ec612fd1565b5b81356130fd848260208601613096565b91505092915050565b60006020828403121561311c5761311b612cbb565b5b600082013567ffffffffffffffff81111561313a57613139612cc0565b5b613146848285016130d8565b91505092915050565b61315881612c7b565b811461316357600080fd5b50565b6000813590506131758161314f565b92915050565b6000806040838503121561319257613191612cbb565b5b60006131a085828601613166565b925050602083013567ffffffffffffffff8111156131c1576131c0612cc0565b5b6131cd858286016130d8565b9150509250929050565b600080604083850312156131ee576131ed612cbb565b5b60006131fc85828601612ed2565b925050602061320d85828601613166565b9150509250929050565b600067ffffffffffffffff82111561323257613231612fdb565b5b61323b82612d90565b9050602081019050919050565b600061325b61325684613217565b61303b565b90508281526020810184848401111561327757613276612fd6565b5b613282848285613087565b509392505050565b600082601f83011261329f5761329e612fd1565b5b81356132af848260208601613248565b91505092915050565b600080600080608085870312156132d2576132d1612cbb565b5b60006132e087828801612ed2565b94505060206132f187828801612ed2565b935050604061330287828801612e1d565b925050606085013567ffffffffffffffff81111561332357613322612cc0565b5b61332f8782880161328a565b91505092959194509250565b6000806040838503121561335257613351612cbb565b5b600061336085828601612e1d565b925050602061337185828601612ed2565b9150509250929050565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161314f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c9565b61361086836135c9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061364d61364861364384612dfc565b613628565b612dfc565b9050919050565b6000819050919050565b61366783613632565b61367b61367382613654565b8484546135d6565b825550505050565b600090565b613690613683565b61369b81848461365e565b505050565b5b818110156136bf576136b4600082613688565b6001810190506136a1565b5050565b601f821115613704576136d5816135a4565b6136de846135b9565b810160208510156136ed578190505b6137016136f9856135b9565b8301826136a0565b50505b505050565b600082821c905092915050565b600061372760001984600802613709565b1980831691505092915050565b60006137408383613716565b9150826002028217905092915050565b61375982612d4a565b67ffffffffffffffff81111561377257613771612fdb565b5b61377c82546133ea565b6137878282856136c3565b600060209050601f8311600181146137ba57600084156137a8578287015190505b6137b28582613734565b86555061381a565b601f1984166137c8866135a4565b60005b828110156137f0578489015182556001820191506020850194506020810190506137cb565b8683101561380d5784890151613809601f891682613716565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613858601e83612d55565b915061386382613822565b602082019050919050565b600060208201905081810360008301526138878161384b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c882612dfc565b91506138d383612dfc565b92508282039050818111156138eb576138ea61388e565b5b92915050565b60006138fc82612dfc565b915061390783612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139405761393f61388e565b5b828202905092915050565b600061395682612dfc565b915061396183612dfc565b92508282019050808211156139795761397861388e565b5b92915050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b60006139b5601d83612d55565b91506139c08261397f565b602082019050919050565b600060208201905081810360008301526139e4816139a8565b9050919050565b7f426f786573206f7574206f662073746f636b0000000000000000000000000000600082015250565b6000613a21601283612d55565b9150613a2c826139eb565b602082019050919050565b60006020820190508181036000830152613a5081613a14565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613ab3603183612d55565b9150613abe82613a57565b604082019050919050565b60006020820190508181036000830152613ae281613aa6565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613b45603d83612d55565b9150613b5082613ae9565b604082019050919050565b60006020820190508181036000830152613b7481613b38565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820666f72207075626c69632060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b6000613bd7602483612d55565b9150613be282613b7b565b604082019050919050565b60006020820190508181036000830152613c0681613bca565b9050919050565b600081905092915050565b60008154613c25816133ea565b613c2f8186613c0d565b94506001821660008114613c4a5760018114613c5f57613c92565b60ff1983168652811515820286019350613c92565b613c68856135a4565b60005b83811015613c8a57815481890152600182019150602081019050613c6b565b838801955050505b50505092915050565b6000613ca682612d4a565b613cb08185613c0d565b9350613cc0818560208601612d66565b80840191505092915050565b6000613cd88285613c18565b9150613ce48284613c9b565b91508190509392505050565b7f426f786573206f7574206f662073746f636b2100000000000000000000000000600082015250565b6000613d26601383612d55565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db8602683612d55565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e24602083612d55565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b6000613e6582612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9757613e9661388e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613edc82612dfc565b9150613ee783612dfc565b925082613ef757613ef6613ea2565b5b828204905092915050565b6000613f0d82612dfc565b9150613f1883612dfc565b925082613f2857613f27613ea2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f8982613f62565b613f938185613f6d565b9350613fa3818560208601612d66565b613fac81612d90565b840191505092915050565b6000608082019050613fcc6000830187612e91565b613fd96020830186612e91565b613fe66040830185612f27565b8181036060830152613ff88184613f7e565b905095945050505050565b60008151905061401281612cf1565b92915050565b60006020828403121561402e5761402d612cbb565b5b600061403c84828501614003565b9150509291505056fea2646970667358221220929f13e8fd2e9a7fbb52dfa6bf7edbe3c06ede2b27ae1310944e5e582b1dfaec64736f6c63430008100033

Deployed Bytecode Sourcemap

35469:4841:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35842:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15776:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16028:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19604:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19188:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36062:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14139:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35633:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39312:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38048:191;;;;;;;;;;;;;:::i;:::-;;39203:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39505:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35340:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35716:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35569:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36019:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16676:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38747:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14604:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1888:103;;;;;;;;;;;;;:::i;:::-;;1653:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38858:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38624:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16136:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38365:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36898:1142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19830:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38247:110;;;;;;;;;;;;;:::i;:::-;;35687:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38963:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39706:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35933:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39964:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35979:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36171:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35890:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35782:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39088:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36566:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38519:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20072:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2001:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35842:39;;;;;;;;;;;;;:::o;15776:244::-;15861:4;15915:10;15900:25;;:11;:25;;;;:68;;;;15958:10;15943:25;;:11;:25;;;;15900:68;:111;;;;16001:10;15986:25;;:11;:25;;;;15900:111;15880:131;;15776:244;;;:::o;16028:100::-;16082:13;16115:5;16108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16028:100;:::o;19604:218::-;19680:7;19705:16;19713:7;19705;:16::i;:::-;19700:64;;19730:34;;;;;;;;;;;;;;19700:64;19784:15;:24;19800:7;19784:24;;;;;;;;;;;:30;;;;;;;;;;;;19777:37;;19604:218;;;:::o;19188:408::-;19277:13;19293:16;19301:7;19293;:16::i;:::-;19277:32;;19349:5;19326:28;;:19;:17;:19::i;:::-;:28;;;19322:175;;19374:44;19391:5;19398:19;:17;:19::i;:::-;19374:16;:44::i;:::-;19369:128;;19446:35;;;;;;;;;;;;;;19369:128;19322:175;19542:2;19509:15;:24;19525:7;19509:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;19580:7;19576:2;19560:28;;19569:5;19560:28;;;;;;;;;;;;19266:330;19188:408;;:::o;36062:38::-;;;;:::o;14139:180::-;14200:7;14285:15;:13;:15::i;:::-;14270:12;;14254:13;;:28;:46;14247:53;;14139:180;:::o;35633:45::-;;;;;;;;;;;;;;;;;:::o;39312:185::-;32572:1;31783:42;32526:43;;;:47;32522:225;;;31783:42;32595:40;;;32644:4;32651:10;32595:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32590:146;;32709:10;32690:30;;;;;;;;;;;:::i;:::-;;;;;;;;32590:146;32522:225;39452:37:::1;39471:4;39477:2;39481:7;39452:18;:37::i;:::-;39312:185:::0;;;:::o;38048:191::-;1612:13;:11;:13::i;:::-;2562:1:::1;2782:7;;:19:::0;2774:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2562:1;2915:7;:18;;;;38117:12:::2;38135:10;:15;;38158:21;38135:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38116:68;;;38203:7;38195:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;38105:134;2518:1:::1;2960:7;:22;;;;38048:191::o:0;39203:101::-;1612:13;:11;:13::i;:::-;39292:4:::1;39275:14;:21;;;;39203:101:::0;:::o;39505:193::-;32572:1;31783:42;32526:43;;;:47;32522:225;;;31783:42;32595:40;;;32644:4;32651:10;32595:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32590:146;;32709:10;32690:30;;;;;;;;;;;:::i;:::-;;;;;;;;32590:146;32522:225;39649:41:::1;39672:4;39678:2;39682:7;39649:22;:41::i;:::-;39505:193:::0;;;:::o;35340:94::-;35406:20;35412:7;35421:4;35406:5;:20::i;:::-;35340:94;:::o;35716:57::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35569:55::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36019:34::-;;;;:::o;16676:152::-;16748:7;16791:27;16810:7;16791:18;:27::i;:::-;16768:52;;16676:152;;;:::o;38747:103::-;1612:13;:11;:13::i;:::-;38838:4:::1;38820:15;:22;;;;38747:103:::0;:::o;14604:233::-;14676:7;14717:1;14700:19;;:5;:19;;;14696:60;;14728:28;;;;;;;;;;;;;;14696:60;12412:13;14774:18;:25;14793:5;14774:25;;;;;;;;;;;;;;;;:55;14767:62;;14604:233;;;:::o;1888:103::-;1612:13;:11;:13::i;:::-;1953:30:::1;1980:1;1953:18;:30::i;:::-;1888:103::o:0;1653:87::-;1699:7;1726:6;;;;;;;;;;;1719:13;;1653:87;:::o;38858:97::-;1612:13;:11;:13::i;:::-;38938:9:::1;38925:10;:22;;;;38858:97:::0;:::o;38624:115::-;1612:13;:11;:13::i;:::-;38719:12:::1;38704;:27;;;;;;:::i;:::-;;38624:115:::0;:::o;16136:104::-;16192:13;16225:7;16218:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16136:104;:::o;38365:146::-;1612:13;:11;:13::i;:::-;38464:8:::1;38453;:19;;;;;;:::i;:::-;;38494:9;38483:8;;:20;;;;;;;;;;;;;;;;;;38365:146:::0;;:::o;36898:1142::-;36493:10;36480:23;;:9;:23;;;36472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2562:1:::1;2782:7;;:19:::0;2774:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2562:1;2915:7;:18;;;;37023:10:::2;37044:9:::0;37081:13:::2;:25;37095:10;37081:25;;;;;;;;;;;;;;;;37056:22;;:50;;;;:::i;:::-;37044:62;;37133:4;37121:8;:16;37117:285;;37189:4;37178:8;:15;;;;:::i;:::-;37163:10;;37162:32;;;;:::i;:::-;37154:40;;37265:4;37237:13;:25;37251:10;37237:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;37209:13;:25;37223:10;37209:25;;;;;;;;;;;;;;;:60;;;;37117:285;;;37310:1;37302:9;;37382:8;37354:13;:25;37368:10;37354:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;37326:13;:25;37340:10;37326:25;;;;;;;;;;;;;;;:64;;;;37117:285;37422:19;;;;;;;;;;;37414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37522:15;;37510:8;37494:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37486:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37617:17;;37605:8;37581:21;37591:10;37581:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;37573:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37721:14;;37709:8;:26;;37701:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37833:5;37820:9;:18;;37812:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37892:31;37902:10;37914:8;37892:9;:31::i;:::-;37952:5;37940:9;:17;37936:97;;;37982:10;37974:28;;:47;38015:5;38003:9;:17;;;;:::i;:::-;37974:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;37936:97;37012:1028;;2518:1:::1;2960:7;:22;;;;36898:1142:::0;:::o;19830:234::-;19977:8;19925:18;:39;19944:19;:17;:19::i;:::-;19925:39;;;;;;;;;;;;;;;:49;19965:8;19925:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20037:8;20001:55;;20016:19;:17;:19::i;:::-;20001:55;;;20047:8;20001:55;;;;;;:::i;:::-;;;;;;;;19830:234;;:::o;38247:110::-;1612:13;:11;:13::i;:::-;38330:19:::1;;;;;;;;;;;38329:20;38307:19;;:42;;;;;;;;;;;;;;;;;;38247:110::o:0;35687:20::-;;;;;;;;;;;;;:::o;38963:117::-;1612:13;:11;:13::i;:::-;39068:4:::1;39043:22;:29;;;;38963:117:::0;:::o;39706:250::-;32572:1;31783:42;32526:43;;;:47;32522:225;;;31783:42;32595:40;;;32644:4;32651:10;32595:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32590:146;;32709:10;32690:30;;;;;;;;;;;:::i;:::-;;;;;;;;32590:146;32522:225;39901:47:::1;39924:4;39930:2;39934:7;39943:4;39901:22;:47::i;:::-;39706:250:::0;;;;:::o;35933:37::-;;;;:::o;39964:341::-;40086:13;40121:8;;;;;;;;;;;40117:181;;;40194:8;40204:26;40221:8;40204:16;:26::i;:::-;40177:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40146:86;;;;40117:181;40272:14;40265:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39964:341;;;;:::o;35979:31::-;;;;:::o;36171:258::-;1612:13;:11;:13::i;:::-;36309:15:::1;;36297:8;36281:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;36259:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;36392:29;36402:8;36412;36392:9;:29::i;:::-;36171:258:::0;;:::o;35890:34::-;;;;:::o;35782:51::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39088:107::-;1612:13;:11;:13::i;:::-;39183:4:::1;39163:17;:24;;;;39088:107:::0;:::o;36566:324::-;36619:4;36635:10;36656:9;36693:13;:25;36707:10;36693:25;;;;;;;;;;;;;;;;36668:22;;:50;;;;:::i;:::-;36656:62;;36745:4;36733:8;:16;36729:131;;36801:4;36790:8;:15;;;;:::i;:::-;36775:10;;36774:32;;;;:::i;:::-;36766:40;;36729:131;;;36847:1;36839:9;;36729:131;36877:5;36870:12;;;;36566:324;;;:::o;38519:97::-;38563:13;38596:12;38589:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38519:97;:::o;20072:164::-;20169:4;20193:18;:25;20212:5;20193:25;;;;;;;;;;;;;;;:35;20219:8;20193:35;;;;;;;;;;;;;;;;;;;;;;;;;20186:42;;20072:164;;;;:::o;2001:201::-;1612:13;:11;:13::i;:::-;2110:1:::1;2090:22;;:8;:22;;::::0;2082:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2166:28;2185:8;2166:18;:28::i;:::-;2001:201:::0;:::o;20244:282::-;20309:4;20365:7;20346:15;:13;:15::i;:::-;:26;;:66;;;;;20399:13;;20389:7;:23;20346:66;:153;;;;;20498:1;12786:8;20450:17;:26;20468:7;20450:26;;;;;;;;;;;;:44;:49;20346:153;20326:173;;20244:282;;;:::o;30808:105::-;30868:7;30895:10;30888:17;;30808:105;:::o;13928:92::-;13984:7;13928:92;:::o;21339:1651::-;21481:27;21511;21530:7;21511:18;:27::i;:::-;21481:57;;21596:4;21555:45;;21571:19;21555:45;;;21551:86;;21609:28;;;;;;;;;;;;;;21551:86;21651:27;21680:23;21707:35;21734:7;21707:26;:35::i;:::-;21650:92;;;;21760:68;21785:15;21802:4;21808:19;:17;:19::i;:::-;21760:24;:68::i;:::-;21755:180;;21848:43;21865:4;21871:19;:17;:19::i;:::-;21848:16;:43::i;:::-;21843:92;;21900:35;;;;;;;;;;;;;;21843:92;21755:180;21966:1;21952:16;;:2;:16;;;21948:52;;21977:23;;;;;;;;;;;;;;21948:52;22013:43;22035:4;22041:2;22045:7;22054:1;22013:21;:43::i;:::-;22096:15;22093:85;;;22161:1;22140:19;22133:30;22093:85;22230:18;:24;22249:4;22230:24;;;;;;;;;;;;;;;;22228:26;;;;;;;;;;;;22272:18;:22;22291:2;22272:22;;;;;;;;;;;;;;;;22270:24;;;;;;;;;;;22341:146;22378:2;22427:45;22442:4;22448:2;22452:19;22427:14;:45::i;:::-;12920:8;22399:73;22341:18;:146::i;:::-;22312:17;:26;22330:7;22312:26;;;;;;;;;;;:175;;;;22559:1;12920:8;22508:19;:47;:52;22504:370;;22581:19;22613:1;22603:7;:11;22581:33;;22673:1;22639:17;:30;22657:11;22639:30;;;;;;;;;;;;:35;22635:224;;22720:13;;22705:11;:28;22701:139;;22797:19;22764:17;:30;22782:11;22764:30;;;;;;;;;;;:52;;;;22701:139;22635:224;22562:312;22504:370;22921:7;22917:2;22902:27;;22911:4;22902:27;;;;;;;;;;;;22940:42;22961:4;22967:2;22971:7;22980:1;22940:20;:42::i;:::-;21470:1520;;;21339:1651;;;:::o;1748:132::-;1823:12;:10;:12::i;:::-;1812:23;;:7;:5;:7::i;:::-;:23;;;1804:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1748:132::o;22998:193::-;23144:39;23161:4;23167:2;23171:7;23144:39;;;;;;;;;;;;:16;:39::i;:::-;22998:193;;;:::o;27994:1863::-;28074:27;28104;28123:7;28104:18;:27::i;:::-;28074:57;;28144:12;28175:19;28144:52;;28210:27;28239:23;28266:35;28293:7;28266:26;:35::i;:::-;28209:92;;;;28318:13;28314:316;;;28439:68;28464:15;28481:4;28487:19;:17;:19::i;:::-;28439:24;:68::i;:::-;28434:184;;28531:43;28548:4;28554:19;:17;:19::i;:::-;28531:16;:43::i;:::-;28526:92;;28583:35;;;;;;;;;;;;;;28526:92;28434:184;28314:316;28642:51;28664:4;28678:1;28682:7;28691:1;28642:21;:51::i;:::-;28786:15;28783:160;;;28926:1;28905:19;28898:30;28783:160;29052:1;12543:3;29022:1;:26;;29021:32;28993:18;:24;29012:4;28993:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;29099:176;29136:4;29207:53;29222:4;29236:1;29240:19;29207:14;:53::i;:::-;12920:8;12786;29160:43;29159:101;29099:18;:176::i;:::-;29070:17;:26;29088:7;29070:26;;;;;;;;;;;:205;;;;29347:1;12920:8;29296:19;:47;:52;29292:370;;29369:19;29401:1;29391:7;:11;29369:33;;29461:1;29427:17;:30;29445:11;29427:30;;;;;;;;;;;;:35;29423:224;;29508:13;;29493:11;:28;29489:139;;29585:19;29552:17;:30;29570:11;29552:30;;;;;;;;;;;:52;;;;29489:139;29423:224;29350:312;29292:370;29717:7;29713:1;29690:35;;29699:4;29690:35;;;;;;;;;;;;29736:50;29757:4;29771:1;29775:7;29784:1;29736:20;:50::i;:::-;29824:12;;:14;;;;;;;;;;;;;28063:1794;;;;27994:1863;;:::o;17383:633::-;17450:7;17470:12;17485:7;17470:22;;17553:4;17534:15;:13;:15::i;:::-;:23;17530:419;;17587:13;;17580:4;:20;17576:373;;;17625:14;17642:17;:23;17660:4;17642:23;;;;;;;;;;;;17625:40;;17722:1;12786:8;17694:6;:24;:29;17690:240;;17754:113;17771:1;17761:6;:11;17754:113;;17814:17;:25;17832:6;;;;;;;17814:25;;;;;;;;;;;;17805:34;;17754:113;;;17900:6;17893:13;;;;;;17690:240;17602:347;17576:373;17530:419;17977:31;;;;;;;;;;;;;;17383:633;;;;:::o;2210:191::-;2284:16;2303:6;;;;;;;;;;;2284:25;;2329:8;2320:6;;:17;;;;;;;;;;;;;;;;;;2384:8;2353:40;;2374:8;2353:40;;;;;;;;;;;;2273:128;2210:191;:::o;27777:112::-;27854:27;27864:2;27868:8;27854:27;;;;;;;;;;;;:9;:27::i;:::-;27777:112;;:::o;23199:407::-;23374:31;23387:4;23393:2;23397:7;23374:12;:31::i;:::-;23438:1;23420:2;:14;;;:19;23416:183;;23459:56;23490:4;23496:2;23500:7;23509:5;23459:30;:56::i;:::-;23454:145;;23543:40;;;;;;;;;;;;;;23454:145;23416:183;23199:407;;;;:::o;3164:534::-;3220:13;3261:1;3252:5;:10;3248:53;;3279:10;;;;;;;;;;;;;;;;;;;;;3248:53;3311:12;3326:5;3311:20;;3342:14;3367:78;3382:1;3374:4;:9;3367:78;;3400:8;;;;;:::i;:::-;;;;3431:2;3423:10;;;;;:::i;:::-;;;3367:78;;;3455:19;3487:6;3477:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3455:39;;3505:154;3521:1;3512:5;:10;3505:154;;3549:1;3539:11;;;;;:::i;:::-;;;3616:2;3608:5;:10;;;;:::i;:::-;3595:2;:24;;;;:::i;:::-;3582:39;;3565:6;3572;3565:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3645:2;3636:11;;;;;:::i;:::-;;;3505:154;;;3683:6;3669:21;;;;;3164:534;;;;:::o;20939:392::-;21041:27;21070:23;21111:38;21152:15;:24;21168:7;21152:24;;;;;;;;;;;21111:65;;21236:18;21213:41;;21293:19;21287:26;21268:45;;21198:126;20939:392;;;:::o;20534:397::-;20683:11;20753:16;20746:5;20742:28;20733:37;;20814:16;20803:9;20799:32;20786:45;;20896:15;20885:9;20882:30;20874:5;20863:9;20860:20;20857:56;20847:66;;20534:397;;;;;:::o;23614:159::-;;;;;:::o;30489:311::-;30624:7;30644:16;12983:3;30670:19;:41;;30644:68;;12983:3;30738:31;30749:4;30755:2;30759:9;30738:10;:31::i;:::-;30730:40;;:62;;30723:69;;;30489:311;;;;;:::o;18398:450::-;18478:14;18646:16;18639:5;18635:28;18626:37;;18823:5;18809:11;18784:23;18780:41;18777:52;18770:5;18767:63;18757:73;;18398:450;;;;:::o;23781:158::-;;;;;:::o;1103:98::-;1156:7;1183:10;1176:17;;1103:98;:::o;27080:689::-;27211:19;27217:2;27221:8;27211:5;:19::i;:::-;27290:1;27272:2;:14;;;:19;27268:483;;27312:11;27326:13;;27312:27;;27358:13;27380:8;27374:3;:14;27358:30;;27407:233;27438:62;27477:1;27481:2;27485:7;;;;;;27494:5;27438:30;:62::i;:::-;27433:167;;27536:40;;;;;;;;;;;;;;27433:167;27635:3;27627:5;:11;27407:233;;27722:3;27705:13;;:20;27701:34;;27727:8;;;27701:34;27293:458;;27268:483;27080:689;;;:::o;23947:716::-;24110:4;24156:2;24131:45;;;24177:19;:17;:19::i;:::-;24198:4;24204:7;24213:5;24131:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;24127:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24431:1;24414:6;:13;:18;24410:235;;24460:40;;;;;;;;;;;;;;24410:235;24603:6;24597:13;24588:6;24584:2;24580:15;24573:38;24127:529;24300:54;;;24290:64;;;:6;:64;;;;24283:71;;;23947:716;;;;;;:::o;30334:147::-;30471:6;30334:147;;;;;:::o;24671:1442::-;24744:20;24767:13;;24744:36;;24807:1;24795:8;:13;24791:44;;24817:18;;;;;;;;;;;;;;24791:44;24848:61;24878:1;24882:2;24886:12;24900:8;24848:21;:61::i;:::-;25018:1;12483:2;24988:1;:26;;24987:32;24975:8;:45;24949:18;:22;24968:2;24949:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;25071:139;25108:2;25162:33;25185:1;25189:2;25193:1;25162:14;:33::i;:::-;25129:30;25150:8;25129:20;:30::i;:::-;:66;25071:18;:139::i;:::-;25037:17;:31;25055:12;25037:31;;;;;;;;;;;:173;;;;25227:16;25258:11;25287:8;25272:12;:23;25258:37;;25362:16;25358:2;25354:25;25342:37;;25582:12;25550:8;25525:1;25476:25;25451:1;25426;25399:215;25694:1;25680:12;25676:20;25634:279;25735:3;25726:7;25723:16;25634:279;;25886:7;25876:8;25873:1;25846:25;25843:1;25840;25835:59;25788:1;25779:7;25775:15;25764:26;;25634:279;;;25638:77;25958:1;25946:8;:13;25942:45;;25968:19;;;;;;;;;;;;;;25942:45;26020:3;26004:13;:19;;;;24922:1113;;26045:60;26074:1;26078:2;26082:12;26096:8;26045:20;:60::i;:::-;24733:1380;24671:1442;;:::o;18856:324::-;18926:14;19159:1;19149:8;19146:15;19120:24;19116:46;19106:56;;18856:324;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:648::-;9164:6;9172;9221:2;9209:9;9200:7;9196:23;9192:32;9189:119;;;9227:79;;:::i;:::-;9189:119;9347:1;9372:50;9414:7;9405:6;9394:9;9390:22;9372:50;:::i;:::-;9362:60;;9318:114;9499:2;9488:9;9484:18;9471:32;9530:18;9522:6;9519:30;9516:117;;;9552:79;;:::i;:::-;9516:117;9657:63;9712:7;9703:6;9692:9;9688:22;9657:63;:::i;:::-;9647:73;;9442:288;9089:648;;;;;:::o;9743:468::-;9808:6;9816;9865:2;9853:9;9844:7;9840:23;9836:32;9833:119;;;9871:79;;:::i;:::-;9833:119;9991:1;10016:53;10061:7;10052:6;10041:9;10037:22;10016:53;:::i;:::-;10006:63;;9962:117;10118:2;10144:50;10186:7;10177:6;10166:9;10162:22;10144:50;:::i;:::-;10134:60;;10089:115;9743:468;;;;;:::o;10217:307::-;10278:4;10368:18;10360:6;10357:30;10354:56;;;10390:18;;:::i;:::-;10354:56;10428:29;10450:6;10428:29;:::i;:::-;10420:37;;10512:4;10506;10502:15;10494:23;;10217:307;;;:::o;10530:423::-;10607:5;10632:65;10648:48;10689:6;10648:48;:::i;:::-;10632:65;:::i;:::-;10623:74;;10720:6;10713:5;10706:21;10758:4;10751:5;10747:16;10796:3;10787:6;10782:3;10778:16;10775:25;10772:112;;;10803:79;;:::i;:::-;10772:112;10893:54;10940:6;10935:3;10930;10893:54;:::i;:::-;10613:340;10530:423;;;;;:::o;10972:338::-;11027:5;11076:3;11069:4;11061:6;11057:17;11053:27;11043:122;;11084:79;;:::i;:::-;11043:122;11201:6;11188:20;11226:78;11300:3;11292:6;11285:4;11277:6;11273:17;11226:78;:::i;:::-;11217:87;;11033:277;10972:338;;;;:::o;11316:943::-;11411:6;11419;11427;11435;11484:3;11472:9;11463:7;11459:23;11455:33;11452:120;;;11491:79;;:::i;:::-;11452:120;11611:1;11636:53;11681:7;11672:6;11661:9;11657:22;11636:53;:::i;:::-;11626:63;;11582:117;11738:2;11764:53;11809:7;11800:6;11789:9;11785:22;11764:53;:::i;:::-;11754:63;;11709:118;11866:2;11892:53;11937:7;11928:6;11917:9;11913:22;11892:53;:::i;:::-;11882:63;;11837:118;12022:2;12011:9;12007:18;11994:32;12053:18;12045:6;12042:30;12039:117;;;12075:79;;:::i;:::-;12039:117;12180:62;12234:7;12225:6;12214:9;12210:22;12180:62;:::i;:::-;12170:72;;11965:287;11316:943;;;;;;;:::o;12265:474::-;12333:6;12341;12390:2;12378:9;12369:7;12365:23;12361:32;12358:119;;;12396:79;;:::i;:::-;12358:119;12516:1;12541:53;12586:7;12577:6;12566:9;12562:22;12541:53;:::i;:::-;12531:63;;12487:117;12643:2;12669:53;12714:7;12705:6;12694:9;12690:22;12669:53;:::i;:::-;12659:63;;12614:118;12265:474;;;;;:::o;12745:::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:166::-;16755:18;16751:1;16743:6;16739:14;16732:42;16615:166;:::o;16787:366::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:419::-;17325:4;17363:2;17352:9;17348:18;17340:26;;17412:9;17406:4;17402:20;17398:1;17387:9;17383:17;17376:47;17440:131;17566:4;17440:131;:::i;:::-;17432:139;;17159:419;;;:::o;17584:141::-;17633:4;17656:3;17648:11;;17679:3;17676:1;17669:14;17713:4;17710:1;17700:18;17692:26;;17584:141;;;:::o;17731:93::-;17768:6;17815:2;17810;17803:5;17799:14;17795:23;17785:33;;17731:93;;;:::o;17830:107::-;17874:8;17924:5;17918:4;17914:16;17893:37;;17830:107;;;;:::o;17943:393::-;18012:6;18062:1;18050:10;18046:18;18085:97;18115:66;18104:9;18085:97;:::i;:::-;18203:39;18233:8;18222:9;18203:39;:::i;:::-;18191:51;;18275:4;18271:9;18264:5;18260:21;18251:30;;18324:4;18314:8;18310:19;18303:5;18300:30;18290:40;;18019:317;;17943:393;;;;;:::o;18342:60::-;18370:3;18391:5;18384:12;;18342:60;;;:::o;18408:142::-;18458:9;18491:53;18509:34;18518:24;18536:5;18518:24;:::i;:::-;18509:34;:::i;:::-;18491:53;:::i;:::-;18478:66;;18408:142;;;:::o;18556:75::-;18599:3;18620:5;18613:12;;18556:75;;;:::o;18637:269::-;18747:39;18778:7;18747:39;:::i;:::-;18808:91;18857:41;18881:16;18857:41;:::i;:::-;18849:6;18842:4;18836:11;18808:91;:::i;:::-;18802:4;18795:105;18713:193;18637:269;;;:::o;18912:73::-;18957:3;18912:73;:::o;18991:189::-;19068:32;;:::i;:::-;19109:65;19167:6;19159;19153:4;19109:65;:::i;:::-;19044:136;18991:189;;:::o;19186:186::-;19246:120;19263:3;19256:5;19253:14;19246:120;;;19317:39;19354:1;19347:5;19317:39;:::i;:::-;19290:1;19283:5;19279:13;19270:22;;19246:120;;;19186:186;;:::o;19378:543::-;19479:2;19474:3;19471:11;19468:446;;;19513:38;19545:5;19513:38;:::i;:::-;19597:29;19615:10;19597:29;:::i;:::-;19587:8;19583:44;19780:2;19768:10;19765:18;19762:49;;;19801:8;19786:23;;19762:49;19824:80;19880:22;19898:3;19880:22;:::i;:::-;19870:8;19866:37;19853:11;19824:80;:::i;:::-;19483:431;;19468:446;19378:543;;;:::o;19927:117::-;19981:8;20031:5;20025:4;20021:16;20000:37;;19927:117;;;;:::o;20050:169::-;20094:6;20127:51;20175:1;20171:6;20163:5;20160:1;20156:13;20127:51;:::i;:::-;20123:56;20208:4;20202;20198:15;20188:25;;20101:118;20050:169;;;;:::o;20224:295::-;20300:4;20446:29;20471:3;20465:4;20446:29;:::i;:::-;20438:37;;20508:3;20505:1;20501:11;20495:4;20492:21;20484:29;;20224:295;;;;:::o;20524:1395::-;20641:37;20674:3;20641:37;:::i;:::-;20743:18;20735:6;20732:30;20729:56;;;20765:18;;:::i;:::-;20729:56;20809:38;20841:4;20835:11;20809:38;:::i;:::-;20894:67;20954:6;20946;20940:4;20894:67;:::i;:::-;20988:1;21012:4;20999:17;;21044:2;21036:6;21033:14;21061:1;21056:618;;;;21718:1;21735:6;21732:77;;;21784:9;21779:3;21775:19;21769:26;21760:35;;21732:77;21835:67;21895:6;21888:5;21835:67;:::i;:::-;21829:4;21822:81;21691:222;21026:887;;21056:618;21108:4;21104:9;21096:6;21092:22;21142:37;21174:4;21142:37;:::i;:::-;21201:1;21215:208;21229:7;21226:1;21223:14;21215:208;;;21308:9;21303:3;21299:19;21293:26;21285:6;21278:42;21359:1;21351:6;21347:14;21337:24;;21406:2;21395:9;21391:18;21378:31;;21252:4;21249:1;21245:12;21240:17;;21215:208;;;21451:6;21442:7;21439:19;21436:179;;;21509:9;21504:3;21500:19;21494:26;21552:48;21594:4;21586:6;21582:17;21571:9;21552:48;:::i;:::-;21544:6;21537:64;21459:156;21436:179;21661:1;21657;21649:6;21645:14;21641:22;21635:4;21628:36;21063:611;;;21026:887;;20616:1303;;;20524:1395;;:::o;21925:180::-;22065:32;22061:1;22053:6;22049:14;22042:56;21925:180;:::o;22111:366::-;22253:3;22274:67;22338:2;22333:3;22274:67;:::i;:::-;22267:74;;22350:93;22439:3;22350:93;:::i;:::-;22468:2;22463:3;22459:12;22452:19;;22111:366;;;:::o;22483:419::-;22649:4;22687:2;22676:9;22672:18;22664:26;;22736:9;22730:4;22726:20;22722:1;22711:9;22707:17;22700:47;22764:131;22890:4;22764:131;:::i;:::-;22756:139;;22483:419;;;:::o;22908:180::-;22956:77;22953:1;22946:88;23053:4;23050:1;23043:15;23077:4;23074:1;23067:15;23094:194;23134:4;23154:20;23172:1;23154:20;:::i;:::-;23149:25;;23188:20;23206:1;23188:20;:::i;:::-;23183:25;;23232:1;23229;23225:9;23217:17;;23256:1;23250:4;23247:11;23244:37;;;23261:18;;:::i;:::-;23244:37;23094:194;;;;:::o;23294:348::-;23334:7;23357:20;23375:1;23357:20;:::i;:::-;23352:25;;23391:20;23409:1;23391:20;:::i;:::-;23386:25;;23579:1;23511:66;23507:74;23504:1;23501:81;23496:1;23489:9;23482:17;23478:105;23475:131;;;23586:18;;:::i;:::-;23475:131;23634:1;23631;23627:9;23616:20;;23294:348;;;;:::o;23648:191::-;23688:3;23707:20;23725:1;23707:20;:::i;:::-;23702:25;;23741:20;23759:1;23741:20;:::i;:::-;23736:25;;23784:1;23781;23777:9;23770:16;;23805:3;23802:1;23799:10;23796:36;;;23812:18;;:::i;:::-;23796:36;23648:191;;;;:::o;23845:179::-;23985:31;23981:1;23973:6;23969:14;23962:55;23845:179;:::o;24030:366::-;24172:3;24193:67;24257:2;24252:3;24193:67;:::i;:::-;24186:74;;24269:93;24358:3;24269:93;:::i;:::-;24387:2;24382:3;24378:12;24371:19;;24030:366;;;:::o;24402:419::-;24568:4;24606:2;24595:9;24591:18;24583:26;;24655:9;24649:4;24645:20;24641:1;24630:9;24626:17;24619:47;24683:131;24809:4;24683:131;:::i;:::-;24675:139;;24402:419;;;:::o;24827:168::-;24967:20;24963:1;24955:6;24951:14;24944:44;24827:168;:::o;25001:366::-;25143:3;25164:67;25228:2;25223:3;25164:67;:::i;:::-;25157:74;;25240:93;25329:3;25240:93;:::i;:::-;25358:2;25353:3;25349:12;25342:19;;25001:366;;;:::o;25373:419::-;25539:4;25577:2;25566:9;25562:18;25554:26;;25626:9;25620:4;25616:20;25612:1;25601:9;25597:17;25590:47;25654:131;25780:4;25654:131;:::i;:::-;25646:139;;25373:419;;;:::o;25798:236::-;25938:34;25934:1;25926:6;25922:14;25915:58;26007:19;26002:2;25994:6;25990:15;25983:44;25798:236;:::o;26040:366::-;26182:3;26203:67;26267:2;26262:3;26203:67;:::i;:::-;26196:74;;26279:93;26368:3;26279:93;:::i;:::-;26397:2;26392:3;26388:12;26381:19;;26040:366;;;:::o;26412:419::-;26578:4;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26412:419;;;:::o;26837:248::-;26977:34;26973:1;26965:6;26961:14;26954:58;27046:31;27041:2;27033:6;27029:15;27022:56;26837:248;:::o;27091:366::-;27233:3;27254:67;27318:2;27313:3;27254:67;:::i;:::-;27247:74;;27330:93;27419:3;27330:93;:::i;:::-;27448:2;27443:3;27439:12;27432:19;;27091:366;;;:::o;27463:419::-;27629:4;27667:2;27656:9;27652:18;27644:26;;27716:9;27710:4;27706:20;27702:1;27691:9;27687:17;27680:47;27744:131;27870:4;27744:131;:::i;:::-;27736:139;;27463:419;;;:::o;27888:223::-;28028:34;28024:1;28016:6;28012:14;28005:58;28097:6;28092:2;28084:6;28080:15;28073:31;27888:223;:::o;28117:366::-;28259:3;28280:67;28344:2;28339:3;28280:67;:::i;:::-;28273:74;;28356:93;28445:3;28356:93;:::i;:::-;28474:2;28469:3;28465:12;28458:19;;28117:366;;;:::o;28489:419::-;28655:4;28693:2;28682:9;28678:18;28670:26;;28742:9;28736:4;28732:20;28728:1;28717:9;28713:17;28706:47;28770:131;28896:4;28770:131;:::i;:::-;28762:139;;28489:419;;;:::o;28914:148::-;29016:11;29053:3;29038:18;;28914:148;;;;:::o;29092:874::-;29195:3;29232:5;29226:12;29261:36;29287:9;29261:36;:::i;:::-;29313:89;29395:6;29390:3;29313:89;:::i;:::-;29306:96;;29433:1;29422:9;29418:17;29449:1;29444:166;;;;29624:1;29619:341;;;;29411:549;;29444:166;29528:4;29524:9;29513;29509:25;29504:3;29497:38;29590:6;29583:14;29576:22;29568:6;29564:35;29559:3;29555:45;29548:52;;29444:166;;29619:341;29686:38;29718:5;29686:38;:::i;:::-;29746:1;29760:154;29774:6;29771:1;29768:13;29760:154;;;29848:7;29842:14;29838:1;29833:3;29829:11;29822:35;29898:1;29889:7;29885:15;29874:26;;29796:4;29793:1;29789:12;29784:17;;29760:154;;;29943:6;29938:3;29934:16;29927:23;;29626:334;;29411:549;;29199:767;;29092:874;;;;:::o;29972:390::-;30078:3;30106:39;30139:5;30106:39;:::i;:::-;30161:89;30243:6;30238:3;30161:89;:::i;:::-;30154:96;;30259:65;30317:6;30312:3;30305:4;30298:5;30294:16;30259:65;:::i;:::-;30349:6;30344:3;30340:16;30333:23;;30082:280;29972:390;;;;:::o;30368:429::-;30545:3;30567:92;30655:3;30646:6;30567:92;:::i;:::-;30560:99;;30676:95;30767:3;30758:6;30676:95;:::i;:::-;30669:102;;30788:3;30781:10;;30368:429;;;;;:::o;30803:169::-;30943:21;30939:1;30931:6;30927:14;30920:45;30803:169;:::o;30978:366::-;31120:3;31141:67;31205:2;31200:3;31141:67;:::i;:::-;31134:74;;31217:93;31306:3;31217:93;:::i;:::-;31335:2;31330:3;31326:12;31319:19;;30978:366;;;:::o;31350:419::-;31516:4;31554:2;31543:9;31539:18;31531:26;;31603:9;31597:4;31593:20;31589:1;31578:9;31574:17;31567:47;31631:131;31757:4;31631:131;:::i;:::-;31623:139;;31350:419;;;:::o;31775:225::-;31915:34;31911:1;31903:6;31899:14;31892:58;31984:8;31979:2;31971:6;31967:15;31960:33;31775:225;:::o;32006:366::-;32148:3;32169:67;32233:2;32228:3;32169:67;:::i;:::-;32162:74;;32245:93;32334:3;32245:93;:::i;:::-;32363:2;32358:3;32354:12;32347:19;;32006:366;;;:::o;32378:419::-;32544:4;32582:2;32571:9;32567:18;32559:26;;32631:9;32625:4;32621:20;32617:1;32606:9;32602:17;32595:47;32659:131;32785:4;32659:131;:::i;:::-;32651:139;;32378:419;;;:::o;32803:182::-;32943:34;32939:1;32931:6;32927:14;32920:58;32803:182;:::o;32991:366::-;33133:3;33154:67;33218:2;33213:3;33154:67;:::i;:::-;33147:74;;33230:93;33319:3;33230:93;:::i;:::-;33348:2;33343:3;33339:12;33332:19;;32991:366;;;:::o;33363:419::-;33529:4;33567:2;33556:9;33552:18;33544:26;;33616:9;33610:4;33606:20;33602:1;33591:9;33587:17;33580:47;33644:131;33770:4;33644:131;:::i;:::-;33636:139;;33363:419;;;:::o;33788:233::-;33827:3;33850:24;33868:5;33850:24;:::i;:::-;33841:33;;33896:66;33889:5;33886:77;33883:103;;33966:18;;:::i;:::-;33883:103;34013:1;34006:5;34002:13;33995:20;;33788:233;;;:::o;34027:180::-;34075:77;34072:1;34065:88;34172:4;34169:1;34162:15;34196:4;34193:1;34186:15;34213:185;34253:1;34270:20;34288:1;34270:20;:::i;:::-;34265:25;;34304:20;34322:1;34304:20;:::i;:::-;34299:25;;34343:1;34333:35;;34348:18;;:::i;:::-;34333:35;34390:1;34387;34383:9;34378:14;;34213:185;;;;:::o;34404:176::-;34436:1;34453:20;34471:1;34453:20;:::i;:::-;34448:25;;34487:20;34505:1;34487:20;:::i;:::-;34482:25;;34526:1;34516:35;;34531:18;;:::i;:::-;34516:35;34572:1;34569;34565:9;34560:14;;34404:176;;;;:::o;34586:180::-;34634:77;34631:1;34624:88;34731:4;34728:1;34721:15;34755:4;34752:1;34745:15;34772:98;34823:6;34857:5;34851:12;34841:22;;34772:98;;;:::o;34876:168::-;34959:11;34993:6;34988:3;34981:19;35033:4;35028:3;35024:14;35009:29;;34876:168;;;;:::o;35050:373::-;35136:3;35164:38;35196:5;35164:38;:::i;:::-;35218:70;35281:6;35276:3;35218:70;:::i;:::-;35211:77;;35297:65;35355:6;35350:3;35343:4;35336:5;35332:16;35297:65;:::i;:::-;35387:29;35409:6;35387:29;:::i;:::-;35382:3;35378:39;35371:46;;35140:283;35050:373;;;;:::o;35429:640::-;35624:4;35662:3;35651:9;35647:19;35639:27;;35676:71;35744:1;35733:9;35729:17;35720:6;35676:71;:::i;:::-;35757:72;35825:2;35814:9;35810:18;35801:6;35757:72;:::i;:::-;35839;35907:2;35896:9;35892:18;35883:6;35839:72;:::i;:::-;35958:9;35952:4;35948:20;35943:2;35932:9;35928:18;35921:48;35986:76;36057:4;36048:6;35986:76;:::i;:::-;35978:84;;35429:640;;;;;;;:::o;36075:141::-;36131:5;36162:6;36156:13;36147:22;;36178:32;36204:5;36178:32;:::i;:::-;36075:141;;;;:::o;36222:349::-;36291:6;36340:2;36328:9;36319:7;36315:23;36311:32;36308:119;;;36346:79;;:::i;:::-;36308:119;36466:1;36491:63;36546:7;36537:6;36526:9;36522:22;36491:63;:::i;:::-;36481:73;;36437:127;36222:349;;;;:::o

Swarm Source

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