ETH Price: $2,526.24 (-4.95%)

Token

Ketsero (KETSERO)
 

Overview

Max Total Supply

2,000 KETSERO

Holders

1,514

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 KETSERO
0x5940c4752a638289a0b1c746d7ce94cb49142e0b
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:
Ketsero

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 2023-01-24
*/

// 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) {
            
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        unchecked {

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

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

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

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

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

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

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

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

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

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

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

    modifier onlyAllowedOperator() virtual {

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

pragma solidity ^0.8.13;

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

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

pragma solidity ^0.8.13;

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

pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

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

pragma solidity ^0.8.16;
contract Ketsero is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{

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

    mapping(address => uint) public userHasMinted;

    bool public REVEALED;

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

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

    bool public isPublicMintEnabled = false;

    uint public COLLECTION_SIZE = 2000;

    uint public MINT_PRICE = 0.005 ether;

    uint public MAX_BATCH_SIZE = 25;

    uint public SUPPLY_PER_WALLET = 25;
    
    uint public FREE_SUPPLY_PER_WALLET = 1;

    constructor() ERC721A("Ketsero", "KETSERO") {}


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

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

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

    function MintFree(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, "Tokens not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Tokens!");

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

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - 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, "Tokens not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Tokens!");

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

        _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 setCOLLECTIONsIZE(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":"MintByInvite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"MintFree","outputs":[],"stateMutability":"payable","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":"uint256","name":"_new","type":"uint256"}],"name":"setCOLLECTIONsIZE","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_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"}]

60806040526040518060400160405280601881526020017f68747470733a2f2f6170692e6b65747365726f2e78797a2f0000000000000000815250600a90816200004a919062000751565b506040518060400160405280601881526020017f68747470733a2f2f6170692e6b65747365726f2e78797a2f0000000000000000815250600d908162000091919062000751565b506040518060400160405280601881526020017f68747470733a2f2f6170692e6b65747365726f2e78797a2f0000000000000000815250600e9081620000d8919062000751565b506000600f60006101000a81548160ff0219169083151502179055506107d06010556611c37937e080006011556019601255601960135560016014553480156200012157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600781526020017f4b65747365726f000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b45545345524f00000000000000000000000000000000000000000000000000815250620001c5620001b96200040660201b60201c565b6200040e60201b60201c565b8160039081620001d6919062000751565b508060049081620001e8919062000751565b50620001f9620004d260201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003fe578015620002c4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200028a9291906200087d565b600060405180830381600087803b158015620002a557600080fd5b505af1158015620002ba573d6000803e3d6000fd5b50505050620003fd565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200037e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620003449291906200087d565b600060405180830381600087803b1580156200035f57600080fd5b505af115801562000374573d6000803e3d6000fd5b50505050620003fc565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003c79190620008aa565b600060405180830381600087803b158015620003e257600080fd5b505af1158015620003f7573d6000803e3d6000fd5b505050505b5b5b5050620008c7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055957607f821691505b6020821081036200056f576200056e62000511565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200059a565b620005e586836200059a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006326200062c6200062684620005fd565b62000607565b620005fd565b9050919050565b6000819050919050565b6200064e8362000611565b620006666200065d8262000639565b848454620005a7565b825550505050565b600090565b6200067d6200066e565b6200068a81848462000643565b505050565b5b81811015620006b257620006a660008262000673565b60018101905062000690565b5050565b601f8211156200070157620006cb8162000575565b620006d6846200058a565b81016020851015620006e6578190505b620006fe620006f5856200058a565b8301826200068f565b50505b505050565b600082821c905092915050565b6000620007266000198460080262000706565b1980831691505092915050565b600062000741838362000713565b9150826002028217905092915050565b6200075c82620004d7565b67ffffffffffffffff811115620007785762000777620004e2565b5b62000784825462000540565b62000791828285620006b6565b600060209050601f831160018114620007c95760008415620007b4578287015190505b620007c0858262000733565b86555062000830565b601f198416620007d98662000575565b60005b828110156200080357848901518255600182019150602085019450602081019050620007dc565b868310156200082357848901516200081f601f89168262000713565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008658262000838565b9050919050565b620008778162000858565b82525050565b60006040820190506200089460008301856200086c565b620008a360208301846200086c565b9392505050565b6000602082019050620008c160008301846200086c565b92915050565b6144c980620008d76000396000f3fe60806040526004361061025c5760003560e01c8063938e3d7b11610144578063c002d23d116100b6578063e113ad951161007a578063e113ad951461085e578063e757223014610887578063e8a3d485146108c4578063e985e9c5146108ef578063e9d541b01461092c578063f2fde38b146109555761025c565b8063c002d23d14610775578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a22cb46511610108578063a22cb465146106a9578063a4cdd719146106d2578063a76a9587146106e9578063a9527e8214610714578063ad6ac81b1461073d578063b88d4fde146107595761025c565b8063938e3d7b146105e757806395d89b41146106105780639e1f39d61461063b578063a0712d6814610664578063a17e7431146106805761025c565b8063336f5ec3116101dd5780635fe75587116101a15780635fe75587146104d75780636352211e1461050257806370a082311461053f578063715018a61461057c5780638da5cb5b1461059357806391b7f5ed146105be5761025c565b8063336f5ec31461041357806342842e0e1461043c57806342966c6814610458578063507862d11461048157806356b4f673146104ac5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b6040516103d791906133aa565b60405180910390f35b6103fa60048036038101906103f591906133f2565b610cad565b005b34801561040857600080fd5b50610411610db9565b005b34801561041f57600080fd5b5061043a600480360381019061043591906132a6565b610ec5565b005b610456600480360381019061045191906133f2565b610ed7565b005b34801561046457600080fd5b5061047f600480360381019061047a91906132a6565b610fe3565b005b34801561048d57600080fd5b50610496610ff1565b6040516104a3919061324e565b60405180910390f35b3480156104b857600080fd5b506104c161107f565b6040516104ce919061324e565b60405180910390f35b3480156104e357600080fd5b506104ec61110d565b6040516104f991906133aa565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906132a6565b611113565b6040516105369190613314565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906133c5565b611125565b60405161057391906133aa565b60405180910390f35b34801561058857600080fd5b506105916111dd565b005b34801561059f57600080fd5b506105a86111f1565b6040516105b59190613314565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906132a6565b61121a565b005b3480156105f357600080fd5b5061060e6004803603810190610609919061357a565b61122c565b005b34801561061c57600080fd5b50610625611247565b604051610632919061324e565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d91906135ef565b6112d9565b005b61067e600480360381019061067991906132a6565b61130f565b005b34801561068c57600080fd5b506106a760048036038101906106a2919061364b565b61175c565b005b3480156106b557600080fd5b506106d060048036038101906106cb919061368b565b6117c9565b005b3480156106de57600080fd5b506106e76118d4565b005b3480156106f557600080fd5b506106fe611908565b60405161070b919061310a565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906132a6565b61191b565b005b610757600480360381019061075291906132a6565b61192d565b005b610773600480360381019061076e919061376c565b611d7a565b005b34801561078157600080fd5b5061078a611e88565b60405161079791906133aa565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b005b34801561089357600080fd5b506108ae60048036038101906108a991906132a6565b612016565b6040516108bb91906133aa565b60405180910390f35b3480156108d057600080fd5b506108d96120a0565b6040516108e6919061324e565b60405180910390f35b3480156108fb57600080fd5b50610916600480360381019061091191906137ef565b612132565b604051610923919061310a565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b6121c6565b005b34801561096157600080fd5b5061097c600480360381019061097791906133c5565b6121d8565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f82611113565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612132565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610da9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d2492919061388f565b6020604051808303816000875af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906138cd565b610da857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d9f9190613314565b60405180910390fd5b5b610db48383836122c7565b505050565b610dc16125e9565b600260095403610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613946565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e3490613997565b60006040518083038185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb1906139f8565b60405180910390fd5b506001600981905550565b610ecd6125e9565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fd3576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f4e92919061388f565b6020604051808303816000875af1158015610f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9191906138cd565b610fd257336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fc99190613314565b60405180910390fd5b5b610fde838383612667565b505050565b610fee816001612687565b50565b600d8054610ffe9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461102a9061385e565b80156110775780601f1061104c57610100808354040283529160200191611077565b820191906000526020600020905b81548152906001019060200180831161105a57829003601f168201915b505050505081565b600a805461108c9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110b89061385e565b80156111055780601f106110da57610100808354040283529160200191611105565b820191906000526020600020905b8154815290600101906020018083116110e857829003601f168201915b505050505081565b60135481565b600061111e826128d9565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e56125e9565b6111ef60006129a5565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112226125e9565b8060118190555050565b6112346125e9565b80600a90816112439190613bc4565b5050565b6060600480546112569061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546112829061385e565b80156112cf5780601f106112a4576101008083540402835291602001916112cf565b820191906000526020600020905b8154815290600101906020018083116112b257829003601f168201915b5050505050905090565b6112e16125e9565b80600e90816112f09190613bc4565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490613ce2565b60405180910390fd5b6002600954036113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461141a9190613d31565b90508083106114d157808361142f9190613d31565b60115461143c9190613d65565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114899190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611564565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115209190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff166115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613e3f565b60405180910390fd5b601054836115bf610c7e565b6115c99190613dbf565b111561160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190613eab565b60405180910390fd5b6013548361161733611125565b6116219190613dbf565b1115611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613f3d565b60405180910390fd5b6012548311156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613fcf565b60405180910390fd5b813410156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e19061403b565b60405180910390fd5b6116f43384612a69565b8134111561174f573373ffffffffffffffffffffffffffffffffffffffff166108fc83346117229190613d31565b9081150290604051600060405180830381858888f1935050505015801561174d573d6000803e3d6000fd5b505b5050600160098190555050565b6117646125e9565b60105482611770610c7e565b61177a9190613dbf565b11156117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906140a7565b60405180910390fd5b6117c58183612a69565b5050565b80600860006117d66122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118836122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c8919061310a565b60405180910390a35050565b6118dc6125e9565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6119236125e9565b8060148190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290613ce2565b60405180910390fd5b6002600954036119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611a389190613d31565b9050808310611aef578083611a4d9190613d31565b601154611a5a9190613d65565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa79190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b82565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3e9190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613e3f565b60405180910390fd5b60105483611bdd610c7e565b611be79190613dbf565b1115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90613eab565b60405180910390fd5b60135483611c3533611125565b611c3f9190613dbf565b1115611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613f3d565b60405180910390fd5b601254831115611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613fcf565b60405180910390fd5b81341015611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff9061403b565b60405180910390fd5b611d123384612a69565b81341115611d6d573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611d409190613d31565b9081150290604051600060405180830381858888f19350505050158015611d6b573d6000803e3d6000fd5b505b5050600160098190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e76576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611df192919061388f565b6020604051808303816000875af1158015611e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3491906138cd565b611e7557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e6c9190613314565b60405180910390fd5b5b611e8284848484612a87565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec1929190614186565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b61200c6125e9565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120689190613d31565b905080841061209157808461207d9190613d31565b60115461208a9190613d65565b9150612096565b600091505b8192505050919050565b6060600a80546120af9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120db9061385e565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ce6125e9565b8060108190555050565b6121e06125e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361224f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122469061421c565b60405180910390fd5b612258816129a5565b50565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006122d2826128d9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612339576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061234584612c5a565b9150915061235b81876123566122ba565b612c81565b6123a7576123708661236b6122ba565b612132565b6123a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361240d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241a8686866001612cc5565b801561242557600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124f3856124cf888887612ccb565b7c020000000000000000000000000000000000000000000000000000000017612cf3565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125795760006001850190506000600560008381526020019081526020016000205403612577576001548114612576578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e18686866001612d1e565b505050505050565b6125f1612d24565b73ffffffffffffffffffffffffffffffffffffffff1661260f6111f1565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614288565b60405180910390fd5b565b61268283838360405180602001604052806000815250611d7a565b505050565b6000612692836128d9565b905060008190506000806126a586612c5a565b91509150841561270e576126c181846126bc6122ba565b612c81565b61270d576126d6836126d16122ba565b612132565b61270c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61271c836000886001612cc5565b801561272757600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127cf8361278c85600088612ccb565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612cf3565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128555760006001870190506000600560008381526020019081526020016000205403612853576001548114612852578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128bf836000886001612d1e565b600260008154809291906001019190505550505050505050565b600080829050806128e86122c2565b1161296e5760015481101561296d5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361296b575b60008103612961576005600083600190039350838152602001908152602001600020549050612937565b80925050506129a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a83828260405180602001604052806000815250612d2c565b5050565b612a92848484610cad565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c906142a8565b915050600a82612b6c919061431f565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61344f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613d31565b9150600a85612be99190614350565b6030612bf59190613dbf565b60f81b818381518110612c0b57612c0a614381565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c47919061431f565b9450612bc5565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612ce2868684612f1a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612d368383612f23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612dc55760006001549050600083820390505b612d776000868380600101945086612dca565b612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d64578160015414612dc257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e129493929190614405565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b9190614466565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612f64576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f716000848385612cc5565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fe883612fd96000866000612ccb565b612fe2856130df565b17612cf3565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061304e565b50600082036130c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130da6000848385612d1e565b505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b6000602082840312156133db576133da61312f565b5b60006133e984828501613346565b91505092915050565b60008060006060848603121561340b5761340a61312f565b5b600061341986828701613346565b935050602061342a86828701613346565b925050604061343b86828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61348782613204565b810181811067ffffffffffffffff821117156134a6576134a561344f565b5b80604052505050565b60006134b9613125565b90506134c5828261347e565b919050565b600067ffffffffffffffff8211156134e5576134e461344f565b5b6134ee82613204565b9050602081019050919050565b82818337600083830152505050565b600061351d613518846134ca565b6134af565b9050828152602081018484840111156135395761353861344a565b5b6135448482856134fb565b509392505050565b600082601f83011261356157613560613445565b5b813561357184826020860161350a565b91505092915050565b6000602082840312156135905761358f61312f565b5b600082013567ffffffffffffffff8111156135ae576135ad613134565b5b6135ba8482850161354c565b91505092915050565b6135cc816130ef565b81146135d757600080fd5b50565b6000813590506135e9816135c3565b92915050565b600080604083850312156136065761360561312f565b5b6000613614858286016135da565b925050602083013567ffffffffffffffff81111561363557613634613134565b5b6136418582860161354c565b9150509250929050565b600080604083850312156136625761366161312f565b5b600061367085828601613291565b925050602061368185828601613346565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c1858286016135da565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561344f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134af565b90508281526020810184848401111561372b5761372a61344a565b5b6137368482856134fb565b509392505050565b600082601f83011261375357613752613445565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b60006040820190506138a46000830185613305565b6138b16020830184613305565b9392505050565b6000815190506138c7816135c3565b92915050565b6000602082840312156138e3576138e261312f565b5b60006138f1848285016138b8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613930601f836131c9565b915061393b826138fa565b602082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600081905092915050565b50565b6000613981600083613966565b915061398c82613971565b600082019050919050565b60006139a282613974565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006139e26010836131c9565b91506139ed826139ac565b602082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a3d565b613a848683613a3d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ac1613abc613ab784613270565b613a9c565b613270565b9050919050565b6000819050919050565b613adb83613aa6565b613aef613ae782613ac8565b848454613a4a565b825550505050565b600090565b613b04613af7565b613b0f818484613ad2565b505050565b5b81811015613b3357613b28600082613afc565b600181019050613b15565b5050565b601f821115613b7857613b4981613a18565b613b5284613a2d565b81016020851015613b61578190505b613b75613b6d85613a2d565b830182613b14565b50505b505050565b600082821c905092915050565b6000613b9b60001984600802613b7d565b1980831691505092915050565b6000613bb48383613b8a565b9150826002028217905092915050565b613bcd826131be565b67ffffffffffffffff811115613be657613be561344f565b5b613bf0825461385e565b613bfb828285613b37565b600060209050601f831160018114613c2e5760008415613c1c578287015190505b613c268582613ba8565b865550613c8e565b601f198416613c3c86613a18565b60005b82811015613c6457848901518255600182019150602085019450602081019050613c3f565b86831015613c815784890151613c7d601f891682613b8a565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613ccc601e836131c9565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3c82613270565b9150613d4783613270565b9250828203905081811115613d5f57613d5e613d02565b5b92915050565b6000613d7082613270565b9150613d7b83613270565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613db457613db3613d02565b5b828202905092915050565b6000613dca82613270565b9150613dd583613270565b9250828201905080821115613ded57613dec613d02565b5b92915050565b7f546f6b656e73206e6f7420726561647920796574210000000000000000000000600082015250565b6000613e296015836131c9565b9150613e3482613df3565b602082019050919050565b60006020820190508181036000830152613e5881613e1c565b9050919050565b7f4e6f206d6f726520546f6b656e73210000000000000000000000000000000000600082015250565b6000613e95600f836131c9565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613f276031836131c9565b9150613f3282613ecb565b604082019050919050565b60006020820190508181036000830152613f5681613f1a565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613fb9603d836131c9565b9150613fc482613f5d565b604082019050919050565b60006020820190508181036000830152613fe881613fac565b9050919050565b7f4d7573742073656e6420656e6f75676820657468000000000000000000000000600082015250565b60006140256014836131c9565b915061403082613fef565b602082019050919050565b6000602082019050818103600083015261405481614018565b9050919050565b7f4e6f206d6f726520746f6b656e7320696e2073746f636b210000000000000000600082015250565b60006140916018836131c9565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b600081905092915050565b600081546140df8161385e565b6140e981866140c7565b9450600182166000811461410457600181146141195761414c565b60ff198316865281151582028601935061414c565b61412285613a18565b60005b8381101561414457815481890152600182019150602081019050614125565b838801955050505b50505092915050565b6000614160826131be565b61416a81856140c7565b935061417a8185602086016131da565b80840191505092915050565b600061419282856140d2565b915061419e8284614155565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142066026836131c9565b9150614211826141aa565b604082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142726020836131c9565b915061427d8261423c565b602082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b60006142b382613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142e5576142e4613d02565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061432a82613270565b915061433583613270565b925082614345576143446142f0565b5b828204905092915050565b600061435b82613270565b915061436683613270565b925082614376576143756142f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006143d7826143b0565b6143e181856143bb565b93506143f18185602086016131da565b6143fa81613204565b840191505092915050565b600060808201905061441a6000830187613305565b6144276020830186613305565b614434604083018561339b565b818103606083015261444681846143cc565b905095945050505050565b60008151905061446081613165565b92915050565b60006020828403121561447c5761447b61312f565b5b600061448a84828501614451565b9150509291505056fea26469706673582212206e0296235d011906ea03bbffde9a4131f77643957e09c2d08595009e65c6884664736f6c63430008100033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063938e3d7b11610144578063c002d23d116100b6578063e113ad951161007a578063e113ad951461085e578063e757223014610887578063e8a3d485146108c4578063e985e9c5146108ef578063e9d541b01461092c578063f2fde38b146109555761025c565b8063c002d23d14610775578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a22cb46511610108578063a22cb465146106a9578063a4cdd719146106d2578063a76a9587146106e9578063a9527e8214610714578063ad6ac81b1461073d578063b88d4fde146107595761025c565b8063938e3d7b146105e757806395d89b41146106105780639e1f39d61461063b578063a0712d6814610664578063a17e7431146106805761025c565b8063336f5ec3116101dd5780635fe75587116101a15780635fe75587146104d75780636352211e1461050257806370a082311461053f578063715018a61461057c5780638da5cb5b1461059357806391b7f5ed146105be5761025c565b8063336f5ec31461041357806342842e0e1461043c57806342966c6814610458578063507862d11461048157806356b4f673146104ac5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b6040516103d791906133aa565b60405180910390f35b6103fa60048036038101906103f591906133f2565b610cad565b005b34801561040857600080fd5b50610411610db9565b005b34801561041f57600080fd5b5061043a600480360381019061043591906132a6565b610ec5565b005b610456600480360381019061045191906133f2565b610ed7565b005b34801561046457600080fd5b5061047f600480360381019061047a91906132a6565b610fe3565b005b34801561048d57600080fd5b50610496610ff1565b6040516104a3919061324e565b60405180910390f35b3480156104b857600080fd5b506104c161107f565b6040516104ce919061324e565b60405180910390f35b3480156104e357600080fd5b506104ec61110d565b6040516104f991906133aa565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906132a6565b611113565b6040516105369190613314565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906133c5565b611125565b60405161057391906133aa565b60405180910390f35b34801561058857600080fd5b506105916111dd565b005b34801561059f57600080fd5b506105a86111f1565b6040516105b59190613314565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906132a6565b61121a565b005b3480156105f357600080fd5b5061060e6004803603810190610609919061357a565b61122c565b005b34801561061c57600080fd5b50610625611247565b604051610632919061324e565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d91906135ef565b6112d9565b005b61067e600480360381019061067991906132a6565b61130f565b005b34801561068c57600080fd5b506106a760048036038101906106a2919061364b565b61175c565b005b3480156106b557600080fd5b506106d060048036038101906106cb919061368b565b6117c9565b005b3480156106de57600080fd5b506106e76118d4565b005b3480156106f557600080fd5b506106fe611908565b60405161070b919061310a565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906132a6565b61191b565b005b610757600480360381019061075291906132a6565b61192d565b005b610773600480360381019061076e919061376c565b611d7a565b005b34801561078157600080fd5b5061078a611e88565b60405161079791906133aa565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b005b34801561089357600080fd5b506108ae60048036038101906108a991906132a6565b612016565b6040516108bb91906133aa565b60405180910390f35b3480156108d057600080fd5b506108d96120a0565b6040516108e6919061324e565b60405180910390f35b3480156108fb57600080fd5b50610916600480360381019061091191906137ef565b612132565b604051610923919061310a565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b6121c6565b005b34801561096157600080fd5b5061097c600480360381019061097791906133c5565b6121d8565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f82611113565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612132565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610da9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d2492919061388f565b6020604051808303816000875af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906138cd565b610da857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d9f9190613314565b60405180910390fd5b5b610db48383836122c7565b505050565b610dc16125e9565b600260095403610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613946565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e3490613997565b60006040518083038185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb1906139f8565b60405180910390fd5b506001600981905550565b610ecd6125e9565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fd3576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f4e92919061388f565b6020604051808303816000875af1158015610f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9191906138cd565b610fd257336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fc99190613314565b60405180910390fd5b5b610fde838383612667565b505050565b610fee816001612687565b50565b600d8054610ffe9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461102a9061385e565b80156110775780601f1061104c57610100808354040283529160200191611077565b820191906000526020600020905b81548152906001019060200180831161105a57829003601f168201915b505050505081565b600a805461108c9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110b89061385e565b80156111055780601f106110da57610100808354040283529160200191611105565b820191906000526020600020905b8154815290600101906020018083116110e857829003601f168201915b505050505081565b60135481565b600061111e826128d9565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e56125e9565b6111ef60006129a5565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112226125e9565b8060118190555050565b6112346125e9565b80600a90816112439190613bc4565b5050565b6060600480546112569061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546112829061385e565b80156112cf5780601f106112a4576101008083540402835291602001916112cf565b820191906000526020600020905b8154815290600101906020018083116112b257829003601f168201915b5050505050905090565b6112e16125e9565b80600e90816112f09190613bc4565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490613ce2565b60405180910390fd5b6002600954036113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460145461141a9190613d31565b90508083106114d157808361142f9190613d31565b60115461143c9190613d65565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114899190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611564565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115209190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff166115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613e3f565b60405180910390fd5b601054836115bf610c7e565b6115c99190613dbf565b111561160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190613eab565b60405180910390fd5b6013548361161733611125565b6116219190613dbf565b1115611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613f3d565b60405180910390fd5b6012548311156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613fcf565b60405180910390fd5b813410156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e19061403b565b60405180910390fd5b6116f43384612a69565b8134111561174f573373ffffffffffffffffffffffffffffffffffffffff166108fc83346117229190613d31565b9081150290604051600060405180830381858888f1935050505015801561174d573d6000803e3d6000fd5b505b5050600160098190555050565b6117646125e9565b60105482611770610c7e565b61177a9190613dbf565b11156117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b2906140a7565b60405180910390fd5b6117c58183612a69565b5050565b80600860006117d66122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118836122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c8919061310a565b60405180910390a35050565b6118dc6125e9565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6119236125e9565b8060148190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290613ce2565b60405180910390fd5b6002600954036119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611a389190613d31565b9050808310611aef578083611a4d9190613d31565b601154611a5a9190613d65565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa79190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b82565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3e9190613dbf565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613e3f565b60405180910390fd5b60105483611bdd610c7e565b611be79190613dbf565b1115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90613eab565b60405180910390fd5b60135483611c3533611125565b611c3f9190613dbf565b1115611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790613f3d565b60405180910390fd5b601254831115611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613fcf565b60405180910390fd5b81341015611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff9061403b565b60405180910390fd5b611d123384612a69565b81341115611d6d573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611d409190613d31565b9081150290604051600060405180830381858888f19350505050158015611d6b573d6000803e3d6000fd5b505b5050600160098190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e76576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611df192919061388f565b6020604051808303816000875af1158015611e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3491906138cd565b611e7557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e6c9190613314565b60405180910390fd5b5b611e8284848484612a87565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec1929190614186565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b61200c6125e9565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120689190613d31565b905080841061209157808461207d9190613d31565b60115461208a9190613d65565b9150612096565b600091505b8192505050919050565b6060600a80546120af9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120db9061385e565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ce6125e9565b8060108190555050565b6121e06125e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361224f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122469061421c565b60405180910390fd5b612258816129a5565b50565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006122d2826128d9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612339576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061234584612c5a565b9150915061235b81876123566122ba565b612c81565b6123a7576123708661236b6122ba565b612132565b6123a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361240d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241a8686866001612cc5565b801561242557600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124f3856124cf888887612ccb565b7c020000000000000000000000000000000000000000000000000000000017612cf3565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125795760006001850190506000600560008381526020019081526020016000205403612577576001548114612576578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e18686866001612d1e565b505050505050565b6125f1612d24565b73ffffffffffffffffffffffffffffffffffffffff1661260f6111f1565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614288565b60405180910390fd5b565b61268283838360405180602001604052806000815250611d7a565b505050565b6000612692836128d9565b905060008190506000806126a586612c5a565b91509150841561270e576126c181846126bc6122ba565b612c81565b61270d576126d6836126d16122ba565b612132565b61270c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61271c836000886001612cc5565b801561272757600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127cf8361278c85600088612ccb565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612cf3565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128555760006001870190506000600560008381526020019081526020016000205403612853576001548114612852578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128bf836000886001612d1e565b600260008154809291906001019190505550505050505050565b600080829050806128e86122c2565b1161296e5760015481101561296d5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361296b575b60008103612961576005600083600190039350838152602001908152602001600020549050612937565b80925050506129a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a83828260405180602001604052806000815250612d2c565b5050565b612a92848484610cad565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c906142a8565b915050600a82612b6c919061431f565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61344f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613d31565b9150600a85612be99190614350565b6030612bf59190613dbf565b60f81b818381518110612c0b57612c0a614381565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c47919061431f565b9450612bc5565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612ce2868684612f1a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612d368383612f23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612dc55760006001549050600083820390505b612d776000868380600101945086612dca565b612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d64578160015414612dc257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e129493929190614405565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b9190614466565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612f64576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f716000848385612cc5565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fe883612fd96000866000612ccb565b612fe2856130df565b17612cf3565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061304e565b50600082036130c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130da6000848385612d1e565b505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b6000602082840312156133db576133da61312f565b5b60006133e984828501613346565b91505092915050565b60008060006060848603121561340b5761340a61312f565b5b600061341986828701613346565b935050602061342a86828701613346565b925050604061343b86828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61348782613204565b810181811067ffffffffffffffff821117156134a6576134a561344f565b5b80604052505050565b60006134b9613125565b90506134c5828261347e565b919050565b600067ffffffffffffffff8211156134e5576134e461344f565b5b6134ee82613204565b9050602081019050919050565b82818337600083830152505050565b600061351d613518846134ca565b6134af565b9050828152602081018484840111156135395761353861344a565b5b6135448482856134fb565b509392505050565b600082601f83011261356157613560613445565b5b813561357184826020860161350a565b91505092915050565b6000602082840312156135905761358f61312f565b5b600082013567ffffffffffffffff8111156135ae576135ad613134565b5b6135ba8482850161354c565b91505092915050565b6135cc816130ef565b81146135d757600080fd5b50565b6000813590506135e9816135c3565b92915050565b600080604083850312156136065761360561312f565b5b6000613614858286016135da565b925050602083013567ffffffffffffffff81111561363557613634613134565b5b6136418582860161354c565b9150509250929050565b600080604083850312156136625761366161312f565b5b600061367085828601613291565b925050602061368185828601613346565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c1858286016135da565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561344f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134af565b90508281526020810184848401111561372b5761372a61344a565b5b6137368482856134fb565b509392505050565b600082601f83011261375357613752613445565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b60006040820190506138a46000830185613305565b6138b16020830184613305565b9392505050565b6000815190506138c7816135c3565b92915050565b6000602082840312156138e3576138e261312f565b5b60006138f1848285016138b8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613930601f836131c9565b915061393b826138fa565b602082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600081905092915050565b50565b6000613981600083613966565b915061398c82613971565b600082019050919050565b60006139a282613974565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006139e26010836131c9565b91506139ed826139ac565b602082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a3d565b613a848683613a3d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ac1613abc613ab784613270565b613a9c565b613270565b9050919050565b6000819050919050565b613adb83613aa6565b613aef613ae782613ac8565b848454613a4a565b825550505050565b600090565b613b04613af7565b613b0f818484613ad2565b505050565b5b81811015613b3357613b28600082613afc565b600181019050613b15565b5050565b601f821115613b7857613b4981613a18565b613b5284613a2d565b81016020851015613b61578190505b613b75613b6d85613a2d565b830182613b14565b50505b505050565b600082821c905092915050565b6000613b9b60001984600802613b7d565b1980831691505092915050565b6000613bb48383613b8a565b9150826002028217905092915050565b613bcd826131be565b67ffffffffffffffff811115613be657613be561344f565b5b613bf0825461385e565b613bfb828285613b37565b600060209050601f831160018114613c2e5760008415613c1c578287015190505b613c268582613ba8565b865550613c8e565b601f198416613c3c86613a18565b60005b82811015613c6457848901518255600182019150602085019450602081019050613c3f565b86831015613c815784890151613c7d601f891682613b8a565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613ccc601e836131c9565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3c82613270565b9150613d4783613270565b9250828203905081811115613d5f57613d5e613d02565b5b92915050565b6000613d7082613270565b9150613d7b83613270565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613db457613db3613d02565b5b828202905092915050565b6000613dca82613270565b9150613dd583613270565b9250828201905080821115613ded57613dec613d02565b5b92915050565b7f546f6b656e73206e6f7420726561647920796574210000000000000000000000600082015250565b6000613e296015836131c9565b9150613e3482613df3565b602082019050919050565b60006020820190508181036000830152613e5881613e1c565b9050919050565b7f4e6f206d6f726520546f6b656e73210000000000000000000000000000000000600082015250565b6000613e95600f836131c9565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613f276031836131c9565b9150613f3282613ecb565b604082019050919050565b60006020820190508181036000830152613f5681613f1a565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613fb9603d836131c9565b9150613fc482613f5d565b604082019050919050565b60006020820190508181036000830152613fe881613fac565b9050919050565b7f4d7573742073656e6420656e6f75676820657468000000000000000000000000600082015250565b60006140256014836131c9565b915061403082613fef565b602082019050919050565b6000602082019050818103600083015261405481614018565b9050919050565b7f4e6f206d6f726520746f6b656e7320696e2073746f636b210000000000000000600082015250565b60006140916018836131c9565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b600081905092915050565b600081546140df8161385e565b6140e981866140c7565b9450600182166000811461410457600181146141195761414c565b60ff198316865281151582028601935061414c565b61412285613a18565b60005b8381101561414457815481890152600182019150602081019050614125565b838801955050505b50505092915050565b6000614160826131be565b61416a81856140c7565b935061417a8185602086016131da565b80840191505092915050565b600061419282856140d2565b915061419e8284614155565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142066026836131c9565b9150614211826141aa565b604082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142726020836131c9565b915061427d8261423c565b602082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b60006142b382613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142e5576142e4613d02565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061432a82613270565b915061433583613270565b925082614345576143446142f0565b5b828204905092915050565b600061435b82613270565b915061436683613270565b925082614376576143756142f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006143d7826143b0565b6143e181856143bb565b93506143f18185602086016131da565b6143fa81613204565b840191505092915050565b600060808201905061441a6000830187613305565b6144276020830186613305565b614434604083018561339b565b818103606083015261444681846143cc565b905095945050505050565b60008151905061446081613165565b92915050565b60006020828403121561447c5761447b61312f565b5b600061448a84828501614451565b9150509291505056fea26469706673582212206e0296235d011906ea03bbffde9a4131f77643957e09c2d08595009e65c6884664736f6c63430008100033

Deployed Bytecode Sourcemap

34994:5939:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35367:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15491:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15743:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19319:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18903:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35590:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13854:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35158:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39935:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38673:191;;;;;;;;;;;;;:::i;:::-;;39826:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40128:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34867:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35241:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35094:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35543:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16391:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14319:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1603:103;;;;;;;;;;;;;:::i;:::-;;1368:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39481:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39249:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15851:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38990:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37550:1115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35693:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19545:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38872:110;;;;;;;;;;;;;:::i;:::-;;35212:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39586:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36423:1119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40329:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35458:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40587:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35503:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35415:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35307:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39711:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36091:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39144:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19787:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39372:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1716:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35367:39;;;;;;;;;;;;;:::o;15491:244::-;15576:4;15630:10;15615:25;;:11;:25;;;;:68;;;;15673:10;15658:25;;:11;:25;;;;15615:68;:111;;;;15716:10;15701:25;;:11;:25;;;;15615:111;15595:131;;15491:244;;;:::o;15743:100::-;15797:13;15830:5;15823:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15743:100;:::o;19319:218::-;19395:7;19420:16;19428:7;19420;:16::i;:::-;19415:64;;19445:34;;;;;;;;;;;;;;19415:64;19499:15;:24;19515:7;19499:24;;;;;;;;;;;:30;;;;;;;;;;;;19492:37;;19319:218;;;:::o;18903:408::-;18992:13;19008:16;19016:7;19008;:16::i;:::-;18992:32;;19064:5;19041:28;;:19;:17;:19::i;:::-;:28;;;19037:175;;19089:44;19106:5;19113:19;:17;:19::i;:::-;19089:16;:44::i;:::-;19084:128;;19161:35;;;;;;;;;;;;;;19084:128;19037:175;19257:2;19224:15;:24;19240:7;19224:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;19295:7;19291:2;19275:28;;19284:5;19275:28;;;;;;;;;;;;18981:330;18903:408;;:::o;35590:38::-;;;;:::o;13854:180::-;13915:7;14000:15;:13;:15::i;:::-;13985:12;;13969:13;;:28;:46;13962:53;;13854:180;:::o;35158:45::-;;;;;;;;;;;;;;;;;:::o;39935:185::-;32103:1;31314:42;32057:43;;;:47;32053:225;;;31314:42;32126:40;;;32175:4;32182:10;32126:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32121:146;;32240:10;32221:30;;;;;;;;;;;:::i;:::-;;;;;;;;32121:146;32053:225;40075:37:::1;40094:4;40100:2;40104:7;40075:18;:37::i;:::-;39935:185:::0;;;:::o;38673:191::-;1327:13;:11;:13::i;:::-;2277:1:::1;2497:7;;:19:::0;2489:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2277:1;2630:7;:18;;;;38742:12:::2;38760:10;:15;;38783:21;38760:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38741:68;;;38828:7;38820:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;38730:134;2233:1:::1;2675:7;:22;;;;38673:191::o:0;39826:101::-;1327:13;:11;:13::i;:::-;39915:4:::1;39898:14;:21;;;;39826:101:::0;:::o;40128:193::-;32103:1;31314:42;32057:43;;;:47;32053:225;;;31314:42;32126:40;;;32175:4;32182:10;32126:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32121:146;;32240:10;32221:30;;;;;;;;;;;:::i;:::-;;;;;;;;32121:146;32053:225;40272:41:::1;40295:4;40301:2;40305:7;40272:22;:41::i;:::-;40128:193:::0;;;:::o;34867:94::-;34933:20;34939:7;34948:4;34933:5;:20::i;:::-;34867:94;:::o;35241:57::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35094:55::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35543:34::-;;;;:::o;16391:152::-;16463:7;16506:27;16525:7;16506:18;:27::i;:::-;16483:52;;16391:152;;;:::o;14319:233::-;14391:7;14432:1;14415:19;;:5;:19;;;14411:60;;14443:28;;;;;;;;;;;;;;14411:60;12127:13;14489:18;:25;14508:5;14489:25;;;;;;;;;;;;;;;;:55;14482:62;;14319:233;;;:::o;1603:103::-;1327:13;:11;:13::i;:::-;1668:30:::1;1695:1;1668:18;:30::i;:::-;1603:103::o:0;1368:87::-;1414:7;1441:6;;;;;;;;;;;1434:13;;1368:87;:::o;39481:97::-;1327:13;:11;:13::i;:::-;39561:9:::1;39548:10;:22;;;;39481:97:::0;:::o;39249:115::-;1327:13;:11;:13::i;:::-;39344:12:::1;39329;:27;;;;;;:::i;:::-;;39249:115:::0;:::o;15851:104::-;15907:13;15940:7;15933:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15851:104;:::o;38990:146::-;1327:13;:11;:13::i;:::-;39089:8:::1;39078;:19;;;;;;:::i;:::-;;39119:9;39108:8;;:20;;;;;;;;;;;;;;;;;;38990:146:::0;;:::o;37550:1115::-;36018:10;36005:23;;:9;:23;;;35997:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2277:1:::1;2497:7;;:19:::0;2489:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2277:1;2630:7;:18;;;;37675:10:::2;37696:9:::0;37733:13:::2;:25;37747:10;37733:25;;;;;;;;;;;;;;;;37708:22;;:50;;;;:::i;:::-;37696:62;;37785:4;37773:8;:16;37769:285;;37841:4;37830:8;:15;;;;:::i;:::-;37815:10;;37814:32;;;;:::i;:::-;37806:40;;37917:4;37889:13;:25;37903:10;37889:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;37861:13;:25;37875:10;37861:25;;;;;;;;;;;;;;;:60;;;;37769:285;;;37962:1;37954:9;;38034:8;38006:13;:25;38020:10;38006:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;37978:13;:25;37992:10;37978:25;;;;;;;;;;;;;;;:64;;;;37769:285;38074:19;;;;;;;;;;;38066:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38166:15;;38154:8;38138:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;38130:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38258:17;;38246:8;38222:21;38232:10;38222:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;38214:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;38362:14;;38350:8;:26;;38342:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38474:5;38461:9;:18;;38453:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38517:31;38527:10;38539:8;38517:9;:31::i;:::-;38577:5;38565:9;:17;38561:97;;;38607:10;38599:28;;:47;38640:5;38628:9;:17;;;;:::i;:::-;38599:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;38561:97;37664:1001;;2233:1:::1;2675:7;:22;;;;37550:1115:::0;:::o;35693:261::-;1327:13;:11;:13::i;:::-;35829:15:::1;;35817:8;35801:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;35779:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;35917:29;35927:8;35937;35917:9;:29::i;:::-;35693:261:::0;;:::o;19545:234::-;19692:8;19640:18;:39;19659:19;:17;:19::i;:::-;19640:39;;;;;;;;;;;;;;;:49;19680:8;19640:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;19752:8;19716:55;;19731:19;:17;:19::i;:::-;19716:55;;;19762:8;19716:55;;;;;;:::i;:::-;;;;;;;;19545:234;;:::o;38872:110::-;1327:13;:11;:13::i;:::-;38955:19:::1;;;;;;;;;;;38954:20;38932:19;;:42;;;;;;;;;;;;;;;;;;38872:110::o:0;35212:20::-;;;;;;;;;;;;;:::o;39586:117::-;1327:13;:11;:13::i;:::-;39691:4:::1;39666:22;:29;;;;39586:117:::0;:::o;36423:1119::-;36018:10;36005:23;;:9;:23;;;35997:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2277:1:::1;2497:7;;:19:::0;2489:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2277:1;2630:7;:18;;;;36552:10:::2;36573:9:::0;36610:13:::2;:25;36624:10;36610:25;;;;;;;;;;;;;;;;36585:22;;:50;;;;:::i;:::-;36573:62;;36662:4;36650:8;:16;36646:285;;36718:4;36707:8;:15;;;;:::i;:::-;36692:10;;36691:32;;;;:::i;:::-;36683:40;;36794:4;36766:13;:25;36780:10;36766:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;36738:13;:25;36752:10;36738:25;;;;;;;;;;;;;;;:60;;;;36646:285;;;36839:1;36831:9;;36911:8;36883:13;:25;36897:10;36883:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;36855:13;:25;36869:10;36855:25;;;;;;;;;;;;;;;:64;;;;36646:285;36951:19;;;;;;;;;;;36943:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37043:15;;37031:8;37015:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37007:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37135:17;;37123:8;37099:21;37109:10;37099:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;37091:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37239:14;;37227:8;:26;;37219:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37351:5;37338:9;:18;;37330:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;37394:31;37404:10;37416:8;37394:9;:31::i;:::-;37454:5;37442:9;:17;37438:97;;;37484:10;37476:28;;:47;37517:5;37505:9;:17;;;;:::i;:::-;37476:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;37438:97;36541:1001;;2233:1:::1;2675:7;:22;;;;36423:1119:::0;:::o;40329:250::-;32103:1;31314:42;32057:43;;;:47;32053:225;;;31314:42;32126:40;;;32175:4;32182:10;32126:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32121:146;;32240:10;32221:30;;;;;;;;;;;:::i;:::-;;;;;;;;32121:146;32053:225;40524:47:::1;40547:4;40553:2;40557:7;40566:4;40524:22;:47::i;:::-;40329:250:::0;;;;:::o;35458:36::-;;;;:::o;40587:341::-;40709:13;40744:8;;;;;;;;;;;40740:181;;;40817:8;40827:26;40844:8;40827:16;:26::i;:::-;40800:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40769:86;;;;40740:181;40895:14;40888:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40587:341;;;;:::o;35503:31::-;;;;:::o;35415:34::-;;;;:::o;35307:51::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39711:107::-;1327:13;:11;:13::i;:::-;39806:4:::1;39786:17;:24;;;;39711:107:::0;:::o;36091:324::-;36144:4;36160:10;36181:9;36218:13;:25;36232:10;36218:25;;;;;;;;;;;;;;;;36193:22;;:50;;;;:::i;:::-;36181:62;;36270:4;36258:8;:16;36254:131;;36326:4;36315:8;:15;;;;:::i;:::-;36300:10;;36299:32;;;;:::i;:::-;36291:40;;36254:131;;;36372:1;36364:9;;36254:131;36402:5;36395:12;;;;36091:324;;;:::o;39144:97::-;39188:13;39221:12;39214:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39144:97;:::o;19787:164::-;19884:4;19908:18;:25;19927:5;19908:25;;;;;;;;;;;;;;;:35;19934:8;19908:35;;;;;;;;;;;;;;;;;;;;;;;;;19901:42;;19787:164;;;;:::o;39372:101::-;1327:13;:11;:13::i;:::-;39461:4:::1;39443:15;:22;;;;39372:101:::0;:::o;1716:201::-;1327:13;:11;:13::i;:::-;1825:1:::1;1805:22;;:8;:22;;::::0;1797:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1881:28;1900:8;1881:18;:28::i;:::-;1716:201:::0;:::o;19959:282::-;20024:4;20080:7;20061:15;:13;:15::i;:::-;:26;;:66;;;;;20114:13;;20104:7;:23;20061:66;:153;;;;;20213:1;12501:8;20165:17;:26;20183:7;20165:26;;;;;;;;;;;;:44;:49;20061:153;20041:173;;19959:282;;;:::o;30339:105::-;30399:7;30426:10;30419:17;;30339:105;:::o;13643:92::-;13699:7;13643:92;:::o;21054:1651::-;21196:27;21226;21245:7;21226:18;:27::i;:::-;21196:57;;21311:4;21270:45;;21286:19;21270:45;;;21266:86;;21324:28;;;;;;;;;;;;;;21266:86;21366:27;21395:23;21422:35;21449:7;21422:26;:35::i;:::-;21365:92;;;;21475:68;21500:15;21517:4;21523:19;:17;:19::i;:::-;21475:24;:68::i;:::-;21470:180;;21563:43;21580:4;21586:19;:17;:19::i;:::-;21563:16;:43::i;:::-;21558:92;;21615:35;;;;;;;;;;;;;;21558:92;21470:180;21681:1;21667:16;;:2;:16;;;21663:52;;21692:23;;;;;;;;;;;;;;21663:52;21728:43;21750:4;21756:2;21760:7;21769:1;21728:21;:43::i;:::-;21811:15;21808:85;;;21876:1;21855:19;21848:30;21808:85;21945:18;:24;21964:4;21945:24;;;;;;;;;;;;;;;;21943:26;;;;;;;;;;;;21987:18;:22;22006:2;21987:22;;;;;;;;;;;;;;;;21985:24;;;;;;;;;;;22056:146;22093:2;22142:45;22157:4;22163:2;22167:19;22142:14;:45::i;:::-;12635:8;22114:73;22056:18;:146::i;:::-;22027:17;:26;22045:7;22027:26;;;;;;;;;;;:175;;;;22274:1;12635:8;22223:19;:47;:52;22219:370;;22296:19;22328:1;22318:7;:11;22296:33;;22388:1;22354:17;:30;22372:11;22354:30;;;;;;;;;;;;:35;22350:224;;22435:13;;22420:11;:28;22416:139;;22512:19;22479:17;:30;22497:11;22479:30;;;;;;;;;;;:52;;;;22416:139;22350:224;22277:312;22219:370;22636:7;22632:2;22617:27;;22626:4;22617:27;;;;;;;;;;;;22655:42;22676:4;22682:2;22686:7;22695:1;22655:20;:42::i;:::-;21185:1520;;;21054:1651;;;:::o;1463:132::-;1538:12;:10;:12::i;:::-;1527:23;;:7;:5;:7::i;:::-;:23;;;1519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1463:132::o;22713:193::-;22859:39;22876:4;22882:2;22886:7;22859:39;;;;;;;;;;;;:16;:39::i;:::-;22713:193;;;:::o;27709:1679::-;27789:27;27819;27838:7;27819:18;:27::i;:::-;27789:57;;27859:12;27890:19;27859:52;;27925:27;27954:23;27981:35;28008:7;27981:26;:35::i;:::-;27924:92;;;;28033:13;28029:244;;;28082:68;28107:15;28124:4;28130:19;:17;:19::i;:::-;28082:24;:68::i;:::-;28077:184;;28174:43;28191:4;28197:19;:17;:19::i;:::-;28174:16;:43::i;:::-;28169:92;;28226:35;;;;;;;;;;;;;;28169:92;28077:184;28029:244;28285:51;28307:4;28321:1;28325:7;28334:1;28285:21;:51::i;:::-;28376:15;28373:101;;;28457:1;28436:19;28429:30;28373:101;28583:1;12258:3;28553:1;:26;;28552:32;28524:18;:24;28543:4;28524:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;28630:176;28667:4;28738:53;28753:4;28767:1;28771:19;28738:14;:53::i;:::-;12635:8;12501;28691:43;28690:101;28630:18;:176::i;:::-;28601:17;:26;28619:7;28601:26;;;;;;;;;;;:205;;;;28878:1;12635:8;28827:19;:47;:52;28823:370;;28900:19;28932:1;28922:7;:11;28900:33;;28992:1;28958:17;:30;28976:11;28958:30;;;;;;;;;;;;:35;28954:224;;29039:13;;29024:11;:28;29020:139;;29116:19;29083:17;:30;29101:11;29083:30;;;;;;;;;;;:52;;;;29020:139;28954:224;28881:312;28823:370;29248:7;29244:1;29221:35;;29230:4;29221:35;;;;;;;;;;;;29267:50;29288:4;29302:1;29306:7;29315:1;29267:20;:50::i;:::-;29355:12;;:14;;;;;;;;;;;;;27778:1610;;;;27709:1679;;:::o;17098:633::-;17165:7;17185:12;17200:7;17185:22;;17268:4;17249:15;:13;:15::i;:::-;:23;17245:419;;17302:13;;17295:4;:20;17291:373;;;17340:14;17357:17;:23;17375:4;17357:23;;;;;;;;;;;;17340:40;;17437:1;12501:8;17409:6;:24;:29;17405:240;;17469:113;17486:1;17476:6;:11;17469:113;;17529:17;:25;17547:6;;;;;;;17529:25;;;;;;;;;;;;17520:34;;17469:113;;;17615:6;17608:13;;;;;;17405:240;17317:347;17291:373;17245:419;17692:31;;;;;;;;;;;;;;17098:633;;;;:::o;1925:191::-;1999:16;2018:6;;;;;;;;;;;1999:25;;2044:8;2035:6;;:17;;;;;;;;;;;;;;;;;;2099:8;2068:40;;2089:8;2068:40;;;;;;;;;;;;1988:128;1925:191;:::o;27492:112::-;27569:27;27579:2;27583:8;27569:27;;;;;;;;;;;;:9;:27::i;:::-;27492:112;;:::o;22914:407::-;23089:31;23102:4;23108:2;23112:7;23089:12;:31::i;:::-;23153:1;23135:2;:14;;;:19;23131:183;;23174:56;23205:4;23211:2;23215:7;23224:5;23174:30;:56::i;:::-;23169:145;;23258:40;;;;;;;;;;;;;;23169:145;23131:183;22914:407;;;;:::o;2879:534::-;2935:13;2976:1;2967:5;:10;2963:53;;2994:10;;;;;;;;;;;;;;;;;;;;;2963:53;3026:12;3041:5;3026:20;;3057:14;3082:78;3097:1;3089:4;:9;3082:78;;3115:8;;;;;:::i;:::-;;;;3146:2;3138:10;;;;;:::i;:::-;;;3082:78;;;3170:19;3202:6;3192:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3170:39;;3220:154;3236:1;3227:5;:10;3220:154;;3264:1;3254:11;;;;;:::i;:::-;;;3331:2;3323:5;:10;;;;:::i;:::-;3310:2;:24;;;;:::i;:::-;3297:39;;3280:6;3287;3280:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3360:2;3351:11;;;;;:::i;:::-;;;3220:154;;;3398:6;3384:21;;;;;2879:534;;;;:::o;20654:392::-;20756:27;20785:23;20826:38;20867:15;:24;20883:7;20867:24;;;;;;;;;;;20826:65;;20951:18;20928:41;;21008:19;21002:26;20983:45;;20913:126;20654:392;;;:::o;20249:397::-;20398:11;20468:16;20461:5;20457:28;20448:37;;20529:16;20518:9;20514:32;20501:45;;20611:15;20600:9;20597:30;20589:5;20578:9;20575:20;20572:56;20562:66;;20249:397;;;;;:::o;23329:159::-;;;;;:::o;30020:311::-;30155:7;30175:16;12698:3;30201:19;:41;;30175:68;;12698:3;30269:31;30280:4;30286:2;30290:9;30269:10;:31::i;:::-;30261:40;;:62;;30254:69;;;30020:311;;;;;:::o;18113:450::-;18193:14;18361:16;18354:5;18350:28;18341:37;;18538:5;18524:11;18499:23;18495:41;18492:52;18485:5;18482:63;18472:73;;18113:450;;;;:::o;23496:158::-;;;;;:::o;816:98::-;869:7;896:10;889:17;;816:98;:::o;26795:689::-;26926:19;26932:2;26936:8;26926:5;:19::i;:::-;27005:1;26987:2;:14;;;:19;26983:483;;27027:11;27041:13;;27027:27;;27073:13;27095:8;27089:3;:14;27073:30;;27122:233;27153:62;27192:1;27196:2;27200:7;;;;;;27209:5;27153:30;:62::i;:::-;27148:167;;27251:40;;;;;;;;;;;;;;27148:167;27350:3;27342:5;:11;27122:233;;27437:3;27420:13;;:20;27416:34;;27442:8;;;27416:34;27008:458;;26983:483;26795:689;;;:::o;23662:716::-;23825:4;23871:2;23846:45;;;23892:19;:17;:19::i;:::-;23913:4;23919:7;23928:5;23846:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23842:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24146:1;24129:6;:13;:18;24125:235;;24175:40;;;;;;;;;;;;;;24125:235;24318:6;24312:13;24303:6;24299:2;24295:15;24288:38;23842:529;24015:54;;;24005:64;;;:6;:64;;;;23998:71;;;23662:716;;;;;;:::o;29865:147::-;30002:6;29865:147;;;;;:::o;24386:1442::-;24459:20;24482:13;;24459:36;;24522:1;24510:8;:13;24506:44;;24532:18;;;;;;;;;;;;;;24506:44;24563:61;24593:1;24597:2;24601:12;24615:8;24563:21;:61::i;:::-;24733:1;12198:2;24703:1;:26;;24702:32;24690:8;:45;24664:18;:22;24683:2;24664:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;24786:139;24823:2;24877:33;24900:1;24904:2;24908:1;24877:14;:33::i;:::-;24844:30;24865:8;24844:20;:30::i;:::-;:66;24786:18;:139::i;:::-;24752:17;:31;24770:12;24752:31;;;;;;;;;;;:173;;;;24942:16;24973:11;25002:8;24987:12;:23;24973:37;;25077:16;25073:2;25069:25;25057:37;;25297:12;25265:8;25240:1;25191:25;25166:1;25141;25114:215;25409:1;25395:12;25391:20;25349:279;25450:3;25441:7;25438:16;25349:279;;25601:7;25591:8;25588:1;25561:25;25558:1;25555;25550:59;25503:1;25494:7;25490:15;25479:26;;25349:279;;;25353:77;25673:1;25661:8;:13;25657:45;;25683:19;;;;;;;;;;;;;;25657:45;25735:3;25719:13;:19;;;;24637:1113;;25760:60;25789:1;25793:2;25797:12;25811:8;25760:20;:60::i;:::-;24448:1380;24386:1442;;:::o;18571:324::-;18641:14;18874:1;18864:8;18861:15;18835:24;18831:46;18821:56;;18571: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:474::-;9811:6;9819;9868:2;9856:9;9847:7;9843:23;9839:32;9836:119;;;9874:79;;:::i;:::-;9836:119;9994:1;10019:53;10064:7;10055:6;10044:9;10040:22;10019:53;:::i;:::-;10009:63;;9965:117;10121:2;10147:53;10192:7;10183:6;10172:9;10168:22;10147:53;:::i;:::-;10137:63;;10092:118;9743:474;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:166::-;16755:18;16751:1;16743:6;16739:14;16732:42;16615:166;:::o;16787:366::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:419::-;17325:4;17363:2;17352:9;17348:18;17340:26;;17412:9;17406:4;17402:20;17398:1;17387:9;17383:17;17376:47;17440:131;17566:4;17440:131;:::i;:::-;17432:139;;17159:419;;;:::o;17584:141::-;17633:4;17656:3;17648:11;;17679:3;17676:1;17669:14;17713:4;17710:1;17700:18;17692:26;;17584:141;;;:::o;17731:93::-;17768:6;17815:2;17810;17803:5;17799:14;17795:23;17785:33;;17731:93;;;:::o;17830:107::-;17874:8;17924:5;17918:4;17914:16;17893:37;;17830:107;;;;:::o;17943:393::-;18012:6;18062:1;18050:10;18046:18;18085:97;18115:66;18104:9;18085:97;:::i;:::-;18203:39;18233:8;18222:9;18203:39;:::i;:::-;18191:51;;18275:4;18271:9;18264:5;18260:21;18251:30;;18324:4;18314:8;18310:19;18303:5;18300:30;18290:40;;18019:317;;17943:393;;;;;:::o;18342:60::-;18370:3;18391:5;18384:12;;18342:60;;;:::o;18408:142::-;18458:9;18491:53;18509:34;18518:24;18536:5;18518:24;:::i;:::-;18509:34;:::i;:::-;18491:53;:::i;:::-;18478:66;;18408:142;;;:::o;18556:75::-;18599:3;18620:5;18613:12;;18556:75;;;:::o;18637:269::-;18747:39;18778:7;18747:39;:::i;:::-;18808:91;18857:41;18881:16;18857:41;:::i;:::-;18849:6;18842:4;18836:11;18808:91;:::i;:::-;18802:4;18795:105;18713:193;18637:269;;;:::o;18912:73::-;18957:3;18912:73;:::o;18991:189::-;19068:32;;:::i;:::-;19109:65;19167:6;19159;19153:4;19109:65;:::i;:::-;19044:136;18991:189;;:::o;19186:186::-;19246:120;19263:3;19256:5;19253:14;19246:120;;;19317:39;19354:1;19347:5;19317:39;:::i;:::-;19290:1;19283:5;19279:13;19270:22;;19246:120;;;19186:186;;:::o;19378:543::-;19479:2;19474:3;19471:11;19468:446;;;19513:38;19545:5;19513:38;:::i;:::-;19597:29;19615:10;19597:29;:::i;:::-;19587:8;19583:44;19780:2;19768:10;19765:18;19762:49;;;19801:8;19786:23;;19762:49;19824:80;19880:22;19898:3;19880:22;:::i;:::-;19870:8;19866:37;19853:11;19824:80;:::i;:::-;19483:431;;19468:446;19378:543;;;:::o;19927:117::-;19981:8;20031:5;20025:4;20021:16;20000:37;;19927:117;;;;:::o;20050:169::-;20094:6;20127:51;20175:1;20171:6;20163:5;20160:1;20156:13;20127:51;:::i;:::-;20123:56;20208:4;20202;20198:15;20188:25;;20101:118;20050:169;;;;:::o;20224:295::-;20300:4;20446:29;20471:3;20465:4;20446:29;:::i;:::-;20438:37;;20508:3;20505:1;20501:11;20495:4;20492:21;20484:29;;20224:295;;;;:::o;20524:1395::-;20641:37;20674:3;20641:37;:::i;:::-;20743:18;20735:6;20732:30;20729:56;;;20765:18;;:::i;:::-;20729:56;20809:38;20841:4;20835:11;20809:38;:::i;:::-;20894:67;20954:6;20946;20940:4;20894:67;:::i;:::-;20988:1;21012:4;20999:17;;21044:2;21036:6;21033:14;21061:1;21056:618;;;;21718:1;21735:6;21732:77;;;21784:9;21779:3;21775:19;21769:26;21760:35;;21732:77;21835:67;21895:6;21888:5;21835:67;:::i;:::-;21829:4;21822:81;21691:222;21026:887;;21056:618;21108:4;21104:9;21096:6;21092:22;21142:37;21174:4;21142:37;:::i;:::-;21201:1;21215:208;21229:7;21226:1;21223:14;21215:208;;;21308:9;21303:3;21299:19;21293:26;21285:6;21278:42;21359:1;21351:6;21347:14;21337:24;;21406:2;21395:9;21391:18;21378:31;;21252:4;21249:1;21245:12;21240:17;;21215:208;;;21451:6;21442:7;21439:19;21436:179;;;21509:9;21504:3;21500:19;21494:26;21552:48;21594:4;21586:6;21582:17;21571:9;21552:48;:::i;:::-;21544:6;21537:64;21459:156;21436:179;21661:1;21657;21649:6;21645:14;21641:22;21635:4;21628:36;21063:611;;;21026:887;;20616:1303;;;20524:1395;;:::o;21925:180::-;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:171::-;23985:23;23981:1;23973:6;23969:14;23962:47;23845:171;:::o;24022:366::-;24164:3;24185:67;24249:2;24244:3;24185:67;:::i;:::-;24178:74;;24261:93;24350:3;24261:93;:::i;:::-;24379:2;24374:3;24370:12;24363:19;;24022:366;;;:::o;24394:419::-;24560:4;24598:2;24587:9;24583:18;24575:26;;24647:9;24641:4;24637:20;24633:1;24622:9;24618:17;24611:47;24675:131;24801:4;24675:131;:::i;:::-;24667:139;;24394:419;;;:::o;24819:165::-;24959:17;24955:1;24947:6;24943:14;24936:41;24819:165;:::o;24990:366::-;25132:3;25153:67;25217:2;25212:3;25153:67;:::i;:::-;25146:74;;25229:93;25318:3;25229:93;:::i;:::-;25347:2;25342:3;25338:12;25331:19;;24990:366;;;:::o;25362:419::-;25528:4;25566:2;25555:9;25551:18;25543:26;;25615:9;25609:4;25605:20;25601:1;25590:9;25586:17;25579:47;25643:131;25769:4;25643:131;:::i;:::-;25635:139;;25362:419;;;:::o;25787:236::-;25927:34;25923:1;25915:6;25911:14;25904:58;25996:19;25991:2;25983:6;25979:15;25972:44;25787:236;:::o;26029:366::-;26171:3;26192:67;26256:2;26251:3;26192:67;:::i;:::-;26185:74;;26268:93;26357:3;26268:93;:::i;:::-;26386:2;26381:3;26377:12;26370:19;;26029:366;;;:::o;26401:419::-;26567:4;26605:2;26594:9;26590:18;26582:26;;26654:9;26648:4;26644:20;26640:1;26629:9;26625:17;26618:47;26682:131;26808:4;26682:131;:::i;:::-;26674:139;;26401:419;;;:::o;26826:248::-;26966:34;26962:1;26954:6;26950:14;26943:58;27035:31;27030:2;27022:6;27018:15;27011:56;26826:248;:::o;27080:366::-;27222:3;27243:67;27307:2;27302:3;27243:67;:::i;:::-;27236:74;;27319:93;27408:3;27319:93;:::i;:::-;27437:2;27432:3;27428:12;27421:19;;27080:366;;;:::o;27452:419::-;27618:4;27656:2;27645:9;27641:18;27633:26;;27705:9;27699:4;27695:20;27691:1;27680:9;27676:17;27669:47;27733:131;27859:4;27733:131;:::i;:::-;27725:139;;27452:419;;;:::o;27877:170::-;28017:22;28013:1;28005:6;28001:14;27994:46;27877:170;:::o;28053:366::-;28195:3;28216:67;28280:2;28275:3;28216:67;:::i;:::-;28209:74;;28292:93;28381:3;28292:93;:::i;:::-;28410:2;28405:3;28401:12;28394:19;;28053:366;;;:::o;28425:419::-;28591:4;28629:2;28618:9;28614:18;28606:26;;28678:9;28672:4;28668:20;28664:1;28653:9;28649:17;28642:47;28706:131;28832:4;28706:131;:::i;:::-;28698:139;;28425:419;;;:::o;28850:174::-;28990:26;28986:1;28978:6;28974:14;28967:50;28850:174;:::o;29030:366::-;29172:3;29193:67;29257:2;29252:3;29193:67;:::i;:::-;29186:74;;29269:93;29358:3;29269:93;:::i;:::-;29387:2;29382:3;29378:12;29371:19;;29030:366;;;:::o;29402:419::-;29568:4;29606:2;29595:9;29591:18;29583:26;;29655:9;29649:4;29645:20;29641:1;29630:9;29626:17;29619:47;29683:131;29809:4;29683:131;:::i;:::-;29675:139;;29402:419;;;:::o;29827:148::-;29929:11;29966:3;29951:18;;29827:148;;;;:::o;30005:874::-;30108:3;30145:5;30139:12;30174:36;30200:9;30174:36;:::i;:::-;30226:89;30308:6;30303:3;30226:89;:::i;:::-;30219:96;;30346:1;30335:9;30331:17;30362:1;30357:166;;;;30537:1;30532:341;;;;30324:549;;30357:166;30441:4;30437:9;30426;30422:25;30417:3;30410:38;30503:6;30496:14;30489:22;30481:6;30477:35;30472:3;30468:45;30461:52;;30357:166;;30532:341;30599:38;30631:5;30599:38;:::i;:::-;30659:1;30673:154;30687:6;30684:1;30681:13;30673:154;;;30761:7;30755:14;30751:1;30746:3;30742:11;30735:35;30811:1;30802:7;30798:15;30787:26;;30709:4;30706:1;30702:12;30697:17;;30673:154;;;30856:6;30851:3;30847:16;30840:23;;30539:334;;30324:549;;30112:767;;30005:874;;;;:::o;30885:390::-;30991:3;31019:39;31052:5;31019:39;:::i;:::-;31074:89;31156:6;31151:3;31074:89;:::i;:::-;31067:96;;31172:65;31230:6;31225:3;31218:4;31211:5;31207:16;31172:65;:::i;:::-;31262:6;31257:3;31253:16;31246:23;;30995:280;30885:390;;;;:::o;31281:429::-;31458:3;31480:92;31568:3;31559:6;31480:92;:::i;:::-;31473:99;;31589:95;31680:3;31671:6;31589:95;:::i;:::-;31582:102;;31701:3;31694:10;;31281:429;;;;;:::o;31716:225::-;31856:34;31852:1;31844:6;31840:14;31833:58;31925:8;31920:2;31912:6;31908:15;31901:33;31716:225;:::o;31947:366::-;32089:3;32110:67;32174:2;32169:3;32110:67;:::i;:::-;32103:74;;32186:93;32275:3;32186:93;:::i;:::-;32304:2;32299:3;32295:12;32288:19;;31947:366;;;:::o;32319:419::-;32485:4;32523:2;32512:9;32508:18;32500:26;;32572:9;32566:4;32562:20;32558:1;32547:9;32543:17;32536:47;32600:131;32726:4;32600:131;:::i;:::-;32592:139;;32319:419;;;:::o;32744:182::-;32884:34;32880:1;32872:6;32868:14;32861:58;32744:182;:::o;32932:366::-;33074:3;33095:67;33159:2;33154:3;33095:67;:::i;:::-;33088:74;;33171:93;33260:3;33171:93;:::i;:::-;33289:2;33284:3;33280:12;33273:19;;32932:366;;;:::o;33304:419::-;33470:4;33508:2;33497:9;33493:18;33485:26;;33557:9;33551:4;33547:20;33543:1;33532:9;33528:17;33521:47;33585:131;33711:4;33585:131;:::i;:::-;33577:139;;33304:419;;;:::o;33729:233::-;33768:3;33791:24;33809:5;33791:24;:::i;:::-;33782:33;;33837:66;33830:5;33827:77;33824:103;;33907:18;;:::i;:::-;33824:103;33954:1;33947:5;33943:13;33936:20;;33729:233;;;:::o;33968:180::-;34016:77;34013:1;34006:88;34113:4;34110:1;34103:15;34137:4;34134:1;34127:15;34154:185;34194:1;34211:20;34229:1;34211:20;:::i;:::-;34206:25;;34245:20;34263:1;34245:20;:::i;:::-;34240:25;;34284:1;34274:35;;34289:18;;:::i;:::-;34274:35;34331:1;34328;34324:9;34319:14;;34154:185;;;;:::o;34345:176::-;34377:1;34394:20;34412:1;34394:20;:::i;:::-;34389:25;;34428:20;34446:1;34428:20;:::i;:::-;34423:25;;34467:1;34457:35;;34472:18;;:::i;:::-;34457:35;34513:1;34510;34506:9;34501:14;;34345:176;;;;:::o;34527:180::-;34575:77;34572:1;34565:88;34672:4;34669:1;34662:15;34696:4;34693:1;34686:15;34713:98;34764:6;34798:5;34792:12;34782:22;;34713:98;;;:::o;34817:168::-;34900:11;34934:6;34929:3;34922:19;34974:4;34969:3;34965:14;34950:29;;34817:168;;;;:::o;34991:373::-;35077:3;35105:38;35137:5;35105:38;:::i;:::-;35159:70;35222:6;35217:3;35159:70;:::i;:::-;35152:77;;35238:65;35296:6;35291:3;35284:4;35277:5;35273:16;35238:65;:::i;:::-;35328:29;35350:6;35328:29;:::i;:::-;35323:3;35319:39;35312:46;;35081:283;34991:373;;;;:::o;35370:640::-;35565:4;35603:3;35592:9;35588:19;35580:27;;35617:71;35685:1;35674:9;35670:17;35661:6;35617:71;:::i;:::-;35698:72;35766:2;35755:9;35751:18;35742:6;35698:72;:::i;:::-;35780;35848:2;35837:9;35833:18;35824:6;35780:72;:::i;:::-;35899:9;35893:4;35889:20;35884:2;35873:9;35869:18;35862:48;35927:76;35998:4;35989:6;35927:76;:::i;:::-;35919:84;;35370:640;;;;;;;:::o;36016:141::-;36072:5;36103:6;36097:13;36088:22;;36119:32;36145:5;36119:32;:::i;:::-;36016:141;;;;:::o;36163:349::-;36232:6;36281:2;36269:9;36260:7;36256:23;36252:32;36249:119;;;36287:79;;:::i;:::-;36249:119;36407:1;36432:63;36487:7;36478:6;36467:9;36463:22;36432:63;:::i;:::-;36422:73;;36378:127;36163:349;;;;:::o

Swarm Source

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