ETH Price: $2,872.40 (-2.60%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Safe Batch Trans...411851032026-01-23 9:12:332 days ago1769159553IN
0x38ba98Ad...01c674Ff4
0 ETH0.000010750.00487421
Batch Burn411849062026-01-23 9:05:592 days ago1769159159IN
0x38ba98Ad...01c674Ff4
0 ETH0.000006070.0053884
Batch Burn411848862026-01-23 9:05:192 days ago1769159119IN
0x38ba98Ad...01c674Ff4
0 ETH0.000009280.00550454
Safe Batch Trans...411848132026-01-23 9:02:532 days ago1769158973IN
0x38ba98Ad...01c674Ff4
0 ETH0.000016260.00579239
Safe Batch Trans...411847962026-01-23 9:02:192 days ago1769158939IN
0x38ba98Ad...01c674Ff4
0 ETH0.000001290.00586896
Batch Burn408842172026-01-16 10:03:019 days ago1768557781IN
0x38ba98Ad...01c674Ff4
0 ETH0.000023870.01530454
Batch Burn408840292026-01-16 9:56:459 days ago1768557405IN
0x38ba98Ad...01c674Ff4
0 ETH0.000003120.0059717
Safe Batch Trans...408839402026-01-16 9:53:479 days ago1768557227IN
0x38ba98Ad...01c674Ff4
0 ETH0.000002250.00620299
Safe Batch Trans...408839282026-01-16 9:53:239 days ago1768557203IN
0x38ba98Ad...01c674Ff4
0 ETH0.000017370.0062576
Safe Batch Trans...408837902026-01-16 9:48:479 days ago1768556927IN
0x38ba98Ad...01c674Ff4
0 ETH0.000017590.00603353
Batch Burn408424292026-01-15 10:50:0510 days ago1768474205IN
0x38ba98Ad...01c674Ff4
0 ETH0.000001580.00543117
Safe Batch Trans...407808402026-01-14 0:37:0712 days ago1768351027IN
0x38ba98Ad...01c674Ff4
0 ETH0.000001390.0063164
Batch Burn407630312026-01-13 14:43:2912 days ago1768315409IN
0x38ba98Ad...01c674Ff4
0 ETH0.0000040.01
Batch Burn407617392026-01-13 14:00:2512 days ago1768312825IN
0x38ba98Ad...01c674Ff4
0 ETH0.000005080.00416378
Batch Burn407616092026-01-13 13:56:0512 days ago1768312565IN
0x38ba98Ad...01c674Ff4
0 ETH0.000007840.00492683
Safe Batch Trans...406621012026-01-11 6:39:0914 days ago1768113549IN
0x38ba98Ad...01c674Ff4
0 ETH0.000003560.0015
Safe Batch Trans...406620912026-01-11 6:38:4914 days ago1768113529IN
0x38ba98Ad...01c674Ff4
0 ETH0.00000440.0015
Batch Burn406618662026-01-11 6:31:1914 days ago1768113079IN
0x38ba98Ad...01c674Ff4
0 ETH0.000001090.0015
Batch Burn406618542026-01-11 6:30:5514 days ago1768113055IN
0x38ba98Ad...01c674Ff4
0 ETH0.000002290.00150775
Safe Batch Trans...405740082026-01-09 5:42:4316 days ago1767937363IN
0x38ba98Ad...01c674Ff4
0 ETH0.0000090.00351765
Safe Batch Trans...405739902026-01-09 5:42:0716 days ago1767937327IN
0x38ba98Ad...01c674Ff4
0 ETH0.000010110.00353926
Safe Batch Trans...405739762026-01-09 5:41:3916 days ago1767937299IN
0x38ba98Ad...01c674Ff4
0 ETH0.000001380.00354254
Batch Burn405717352026-01-09 4:26:5716 days ago1767932817IN
0x38ba98Ad...01c674Ff4
0 ETH0.000004380.00310557
Batch Burn405717082026-01-09 4:26:0316 days ago1767932763IN
0x38ba98Ad...01c674Ff4
0 ETH0.000004850.0030959
Safe Batch Trans...404643662026-01-06 16:47:5919 days ago1767718079IN
0x38ba98Ad...01c674Ff4
0 ETH0.000012620.00881528
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Hero

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 9999999 runs

Other Settings:
default evmVersion, BSD-2-Clause license

Contract Source Code (Solidity Multiple files format)

File 1 of 20: Hero.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./MoneyUtil.sol";

import "./Card.sol";

// country  order   skin    star    tokenAmount padding shop    mintTime    index
// 8        24      8       8       72          24      16      40          56
// 248      224     216     208     136         112     96      56          0

contract Hero is Card {
    uint256 public burnLockDuration = 2 days;

    uint256 public lossRate = 0.03e18;
    uint256 public lossRateWhite = 0.05e18;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {}

    function setBurnLockDuration(uint256 duration) external onlyOwner {
        burnLockDuration = duration;
    }

    function setLossRate(uint256 rate) external onlyOwner {
        lossRate = rate;
    }

    function setLossRateWhite(uint256 rate) external onlyOwner {
        lossRateWhite = rate;
    }

    function burn(uint256 cardId) public override {
        address owner = tokenOwners[cardId];

        require(
            msg.sender == owner ||
                msg.sender == tokenApprovals[cardId] ||
                approvalForAlls[owner][msg.sender],
            "msg.sender must be owner or approved"
        );

        uint256 lr;

        if (containsAddressMap("burnWhiteList", msg.sender)) {
            lr = lossRateWhite;
        } else {
            uint256 mintTime = uint40(cardId >> 56);
            require(
                mintTime + burnLockDuration < block.timestamp,
                "hero has not unlocked"
            );

            lr = lossRate;
        }

        _burn(cardId);

        uint256 tokenAmount = uint72(cardId >> 136);
        uint256 loss = (tokenAmount * lr) / Util.DENO;

        address money = manager.members("token");
        MoneyUtil.transfer(money, address(this), owner, tokenAmount - loss);
        MoneyUtil.transfer(
            money,
            address(this),
            manager.members("cashier"),
            loss
        );
    }
}

File 2 of 20: AddressMap.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./AddressSet.sol";

import "./Ownable.sol";

abstract contract AddressMap is Ownable {
    using AddressSet for AddressSet.Set;

    mapping(string => AddressSet.Set) internal addressMap;

    modifier checkAddressMap(string memory key) {
        require(
            addressMap[key].contains(msg.sender),
            "sender not in addressMap"
        );
        _;
    }

    function addAddressMap(
        string memory key,
        address account
    ) public onlyOwner returns (bool) {
        return addressMap[key].add(account);
    }

    function removeAddressMap(
        string memory key,
        address account
    ) public onlyOwner returns (bool) {
        return addressMap[key].remove(account);
    }

    function getAddressMapLength(
        string memory key
    ) public view returns (uint256) {
        return addressMap[key].length();
    }

    // [startIndex, endIndex)
    function getAddressMaps(
        string memory key,
        uint256 startIndex,
        uint256 endIndex
    ) public view returns (address[] memory) {
        return addressMap[key].get(startIndex, endIndex);
    }

    function containsAddressMap(
        string memory key,
        address account
    ) public view returns (bool) {
        return addressMap[key].contains(account);
    }
}

File 3 of 20: AddressSet.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

library AddressSet {
    struct Set {
        mapping(address => uint256) indexes;
        address[] addresses;
    }
    
    function add(Set storage set, address addr) internal returns(bool) {
        if (contains(set, addr)) {
            return false;
        }
        
        set.indexes[addr] = set.addresses.length;
        set.addresses.push(addr);
        
        return true;
    }
    
    function remove(Set storage set, address addr) internal returns(bool) {
        if (!contains(set, addr)) {
            return false;
        }
        
        uint256 index = set.indexes[addr];
        address tail = set.addresses[set.addresses.length - 1];
        
        set.indexes[tail] = index;
        set.indexes[addr] = 0;
        
        set.addresses[index] = tail;
        set.addresses.pop();
        
        return true;
    }
    
    function contains(Set storage set, address addr) internal view returns(bool) {
        uint256 index = set.indexes[addr];
        return index < set.addresses.length && set.addresses[index] == addr;
    }
    
    function indexOf(Set storage set, address addr) internal view returns(uint256) {
        if (contains(set, addr)) {
            return set.indexes[addr];
        } else {
            return ~uint256(0);
        }
    }
    
    function length(Set storage set) internal view returns(uint256) {
        return set.addresses.length;
    }
    
    function get(Set storage set) internal view returns(address[] memory) {
        return set.addresses;
    }
    
    function get(Set storage set, uint256 index)
        internal view returns(address) {
        
        require(index < set.addresses.length, "invalid index");
        
        return set.addresses[index];
    }
    
    // [startIndex, endIndex)
    function get(Set storage set, uint256 startIndex, uint256 endIndex)
        internal view returns(address[] memory) {
        
        if (endIndex == 0) {
            endIndex = set.addresses.length;
        }
        
        require(startIndex <= endIndex && endIndex <= set.addresses.length,
            "invalid index");
        
        address[] memory result = new address[](endIndex - startIndex);
        
        for (uint256 i = startIndex; i < endIndex; ++i) {
            result[i - startIndex] = set.addresses[i];
        }
        
        return result;
    }
}

File 4 of 20: Card.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./ERC721Ex.sol";

// padding  shop    mintTime    index
// 144      16      40          56
// 112      96      56          0

abstract contract Card is ERC721Ex {
    // except mintTime and index
    uint256 public constant CARD_ID_PREFIX_MASK = uint256(~uint160(0)) << 96;
    
    function mint(address to, uint256 cardIdPre) external checkAddressMap("package") {
        uint256 cardId = (cardIdPre & CARD_ID_PREFIX_MASK) |
            (uint256(uint40(block.timestamp)) << 56) |
            uint56(totalSupply + 1);
        
        _mint(to, cardId);
    }
    
    function burn(uint256 cardId) public virtual;
    
    function batchBurn(uint256[] memory cardIds) external {
        for (uint256 i = 0; i < cardIds.length; ++i) {
            burn(cardIds[i]);
        }
    }
}

File 5 of 20: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

File 6 of 20: ERC721.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./IERC165.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721TokenReceiver.sol";

import "./Util.sol";

abstract contract ERC721 is IERC165, IERC721, IERC721Metadata {
    /*
     * bytes4(keccak256("supportsInterface(bytes4)")) == 0x01ffc9a7
     */
    bytes4 private constant INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /*
     *     bytes4(keccak256("balanceOf(address)")) == 0x70a08231
     *     bytes4(keccak256("ownerOf(uint256)")) == 0x6352211e
     *     bytes4(keccak256("approve(address,uint256)")) == 0x095ea7b3
     *     bytes4(keccak256("getApproved(uint256)")) == 0x081812fc
     *     bytes4(keccak256("setApprovalForAll(address,bool)")) == 0xa22cb465
     *     bytes4(keccak256("isApprovedForAll(address,address)")) == 0xe985e9c5
     *     bytes4(keccak256("transferFrom(address,address,uint256)")) == 0x23b872dd
     *     bytes4(keccak256("safeTransferFrom(address,address,uint256)")) == 0x42842e0e
     *     bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant INTERFACE_ID_ERC721 = 0x80ac58cd;

    bytes4 private constant INTERFACE_ID_ERC721Metadata = 0x5b5e139f;

    string public override name;
    string public override symbol;

    mapping(address => uint256[]) internal ownerTokens;
    mapping(uint256 => uint256) internal tokenIndexs;
    mapping(uint256 => address) internal tokenOwners;

    mapping(uint256 => address) internal tokenApprovals;
    mapping(address => mapping(address => bool)) internal approvalForAlls;

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    function balanceOf(address owner) external view override returns (uint256) {
        require(owner != address(0), "owner is zero address");
        return ownerTokens[owner].length;
    }

    // [startIndex, endIndex)
    function tokensOf(
        address owner,
        uint256 startIndex,
        uint256 endIndex
    ) external view returns (uint256[] memory) {
        require(owner != address(0), "owner is zero address");

        uint256[] storage tokens = ownerTokens[owner];
        if (endIndex == 0) {
            endIndex = tokens.length;
        }

        uint256[] memory result = new uint256[](endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; ++i) {
            result[i - startIndex] = tokens[i];
        }

        return result;
    }

    function ownerOf(uint256 tokenId) external view override returns (address) {
        address owner = tokenOwners[tokenId];
        require(owner != address(0), "nobody own the token");
        return owner;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public payable override {
        _transferFrom(from, to, tokenId);

        if (to.code.length > 0) {
            require(
                IERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    data
                ) == IERC721TokenReceiver.onERC721Received.selector,
                "onERC721Received() return invalid"
            );
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable override {
        _transferFrom(from, to, tokenId);
    }

    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(from != address(0), "from is zero address");
        require(to != address(0), "to is zero address");

        require(from == tokenOwners[tokenId], "from must be owner");

        require(
            msg.sender == from ||
                msg.sender == tokenApprovals[tokenId] ||
                approvalForAlls[from][msg.sender],
            "sender must be owner or approvaled"
        );

        if (tokenApprovals[tokenId] != address(0)) {
            delete tokenApprovals[tokenId];
        }

        _removeTokenFrom(from, tokenId);
        _addTokenTo(to, tokenId);

        emit Transfer(from, to, tokenId);
    }

    // ensure everything is ok before call it
    function _removeTokenFrom(address from, uint256 tokenId) internal {
        uint256 index = tokenIndexs[tokenId];

        uint256[] storage tokens = ownerTokens[from];
        uint256 indexLast = tokens.length - 1;

        // save gas
        // if (index != indexLast) {
        uint256 tokenIdLast = tokens[indexLast];
        tokens[index] = tokenIdLast;
        tokenIndexs[tokenIdLast] = index;
        // }

        tokens.pop();

        // delete tokenIndexs[tokenId]; // save gas
        delete tokenOwners[tokenId];
    }

    // ensure everything is ok before call it
    function _addTokenTo(address to, uint256 tokenId) internal {
        uint256[] storage tokens = ownerTokens[to];
        tokenIndexs[tokenId] = tokens.length;
        tokens.push(tokenId);

        tokenOwners[tokenId] = to;
    }

    function approve(address to, uint256 tokenId) external payable override {
        address owner = tokenOwners[tokenId];

        require(
            msg.sender == owner || approvalForAlls[owner][msg.sender],
            "sender must be owner or approved for all"
        );

        tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function setApprovalForAll(address to, bool approved) external override {
        approvalForAlls[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    function getApproved(
        uint256 tokenId
    ) external view override returns (address) {
        require(tokenOwners[tokenId] != address(0), "nobody own then token");

        return tokenApprovals[tokenId];
    }

    function isApprovedForAll(
        address owner,
        address operator
    ) external view override returns (bool) {
        return approvalForAlls[owner][operator];
    }

    function supportsInterface(
        bytes4 interfaceID
    ) external pure override returns (bool) {
        return
            interfaceID == INTERFACE_ID_ERC165 ||
            interfaceID == INTERFACE_ID_ERC721 ||
            interfaceID == INTERFACE_ID_ERC721Metadata;
    }
}

File 7 of 20: ERC721Ex.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./IERC721TokenReceiverEx.sol";

import "./String.sol";
import "./Util.sol";

import "./ERC721.sol";
import "./Member.sol";

abstract contract ERC721Ex is ERC721, Member {
    using String for string;

    uint256 public totalSupply = 0;

    string public uriPrefix;

    function _mint(address to, uint256 tokenId) internal {
        _addTokenTo(to, tokenId);

        ++totalSupply;

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal {
        address owner = tokenOwners[tokenId];
        _removeTokenFrom(owner, tokenId);

        if (tokenApprovals[tokenId] != address(0)) {
            delete tokenApprovals[tokenId];
        }

        emit Transfer(owner, address(0), tokenId);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory tokenIds
    ) external {
        safeBatchTransferFrom(from, to, tokenIds, "");
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory tokenIds,
        bytes memory data
    ) public {
        batchTransferFrom(from, to, tokenIds);

        if (to.code.length > 0) {
            require(
                IERC721TokenReceiverEx(to).onERC721ExReceived(
                    msg.sender,
                    from,
                    tokenIds,
                    data
                ) == IERC721TokenReceiverEx.onERC721ExReceived.selector,
                "onERC721ExReceived() return invalid"
            );
        }
    }

    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory tokenIds
    ) public {
        require(from != address(0), "from is zero address");
        require(to != address(0), "to is zero address");

        address sender = msg.sender;
        bool approval = from == sender || approvalForAlls[from][sender];

        for (uint256 i = 0; i < tokenIds.length; ++i) {
            uint256 tokenId = tokenIds[i];

            require(from == tokenOwners[tokenId], "from must be owner");
            require(
                approval || sender == tokenApprovals[tokenId],
                "sender must be owner or approvaled"
            );

            if (tokenApprovals[tokenId] != address(0)) {
                delete tokenApprovals[tokenId];
            }

            _removeTokenFrom(from, tokenId);
            _addTokenTo(to, tokenId);

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

    function setUriPrefix(string memory prefix) external onlyOwner {
        uriPrefix = prefix;
    }

    function tokenURI(
        uint256 cardId
    ) external view virtual override returns (string memory) {
        bytes memory bs = abi.encodePacked(cardId);
        return uriPrefix.concat(Util.base64Encode(bs));
    }
}

File 8 of 20: IERC165.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns(bool);
}

File 9 of 20: IERC20.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    
    function name() external view returns(string memory);
    function symbol() external view returns(string memory);
    function decimals() external view returns(uint8);
    function totalSupply() external view returns(uint256);
    function balanceOf(address owner) external view returns(uint256);
    function allowance(address owner, address spender) external view returns(uint256);
    
    function approve(address spender, uint256 value) external returns(bool);
    function transfer(address to, uint256 value) external returns(bool);
    function transferFrom(address from, address to, uint256 value) external returns(bool);
}

File 10 of 20: IERC721.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns(uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns(address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns(address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns(bool);
}

File 11 of 20: IERC721Metadata.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory);
    
    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory);
    
    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    /// {"name":"","description":"","image":""}
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

File 12 of 20: IERC721TokenReceiver.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

File 13 of 20: IERC721TokenReceiverEx.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

interface IERC721TokenReceiverEx {
    // bytes4(keccak256("onERC721ExReceived(address,address,uint256[],bytes)")) = 0x0f7b88e3
    function onERC721ExReceived(address operator, address from,
        uint256[] memory tokenIds, bytes memory data)
        external returns(bytes4);
}

File 14 of 20: Manager.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./AddressSet.sol";

import "./Ownable.sol";

contract Manager is Ownable {
    using AddressSet for AddressSet.Set;

    mapping(string => address) public members;

    mapping(string => AddressSet.Set) internal permits;

    modifier onlyPermit(string memory permit) {
        require(permits[permit].contains(msg.sender), "no permit");
        _;
    }

    function setMember(string memory name, address member) external onlyOwner {
        members[name] = member;
    }

    function addPermit(
        string memory permit,
        address account
    ) external onlyOwner {
        require(permits[permit].add(account), "account existed");
    }

    function removePermit(
        string memory permit,
        address account
    ) external onlyOwner {
        require(permits[permit].remove(account), "account not existed");
    }

    function removePermitAll(string memory permit) external onlyOwner {
        delete permits[permit];
    }

    function getPermitLength(
        string memory permit
    ) external view returns (uint256) {
        return permits[permit].length();
    }

    // [startIndex, endIndex)
    function getPermitMaps(
        string memory permit,
        uint256 startIndex,
        uint256 endIndex
    ) external view returns (address[] memory) {
        return permits[permit].get(startIndex, endIndex);
    }

    function containsPermit(
        string memory permit,
        address account
    ) public view returns (bool) {
        return permits[permit].contains(account);
    }

    function requirePermit(string memory permit, address account) public view {
        require(containsPermit(permit, account), "not permit");
    }

    function getTimestamp() external view returns (uint256) {
        return block.timestamp;
    }
}

File 15 of 20: Member.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./AddressMap.sol";

import "./Manager.sol";

abstract contract Member is AddressMap {
    Manager public manager;

    modifier onlyPermit(string memory permit) {
        require(manager.containsPermit(permit, msg.sender), "no permit");
        _;
    }

    function setManager(address addr) external onlyOwner {
        manager = Manager(addr);
    }
}

File 16 of 20: MoneyUtil.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./IERC20.sol";

import "./SafeERC20.sol";

// address(0) for ETH

library MoneyUtil {
    function balanceOf(
        address money,
        address account
    ) internal view returns (uint256) {
        if (money == address(0)) {
            return account.balance;
        } else {
            return IERC20(money).balanceOf(account);
        }
    }

    function approve(address money, address spender, uint256 amount) internal {
        SafeERC20.safeApprove(money, spender, amount);
    }

    function transfer(
        address money,
        address from,
        address to,
        uint256 amount
    ) internal {
        if (money == address(0)) {
            if (from == address(this)) {
                payable(to).transfer(amount);
            } else if (to == address(this)) {
                require(from == msg.sender, "transfer ETH from invalid");
                require(msg.value == amount, "transfer ETH value invalid");
            } else {
                revert("transfer ETH invalid");
            }
        } else {
            if (from == address(this)) {
                SafeERC20.transfer(money, to, amount);
            } else {
                SafeERC20.transferFrom(money, from, to, amount);
            }
        }
    }

    function receiveExceed(
        address money,
        uint256 amount
    ) internal returns (uint256) {
        if (money == address(0)) {
            require(msg.value >= amount, "receive ETH value invalid");
            return msg.value - amount;
        } else {
            transfer(money, msg.sender, address(this), amount);
            return 0;
        }
    }
}

File 17 of 20: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 18 of 20: SafeERC20.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

import "./IERC20.sol";

library SafeERC20 {
    function transfer(address token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.transfer.selector, to, value));
    }
	
    function transferFrom(address token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.transferFrom.selector, from, to, value));
    }
	
    function approve(address token, address spender, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.approve.selector, spender, value));
    }
	
    function safeApprove(address token, address spender, uint256 value) internal {
        require((value == 0) || (IERC20(token).allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.approve.selector, spender, value));
    }
	
    function increaseAllowance(address token, address spender, uint256 value) internal {
        uint256 newAllowance = IERC20(token).allowance(address(this), spender) + value;
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.approve.selector, spender, newAllowance));
    }
	
    function decreaseAllowance(address token, address spender, uint256 value) internal {
        uint256 newAllowance = IERC20(token).allowance(address(this), spender) - value;
        callOptionalReturn(token, abi.encodeWithSelector(
            IERC20.approve.selector, spender, newAllowance));
    }
	
    function callOptionalReturn(address token, bytes memory data) private {
        (bool success, bytes memory returndata) = token.call(data);
        require(success, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


File 19 of 20: String.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

library String {
    function equals(string memory a, string memory b)
        internal pure returns(bool) {
        
        bytes memory ba = bytes(a);
        bytes memory bb = bytes(b);
        
        if (ba.length != bb.length) {
            return false;
        }
        
        uint256 length = ba.length;
        
        for (uint256 i = 0; i < length; ++i) {
            if (ba[i] != bb[i]) {
                return false;
            }
        }
        
        return true;
    }
    
    function concat(string memory a, string memory b)
        internal pure returns(string memory) {
        
        return string(abi.encodePacked(a, b));
    }
    
    function utf8length(string memory s) internal pure returns(uint256) {
        bytes memory bs = bytes(s);
        uint256 bytelength = bs.length;
        uint256 length = 0;
        
        for (uint256 i = 0; i < bytelength; ++length) {
            bytes1 b = bs[i];
            
            if (b < 0x80) {
                i += 1;
            } else if (b < 0xE0) {
                i += 2;
            } else if (b < 0xF0) {
                i += 3;
            } else if (b < 0xF8) {
                i += 4;
            } else if (b < 0xFC) {
                i += 5;
            } else {
                i += 6;
            }
        }
        
        return length;
    }
}

File 20 of 20: Util.sol
pragma solidity =0.8.6;

// SPDX-License-Identifier: SimPL-2.0

library Util {
    uint256 internal constant DENO = 1e18;

    bytes internal constant BASE64_CHARS =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

    function randomUint(
        bytes memory seed,
        uint256 min,
        uint256 max
    ) internal pure returns (uint256) {
        if (min >= max) {
            return min;
        }

        uint256 number = uint256(keccak256(seed));
        return (number % (max - min + 1)) + min;
    }

    function randomWeight(
        bytes memory seed,
        uint256[] memory weights,
        uint256 totalWeight
    ) internal pure returns (uint256) {
        uint256 number = Util.randomUint(seed, 1, totalWeight);

        for (uint256 i = weights.length - 1; i > 0; --i) {
            if (number <= weights[i]) {
                return i;
            }

            number -= weights[i];
        }

        return 0;
    }

    function randomProb(
        bytes memory seed,
        uint256 nume,
        uint256 deno
    ) internal pure returns (bool) {
        uint256 rand = Util.randomUint(seed, 1, deno);
        return rand <= nume;
    }

    function base64Encode(
        bytes memory bs
    ) internal pure returns (string memory) {
        uint256 remain = bs.length % 3;
        uint256 length = (bs.length / 3) * 4;
        bytes memory result = new bytes(
            length + (remain != 0 ? 4 : 0) + ((3 - remain) % 3)
        );

        uint256 i = 0;
        uint256 j = 0;
        while (i < length) {
            result[i++] = Util.BASE64_CHARS[uint8(bs[j] >> 2)];
            result[i++] = Util.BASE64_CHARS[
                uint8(((bs[j] & 0x03) << 4) | (bs[j + 1] >> 4))
            ];
            result[i++] = Util.BASE64_CHARS[
                uint8(((bs[j + 1] & 0x0f) << 2) | (bs[j + 2] >> 6))
            ];
            result[i++] = Util.BASE64_CHARS[uint8(bs[j + 2] & 0x3f)];

            j += 3;
        }

        if (remain != 0) {
            result[i++] = Util.BASE64_CHARS[uint8(bs[j] >> 2)];

            if (remain == 2) {
                result[i++] = Util.BASE64_CHARS[
                    uint8(((bs[j] & 0x03) << 4) | (bs[j + 1] >> 4))
                ];
                result[i++] = Util.BASE64_CHARS[uint8((bs[j + 1] & 0x0f) << 2)];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = 0x3d;
            } else {
                result[i++] = Util.BASE64_CHARS[uint8((bs[j] & 0x03) << 4)];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = 0x3d;
                result[i++] = 0x3d;
            }
        }

        return string(result);
    }

    function calcBuffer(
        uint256 value,
        uint256 buffer
    ) internal pure returns (uint256) {
        return (value * (DENO + buffer)) / DENO;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CARD_ID_PREFIX_MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"addAddressMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"cardIds","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"containsAddressMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"getAddressMapLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getAddressMaps","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"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":"lossRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossRateWhite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"cardIdPre","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"removeAddressMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"tokenIds","type":"uint256[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setBurnLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setLossRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setLossRateWhite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"tokensOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526000600a556202a300600c55666a94d74f430000600d5566b1a2bc2ec50000600e553480156200003357600080fd5b50604051620049253803806200492583398101604081905262000056916200025d565b8151829082906200006f90600090602085019062000100565b5080516200008590600190602084019062000100565b505050620000a26200009c620000aa60201b60201c565b620000ae565b50506200031a565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010e90620002c7565b90600052602060002090601f0160209004810192826200013257600085556200017d565b82601f106200014d57805160ff19168380011785556200017d565b828001600101855582156200017d579182015b828111156200017d57825182559160200191906001019062000160565b506200018b9291506200018f565b5090565b5b808211156200018b576000815560010162000190565b600082601f830112620001b857600080fd5b81516001600160401b0380821115620001d557620001d562000304565b604051601f8301601f19908116603f0116810190828211818310171562000200576200020062000304565b816040528381526020925086838588010111156200021d57600080fd5b600091505b8382101562000241578582018301518183018401529082019062000222565b83821115620002535760008385830101525b9695505050505050565b600080604083850312156200027157600080fd5b82516001600160401b03808211156200028957600080fd5b6200029786838701620001a6565b93506020850151915080821115620002ae57600080fd5b50620002bd85828601620001a6565b9150509250929050565b600181811c90821680620002dc57607f821691505b60208210811415620002fe57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6145fb806200032a6000396000f3fe6080604052600436106102bb5760003560e01c80637ec4a6591161016e578063aaf29651116100cb578063d0ebdbe71161007f578063e985e9c511610064578063e985e9c514610775578063f2fde38b146107cb578063f3993d11146107eb57600080fd5b8063d0ebdbe714610735578063dc8e92ea1461075557600080fd5b8063b88d4fde116100b0578063b88d4fde146106ec578063c726d1b9146106ff578063c87b56dd1461071557600080fd5b8063aaf29651146106ac578063b66f599c146106cc57600080fd5b806395d89b4111610122578063a459556c11610107578063a459556c1461064c578063aa2146151461066c578063aae0ec471461068c57600080fd5b806395d89b4114610617578063a22cb4651461062c57600080fd5b8063897c59f411610153578063897c59f4146105ac5780638da5cb5b146105cc57806390ffaeb1146105f757600080fd5b80637ec4a659146105585780637f0b02651461057857600080fd5b80632ce17eaf1161021c578063481c6a75116101d05780636352211e116101b55780636352211e1461050357806370a0823114610523578063715018a61461054357600080fd5b8063481c6a75146104c157806362b99ad4146104ee57600080fd5b806341d35efc1161020157806341d35efc1461046157806342842e0e1461048e57806342966c68146104a157600080fd5b80632ce17eaf1461042b57806340c10f191461044157600080fd5b8063095ea7b31161027357806323185dc91161025857806323185dc9146103cb57806323b872dd146103f857806328cfbd461461040b57600080fd5b8063095ea7b3146103a257806318160ddd146103b557600080fd5b806306fdde03116102a457806306fdde0314610317578063081812fc1461033957806308c9105c1461037e57600080fd5b806301ffc9a7146102c0578063034601ec146102f5575b600080fd5b3480156102cc57600080fd5b506102e06102db366004613f94565b61080b565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b50610315610310366004613d27565b6108f0565b005b34801561032357600080fd5b5061032c610910565b6040516102ec919061428d565b34801561034557600080fd5b50610359610354366004614098565b61099e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ec565b34801561038a57600080fd5b50610394600e5481565b6040519081526020016102ec565b6103156103b0366004613ee1565b610a57565b3480156103c157600080fd5b50610394600a5481565b3480156103d757600080fd5b506103eb6103e6366004613f0d565b610bc7565b6040516102ec919061427a565b610315610406366004613e12565b610d2e565b34801561041757600080fd5b50610315610426366004613d89565b610d39565b34801561043757600080fd5b50610394600d5481565b34801561044d57600080fd5b5061031561045c366004613ee1565b610ec2565b34801561046d57600080fd5b5061048161047c36600461404a565b610fe4565b6040516102ec9190614220565b61031561049c366004613e12565b611019565b3480156104ad57600080fd5b506103156104bc366004614098565b611034565b3480156104cd57600080fd5b506009546103599073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104fa57600080fd5b5061032c61142f565b34801561050f57600080fd5b5061035961051e366004614098565b61143c565b34801561052f57600080fd5b5061039461053e366004613cb4565b6114c8565b34801561054f57600080fd5b50610315611570565b34801561056457600080fd5b50610315610573366004613fce565b611584565b34801561058457600080fd5b506103947fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081565b3480156105b857600080fd5b506103946105c7366004613fce565b6115a3565b3480156105d857600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610359565b34801561060357600080fd5b50610315610612366004614098565b6115cd565b34801561062357600080fd5b5061032c6115da565b34801561063857600080fd5b50610315610647366004613eb3565b6115e7565b34801561065857600080fd5b506102e0610667366004614003565b61167e565b34801561067857600080fd5b50610315610687366004614098565b6116b8565b34801561069857600080fd5b506103156106a7366004614098565b6116c5565b3480156106b857600080fd5b506102e06106c7366004614003565b6116d2565b3480156106d857600080fd5b506102e06106e7366004614003565b6116e8565b6103156106fa366004613e53565b61171b565b34801561070b57600080fd5b50610394600c5481565b34801561072157600080fd5b5061032c610730366004614098565b61189e565b34801561074157600080fd5b50610315610750366004613cb4565b61196b565b34801561076157600080fd5b50610315610770366004613f42565b6119ba565b34801561078157600080fd5b506102e0610790366004613cee565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107d757600080fd5b506103156107e6366004613cb4565b6119f8565b3480156107f757600080fd5b50610315610806366004613d27565b611aaf565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000148061089e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806108ea57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b61090b83838360405180602001604052806000815250610d39565b505050565b6000805461091d9061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546109499061439b565b80156109965780601f1061096b57610100808354040283529160200191610996565b820191906000526020600020905b81548152906001019060200180831161097957829003601f168201915b505050505081565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6e6f626f6479206f776e207468656e20746f6b656e000000000000000000000060448201526064015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610aba575073ffffffffffffffffffffffffffffffffffffffff8116600090815260066020908152604080832033845290915290205460ff165b610b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76656460448201527f20666f7220616c6c0000000000000000000000000000000000000000000000006064820152608401610a25565b60008281526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b606073ffffffffffffffffffffffffffffffffffffffff8416610c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6f776e6572206973207a65726f206164647265737300000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020526040902082610c7557805492505b6000610c818585614358565b67ffffffffffffffff811115610c9957610c996144f8565b604051908082528060200260200182016040528015610cc2578160200160208202803683370190505b509050845b84811015610d2457828181548110610ce157610ce16144c9565b9060005260206000200154828783610cf99190614358565b81518110610d0957610d096144c9565b6020908102919091010152610d1d816143ef565b9050610cc7565b5095945050505050565b61090b838383611ea0565b610d44848484611aaf565b73ffffffffffffffffffffffffffffffffffffffff83163b15610ebc576040517f0f7b88e3000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690630f7b88e390610dbb903390899088908890600401614181565b602060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190613fb1565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f6f6e4552433732314578526563656976656428292072657475726e20696e766160448201527f6c696400000000000000000000000000000000000000000000000000000000006064820152608401610a25565b50505050565b6040518060400160405280600781526020017f7061636b61676500000000000000000000000000000000000000000000000000815250610f2133600883604051610f0c9190614136565b9081526040519081900360200190209061224a565b610f87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f73656e646572206e6f7420696e20616464726573734d617000000000000000006044820152606401610a25565b6000600a546001610f9891906142ef565b66ffffffffffffff164260381b6bffffffffff00000000000000167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851617179050610ebc84826122d5565b60606110118383600887604051610ffb9190614136565b90815260405190819003602001902091906123ab565b949350505050565b61090b8383836040518060200160405280600081525061171b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148061108a575060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b806110c5575073ffffffffffffffffffffffffffffffffffffffff8116600090815260066020908152604080832033845290915290205460ff165b611150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6d73672e73656e646572206d757374206265206f776e6572206f72206170707260448201527f6f766564000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60006111916040518060400160405280600d81526020017f6275726e57686974654c69737400000000000000000000000000000000000000815250336116d2565b1561119f5750600e54611228565b600c5464ffffffffff603885901c169042906111bb90836142ef565b10611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6865726f20686173206e6f7420756e6c6f636b656400000000000000000000006044820152606401610a25565b5050600d545b6112318361251e565b68ffffffffffffffffff608884901c166000670de0b6b3a7640000611256848461431b565b6112609190614307565b6009546040517f6957a0b200000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f746f6b656e000000000000000000000000000000000000000000000000000000604482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690636957a0b29060640160206040518083038186803b1580156112fd57600080fd5b505afa158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613cd1565b905061134c8130876113478688614358565b6125f5565b6009546040517f6957a0b200000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f63617368696572000000000000000000000000000000000000000000000000006044820152611427918391309173ffffffffffffffffffffffffffffffffffffffff1690636957a0b29060640160206040518083038186803b1580156113e957600080fd5b505afa1580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190613cd1565b856125f5565b505050505050565b600b805461091d9061439b565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806108ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f626f6479206f776e2074686520746f6b656e0000000000000000000000006044820152606401610a25565b600073ffffffffffffffffffffffffffffffffffffffff8216611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6f776e6572206973207a65726f206164647265737300000000000000000000006044820152606401610a25565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b611578612819565b611582600061289a565b565b61158c612819565b805161159f90600b906020840190613b07565b5050565b60006108ea6008836040516115b89190614136565b90815260200160405180910390206001015490565b6115d5612819565b600d55565b6001805461091d9061439b565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611688612819565b6116b18260088560405161169c9190614136565b90815260405190819003602001902090612911565b9392505050565b6116c0612819565b600e55565b6116cd612819565b600c55565b60006116b182600885604051610f0c9190614136565b60006116f2612819565b6116b1826008856040516117069190614136565b90815260405190819003602001902090612996565b611726848484611ea0565b73ffffffffffffffffffffffffffffffffffffffff83163b15610ebc576040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061179d9033908990889088906004016141d7565b602060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190613fb1565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e455243373231526563656976656428292072657475726e20696e76616c6960448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60606000826040516020016118b591815260200190565b60405160208183030381529060405290506116b16118d282612b12565b600b80546118df9061439b565b80601f016020809104026020016040519081016040528092919081815260200182805461190b9061439b565b80156119585780601f1061192d57610100808354040283529160200191611958565b820191906000526020600020905b81548152906001019060200180831161193b57829003601f168201915b505050505061370e90919063ffffffff16565b611973612819565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005b815181101561159f576119e88282815181106119db576119db6144c9565b6020026020010151611034565b6119f1816143ef565b90506119bd565b611a00612819565b73ffffffffffffffffffffffffffffffffffffffff8116611aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a25565b611aac8161289a565b50565b73ffffffffffffffffffffffffffffffffffffffff8316611b2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66726f6d206973207a65726f20616464726573730000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8216611ba9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f206973207a65726f206164647265737300000000000000000000000000006044820152606401610a25565b33600073ffffffffffffffffffffffffffffffffffffffff8516821480611c02575073ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083209386168352929052205460ff165b905060005b8351811015611427576000848281518110611c2457611c246144c9565b6020908102919091018101516000818152600490925260409091205490915073ffffffffffffffffffffffffffffffffffffffff888116911614611cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66726f6d206d757374206265206f776e657200000000000000000000000000006044820152606401610a25565b8280611cf6575060008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116145b611d82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76616c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611de157600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b611deb878261373a565b73ffffffffffffffffffffffffffffffffffffffff868116600081815260026020908152604080832080548785526003845282852081905560018101825590845282842001869055858352600490915280822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016841790555184938b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450611e99816143ef565b9050611c07565b73ffffffffffffffffffffffffffffffffffffffff8316611f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66726f6d206973207a65726f20616464726573730000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8216611f9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f206973207a65726f206164647265737300000000000000000000000000006044820152606401610a25565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66726f6d206d757374206265206f776e657200000000000000000000000000006044820152606401610a25565b3373ffffffffffffffffffffffffffffffffffffffff84161480612071575060008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b806120ac575073ffffffffffffffffffffffffffffffffffffffff8316600090815260066020908152604080832033845290915290205460ff165b612138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76616c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff161561219757600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6121a1838261373a565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020908152604080832080548785526003845282852081905560018101825590845282842001869055858352600490915280822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016841790555184938716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604081205460018401548110801561101157508273ffffffffffffffffffffffffffffffffffffffff168460010182815481106122aa576122aa6144c9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600260209081526040808320805486855260038452828520819055600181018255908452828420018590558483526004909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055600a6000815461235e906143ef565b90915550604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816123ba57600184015491505b8183111580156123ce575060018401548211155b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c696420696e646578000000000000000000000000000000000000006044820152606401610a25565b60006124408484614358565b67ffffffffffffffff811115612458576124586144f8565b604051908082528060200260200182016040528015612481578160200160208202803683370190505b509050835b83811015612515578560010181815481106124a3576124a36144c9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16826124d08784614358565b815181106124e0576124e06144c9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261250e816143ef565b9050612486565b50949350505050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1661254d818361373a565b60008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16156125ac57600082815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b604051829060009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff84166127e45773ffffffffffffffffffffffffffffffffffffffff83163014156126775760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015612671573d6000803e3d6000fd5b50610ebc565b73ffffffffffffffffffffffffffffffffffffffff82163014156127825773ffffffffffffffffffffffffffffffffffffffff83163314612714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7472616e73666572204554482066726f6d20696e76616c6964000000000000006044820152606401610a25565b80341461277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7472616e73666572204554482076616c756520696e76616c69640000000000006044820152606401610a25565b610ebc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7472616e736665722045544820696e76616c69640000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff831630141561280d5761277d848383613858565b610ebc8484848461392c565b60075473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a25565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061291d838361224a565b1561292a575060006108ea565b506001808301805473ffffffffffffffffffffffffffffffffffffffff841660008181526020878152604082208490558386018555938152929092200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905592915050565b60006129a2838361224a565b6129ae575060006108ea565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602084905260408120546001808601805492939290916129e991614358565b815481106129f9576129f96144c9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff9081168084529188905260408084208690559087168352822091909155600186018054919250829184908110612a5457612a546144c9565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600101805480612aaf57612aaf61449a565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055506001949350505050565b6060600060038351612b249190614428565b9050600060038451612b369190614307565b612b4190600461431b565b905060006003612b518482614358565b612b5b9190614428565b83612b67576000612b6a565b60045b612b779060ff16846142ef565b612b8191906142ef565b67ffffffffffffffff811115612b9957612b996144f8565b6040519080825280601f01601f191660200182016040528015612bc3576020820181803683370190505b5090506000805b83821015612ff257604051806060016040528060408152602001614586604091396002888381518110612bff57612bff6144c9565b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c908110612c3f57612c3f6144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612c71816143ef565b945081518110612c8357612c836144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600488612cd98460016142ef565b81518110612ce957612ce96144c9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c6004898481518110612d2c57612d2c6144c9565b016020015183517f030000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c908110612d7057612d706144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612da2816143ef565b945081518110612db457612db46144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600688612e0a8460026142ef565b81518110612e1a57612e1a6144c9565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c600289612e518560016142ef565b81518110612e6157612e616144c9565b016020015183517f0f0000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c908110612ea557612ea56144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612ed7816143ef565b945081518110612ee957612ee96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040518060600160405280604081526020016145866040913987612f3d8360026142ef565b81518110612f4d57612f4d6144c9565b602091010151815160f89190911c603f16908110612f6d57612f6d6144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612f9f816143ef565b945081518110612fb157612fb16144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612feb6003826142ef565b9050612bca565b841561370357604051806060016040528060408152602001614586604091396002888381518110613025576130256144c9565b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c908110613065576130656144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613097816143ef565b9450815181106130a9576130a96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350846002141561340c57604051806060016040528060408152602001614586604091396004886131088460016142ef565b81518110613118576131186144c9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c600489848151811061315b5761315b6144c9565b016020015183517f030000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c90811061319f5761319f6144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836131d1816143ef565b9450815181106131e3576131e36144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350604051806060016040528060408152602001614586604091396002886132398460016142ef565b81518110613249576132496144c9565b016020015182517f0f0000000000000000000000000000000000000000000000000000000000000090911690911b60f81c908110613289576132896144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836132bb816143ef565b9450815181106132cd576132cd6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600081518110613327576133276144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613359816143ef565b94508151811061336b5761336b6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d0000000000000000000000000000000000000000000000000000000000000083836133c6816143ef565b9450815181106133d8576133d86144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613703565b604051806060016040528060408152602001614586604091396004888381518110613439576134396144c9565b016020015182517f030000000000000000000000000000000000000000000000000000000000000090911690911b60f81c908110613479576134796144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836134ab816143ef565b9450815181106134bd576134bd6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600081518110613517576135176144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613549816143ef565b94508151811061355b5761355b6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350604051806060016040528060408152602001614586604091396000815181106135b5576135b56144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836135e7816143ef565b9450815181106135f9576135f96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d000000000000000000000000000000000000000000000000000000000000008383613654816143ef565b945081518110613666576136666144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d0000000000000000000000000000000000000000000000000000000000000083836136c1816143ef565b9450815181106136d3576136d36144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b509095945050505050565b60608282604051602001613723929190614152565b604051602081830303815290604052905092915050565b60008181526003602090815260408083205473ffffffffffffffffffffffffffffffffffffffff861684526002909252822080549192909161377e90600190614358565b90506000828281548110613794576137946144c9565b90600052602060002001549050808385815481106137b4576137b46144c9565b600091825260208083209091019290925582815260039091526040902084905582548390806137e5576137e561449a565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810183905590920190925595815260049095525050604090922080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261090b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261398a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610ebc9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016138aa565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516139b29190614136565b6000604051808303816000865af19150503d80600081146139ef576040519150601f19603f3d011682016040523d82523d6000602084013e6139f4565b606091505b509150915081613a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610a25565b805115610ebc5780806020019051810190613a7b9190613f77565b610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a25565b828054613b139061439b565b90600052602060002090601f016020900481019282613b355760008555613b7b565b82601f10613b4e57805160ff1916838001178555613b7b565b82800160010185558215613b7b579182015b82811115613b7b578251825591602001919060010190613b60565b50613b87929150613b8b565b5090565b5b80821115613b875760008155600101613b8c565b600082601f830112613bb157600080fd5b8135602067ffffffffffffffff821115613bcd57613bcd6144f8565b8160051b613bdc8282016142a0565b838152828101908684018388018501891015613bf757600080fd5b600093505b85841015613c1a578035835260019390930192918401918401613bfc565b50979650505050505050565b600082601f830112613c3757600080fd5b813567ffffffffffffffff811115613c5157613c516144f8565b613c8260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016142a0565b818152846020838601011115613c9757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613cc657600080fd5b81356116b181614527565b600060208284031215613ce357600080fd5b81516116b181614527565b60008060408385031215613d0157600080fd5b8235613d0c81614527565b91506020830135613d1c81614527565b809150509250929050565b600080600060608486031215613d3c57600080fd5b8335613d4781614527565b92506020840135613d5781614527565b9150604084013567ffffffffffffffff811115613d7357600080fd5b613d7f86828701613ba0565b9150509250925092565b60008060008060808587031215613d9f57600080fd5b8435613daa81614527565b93506020850135613dba81614527565b9250604085013567ffffffffffffffff80821115613dd757600080fd5b613de388838901613ba0565b93506060870135915080821115613df957600080fd5b50613e0687828801613c26565b91505092959194509250565b600080600060608486031215613e2757600080fd5b8335613e3281614527565b92506020840135613e4281614527565b929592945050506040919091013590565b60008060008060808587031215613e6957600080fd5b8435613e7481614527565b93506020850135613e8481614527565b925060408501359150606085013567ffffffffffffffff811115613ea757600080fd5b613e0687828801613c26565b60008060408385031215613ec657600080fd5b8235613ed181614527565b91506020830135613d1c81614549565b60008060408385031215613ef457600080fd5b8235613eff81614527565b946020939093013593505050565b600080600060608486031215613f2257600080fd5b8335613f2d81614527565b95602085013595506040909401359392505050565b600060208284031215613f5457600080fd5b813567ffffffffffffffff811115613f6b57600080fd5b61101184828501613ba0565b600060208284031215613f8957600080fd5b81516116b181614549565b600060208284031215613fa657600080fd5b81356116b181614557565b600060208284031215613fc357600080fd5b81516116b181614557565b600060208284031215613fe057600080fd5b813567ffffffffffffffff811115613ff757600080fd5b61101184828501613c26565b6000806040838503121561401657600080fd5b823567ffffffffffffffff81111561402d57600080fd5b61403985828601613c26565b9250506020830135613d1c81614527565b60008060006060848603121561405f57600080fd5b833567ffffffffffffffff81111561407657600080fd5b61408286828701613c26565b9660208601359650604090950135949350505050565b6000602082840312156140aa57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156140e1578151875295820195908201906001016140c5565b509495945050505050565b6000815180845261410481602086016020860161436f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161414881846020870161436f565b9190910192915050565b6000835161416481846020880161436f565b83519083019061417881836020880161436f565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526141ba60808301856140b1565b82810360608401526141cc81856140ec565b979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261421660808301846140ec565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561426e57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161423c565b50909695505050505050565b6020815260006116b160208301846140b1565b6020815260006116b160208301846140ec565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142e7576142e76144f8565b604052919050565b600082198211156143025761430261443c565b500190565b6000826143165761431661446b565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143535761435361443c565b500290565b60008282101561436a5761436a61443c565b500390565b60005b8381101561438a578181015183820152602001614372565b83811115610ebc5750506000910152565b600181811c908216806143af57607f821691505b602082108114156143e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144215761442161443c565b5060010190565b6000826144375761443761446b565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611aac57600080fd5b8015158114611aac57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611aac57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa26469706673582212206c5d60ca1aee1c6ba8c1b000b9fe2beb95013e84a3c02df82e4b10e03322c65664736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e506546692041726d79204361726400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035041430000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102bb5760003560e01c80637ec4a6591161016e578063aaf29651116100cb578063d0ebdbe71161007f578063e985e9c511610064578063e985e9c514610775578063f2fde38b146107cb578063f3993d11146107eb57600080fd5b8063d0ebdbe714610735578063dc8e92ea1461075557600080fd5b8063b88d4fde116100b0578063b88d4fde146106ec578063c726d1b9146106ff578063c87b56dd1461071557600080fd5b8063aaf29651146106ac578063b66f599c146106cc57600080fd5b806395d89b4111610122578063a459556c11610107578063a459556c1461064c578063aa2146151461066c578063aae0ec471461068c57600080fd5b806395d89b4114610617578063a22cb4651461062c57600080fd5b8063897c59f411610153578063897c59f4146105ac5780638da5cb5b146105cc57806390ffaeb1146105f757600080fd5b80637ec4a659146105585780637f0b02651461057857600080fd5b80632ce17eaf1161021c578063481c6a75116101d05780636352211e116101b55780636352211e1461050357806370a0823114610523578063715018a61461054357600080fd5b8063481c6a75146104c157806362b99ad4146104ee57600080fd5b806341d35efc1161020157806341d35efc1461046157806342842e0e1461048e57806342966c68146104a157600080fd5b80632ce17eaf1461042b57806340c10f191461044157600080fd5b8063095ea7b31161027357806323185dc91161025857806323185dc9146103cb57806323b872dd146103f857806328cfbd461461040b57600080fd5b8063095ea7b3146103a257806318160ddd146103b557600080fd5b806306fdde03116102a457806306fdde0314610317578063081812fc1461033957806308c9105c1461037e57600080fd5b806301ffc9a7146102c0578063034601ec146102f5575b600080fd5b3480156102cc57600080fd5b506102e06102db366004613f94565b61080b565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b50610315610310366004613d27565b6108f0565b005b34801561032357600080fd5b5061032c610910565b6040516102ec919061428d565b34801561034557600080fd5b50610359610354366004614098565b61099e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ec565b34801561038a57600080fd5b50610394600e5481565b6040519081526020016102ec565b6103156103b0366004613ee1565b610a57565b3480156103c157600080fd5b50610394600a5481565b3480156103d757600080fd5b506103eb6103e6366004613f0d565b610bc7565b6040516102ec919061427a565b610315610406366004613e12565b610d2e565b34801561041757600080fd5b50610315610426366004613d89565b610d39565b34801561043757600080fd5b50610394600d5481565b34801561044d57600080fd5b5061031561045c366004613ee1565b610ec2565b34801561046d57600080fd5b5061048161047c36600461404a565b610fe4565b6040516102ec9190614220565b61031561049c366004613e12565b611019565b3480156104ad57600080fd5b506103156104bc366004614098565b611034565b3480156104cd57600080fd5b506009546103599073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104fa57600080fd5b5061032c61142f565b34801561050f57600080fd5b5061035961051e366004614098565b61143c565b34801561052f57600080fd5b5061039461053e366004613cb4565b6114c8565b34801561054f57600080fd5b50610315611570565b34801561056457600080fd5b50610315610573366004613fce565b611584565b34801561058457600080fd5b506103947fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081565b3480156105b857600080fd5b506103946105c7366004613fce565b6115a3565b3480156105d857600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610359565b34801561060357600080fd5b50610315610612366004614098565b6115cd565b34801561062357600080fd5b5061032c6115da565b34801561063857600080fd5b50610315610647366004613eb3565b6115e7565b34801561065857600080fd5b506102e0610667366004614003565b61167e565b34801561067857600080fd5b50610315610687366004614098565b6116b8565b34801561069857600080fd5b506103156106a7366004614098565b6116c5565b3480156106b857600080fd5b506102e06106c7366004614003565b6116d2565b3480156106d857600080fd5b506102e06106e7366004614003565b6116e8565b6103156106fa366004613e53565b61171b565b34801561070b57600080fd5b50610394600c5481565b34801561072157600080fd5b5061032c610730366004614098565b61189e565b34801561074157600080fd5b50610315610750366004613cb4565b61196b565b34801561076157600080fd5b50610315610770366004613f42565b6119ba565b34801561078157600080fd5b506102e0610790366004613cee565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107d757600080fd5b506103156107e6366004613cb4565b6119f8565b3480156107f757600080fd5b50610315610806366004613d27565b611aaf565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000148061089e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806108ea57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b61090b83838360405180602001604052806000815250610d39565b505050565b6000805461091d9061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546109499061439b565b80156109965780601f1061096b57610100808354040283529160200191610996565b820191906000526020600020905b81548152906001019060200180831161097957829003601f168201915b505050505081565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6e6f626f6479206f776e207468656e20746f6b656e000000000000000000000060448201526064015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610aba575073ffffffffffffffffffffffffffffffffffffffff8116600090815260066020908152604080832033845290915290205460ff165b610b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76656460448201527f20666f7220616c6c0000000000000000000000000000000000000000000000006064820152608401610a25565b60008281526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b606073ffffffffffffffffffffffffffffffffffffffff8416610c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6f776e6572206973207a65726f206164647265737300000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020526040902082610c7557805492505b6000610c818585614358565b67ffffffffffffffff811115610c9957610c996144f8565b604051908082528060200260200182016040528015610cc2578160200160208202803683370190505b509050845b84811015610d2457828181548110610ce157610ce16144c9565b9060005260206000200154828783610cf99190614358565b81518110610d0957610d096144c9565b6020908102919091010152610d1d816143ef565b9050610cc7565b5095945050505050565b61090b838383611ea0565b610d44848484611aaf565b73ffffffffffffffffffffffffffffffffffffffff83163b15610ebc576040517f0f7b88e3000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff851690630f7b88e390610dbb903390899088908890600401614181565b602060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190613fb1565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f6f6e4552433732314578526563656976656428292072657475726e20696e766160448201527f6c696400000000000000000000000000000000000000000000000000000000006064820152608401610a25565b50505050565b6040518060400160405280600781526020017f7061636b61676500000000000000000000000000000000000000000000000000815250610f2133600883604051610f0c9190614136565b9081526040519081900360200190209061224a565b610f87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f73656e646572206e6f7420696e20616464726573734d617000000000000000006044820152606401610a25565b6000600a546001610f9891906142ef565b66ffffffffffffff164260381b6bffffffffff00000000000000167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851617179050610ebc84826122d5565b60606110118383600887604051610ffb9190614136565b90815260405190819003602001902091906123ab565b949350505050565b61090b8383836040518060200160405280600081525061171b565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148061108a575060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b806110c5575073ffffffffffffffffffffffffffffffffffffffff8116600090815260066020908152604080832033845290915290205460ff165b611150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6d73672e73656e646572206d757374206265206f776e6572206f72206170707260448201527f6f766564000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60006111916040518060400160405280600d81526020017f6275726e57686974654c69737400000000000000000000000000000000000000815250336116d2565b1561119f5750600e54611228565b600c5464ffffffffff603885901c169042906111bb90836142ef565b10611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6865726f20686173206e6f7420756e6c6f636b656400000000000000000000006044820152606401610a25565b5050600d545b6112318361251e565b68ffffffffffffffffff608884901c166000670de0b6b3a7640000611256848461431b565b6112609190614307565b6009546040517f6957a0b200000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f746f6b656e000000000000000000000000000000000000000000000000000000604482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690636957a0b29060640160206040518083038186803b1580156112fd57600080fd5b505afa158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613cd1565b905061134c8130876113478688614358565b6125f5565b6009546040517f6957a0b200000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f63617368696572000000000000000000000000000000000000000000000000006044820152611427918391309173ffffffffffffffffffffffffffffffffffffffff1690636957a0b29060640160206040518083038186803b1580156113e957600080fd5b505afa1580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190613cd1565b856125f5565b505050505050565b600b805461091d9061439b565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806108ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f626f6479206f776e2074686520746f6b656e0000000000000000000000006044820152606401610a25565b600073ffffffffffffffffffffffffffffffffffffffff8216611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6f776e6572206973207a65726f206164647265737300000000000000000000006044820152606401610a25565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b611578612819565b611582600061289a565b565b61158c612819565b805161159f90600b906020840190613b07565b5050565b60006108ea6008836040516115b89190614136565b90815260200160405180910390206001015490565b6115d5612819565b600d55565b6001805461091d9061439b565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611688612819565b6116b18260088560405161169c9190614136565b90815260405190819003602001902090612911565b9392505050565b6116c0612819565b600e55565b6116cd612819565b600c55565b60006116b182600885604051610f0c9190614136565b60006116f2612819565b6116b1826008856040516117069190614136565b90815260405190819003602001902090612996565b611726848484611ea0565b73ffffffffffffffffffffffffffffffffffffffff83163b15610ebc576040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061179d9033908990889088906004016141d7565b602060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190613fb1565b7fffffffff000000000000000000000000000000000000000000000000000000001614610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e455243373231526563656976656428292072657475726e20696e76616c6960448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60606000826040516020016118b591815260200190565b60405160208183030381529060405290506116b16118d282612b12565b600b80546118df9061439b565b80601f016020809104026020016040519081016040528092919081815260200182805461190b9061439b565b80156119585780601f1061192d57610100808354040283529160200191611958565b820191906000526020600020905b81548152906001019060200180831161193b57829003601f168201915b505050505061370e90919063ffffffff16565b611973612819565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005b815181101561159f576119e88282815181106119db576119db6144c9565b6020026020010151611034565b6119f1816143ef565b90506119bd565b611a00612819565b73ffffffffffffffffffffffffffffffffffffffff8116611aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a25565b611aac8161289a565b50565b73ffffffffffffffffffffffffffffffffffffffff8316611b2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66726f6d206973207a65726f20616464726573730000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8216611ba9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f206973207a65726f206164647265737300000000000000000000000000006044820152606401610a25565b33600073ffffffffffffffffffffffffffffffffffffffff8516821480611c02575073ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083209386168352929052205460ff165b905060005b8351811015611427576000848281518110611c2457611c246144c9565b6020908102919091018101516000818152600490925260409091205490915073ffffffffffffffffffffffffffffffffffffffff888116911614611cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66726f6d206d757374206265206f776e657200000000000000000000000000006044820152606401610a25565b8280611cf6575060008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116145b611d82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76616c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611de157600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b611deb878261373a565b73ffffffffffffffffffffffffffffffffffffffff868116600081815260026020908152604080832080548785526003845282852081905560018101825590845282842001869055858352600490915280822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016841790555184938b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450611e99816143ef565b9050611c07565b73ffffffffffffffffffffffffffffffffffffffff8316611f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66726f6d206973207a65726f20616464726573730000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff8216611f9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f206973207a65726f206164647265737300000000000000000000000000006044820152606401610a25565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66726f6d206d757374206265206f776e657200000000000000000000000000006044820152606401610a25565b3373ffffffffffffffffffffffffffffffffffffffff84161480612071575060008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b806120ac575073ffffffffffffffffffffffffffffffffffffffff8316600090815260066020908152604080832033845290915290205460ff165b612138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73656e646572206d757374206265206f776e6572206f7220617070726f76616c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610a25565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff161561219757600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6121a1838261373a565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020908152604080832080548785526003845282852081905560018101825590845282842001869055858352600490915280822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016841790555184938716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604081205460018401548110801561101157508273ffffffffffffffffffffffffffffffffffffffff168460010182815481106122aa576122aa6144c9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600260209081526040808320805486855260038452828520819055600181018255908452828420018590558483526004909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055600a6000815461235e906143ef565b90915550604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816123ba57600184015491505b8183111580156123ce575060018401548211155b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c696420696e646578000000000000000000000000000000000000006044820152606401610a25565b60006124408484614358565b67ffffffffffffffff811115612458576124586144f8565b604051908082528060200260200182016040528015612481578160200160208202803683370190505b509050835b83811015612515578560010181815481106124a3576124a36144c9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16826124d08784614358565b815181106124e0576124e06144c9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261250e816143ef565b9050612486565b50949350505050565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1661254d818361373a565b60008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16156125ac57600082815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b604051829060009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff84166127e45773ffffffffffffffffffffffffffffffffffffffff83163014156126775760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015612671573d6000803e3d6000fd5b50610ebc565b73ffffffffffffffffffffffffffffffffffffffff82163014156127825773ffffffffffffffffffffffffffffffffffffffff83163314612714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7472616e73666572204554482066726f6d20696e76616c6964000000000000006044820152606401610a25565b80341461277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7472616e73666572204554482076616c756520696e76616c69640000000000006044820152606401610a25565b610ebc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7472616e736665722045544820696e76616c69640000000000000000000000006044820152606401610a25565b73ffffffffffffffffffffffffffffffffffffffff831630141561280d5761277d848383613858565b610ebc8484848461392c565b60075473ffffffffffffffffffffffffffffffffffffffff163314611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a25565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061291d838361224a565b1561292a575060006108ea565b506001808301805473ffffffffffffffffffffffffffffffffffffffff841660008181526020878152604082208490558386018555938152929092200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905592915050565b60006129a2838361224a565b6129ae575060006108ea565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602084905260408120546001808601805492939290916129e991614358565b815481106129f9576129f96144c9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff9081168084529188905260408084208690559087168352822091909155600186018054919250829184908110612a5457612a546144c9565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600101805480612aaf57612aaf61449a565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055506001949350505050565b6060600060038351612b249190614428565b9050600060038451612b369190614307565b612b4190600461431b565b905060006003612b518482614358565b612b5b9190614428565b83612b67576000612b6a565b60045b612b779060ff16846142ef565b612b8191906142ef565b67ffffffffffffffff811115612b9957612b996144f8565b6040519080825280601f01601f191660200182016040528015612bc3576020820181803683370190505b5090506000805b83821015612ff257604051806060016040528060408152602001614586604091396002888381518110612bff57612bff6144c9565b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c908110612c3f57612c3f6144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612c71816143ef565b945081518110612c8357612c836144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600488612cd98460016142ef565b81518110612ce957612ce96144c9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c6004898481518110612d2c57612d2c6144c9565b016020015183517f030000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c908110612d7057612d706144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612da2816143ef565b945081518110612db457612db46144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600688612e0a8460026142ef565b81518110612e1a57612e1a6144c9565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c600289612e518560016142ef565b81518110612e6157612e616144c9565b016020015183517f0f0000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c908110612ea557612ea56144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612ed7816143ef565b945081518110612ee957612ee96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040518060600160405280604081526020016145866040913987612f3d8360026142ef565b81518110612f4d57612f4d6144c9565b602091010151815160f89190911c603f16908110612f6d57612f6d6144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612f9f816143ef565b945081518110612fb157612fb16144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612feb6003826142ef565b9050612bca565b841561370357604051806060016040528060408152602001614586604091396002888381518110613025576130256144c9565b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c908110613065576130656144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613097816143ef565b9450815181106130a9576130a96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350846002141561340c57604051806060016040528060408152602001614586604091396004886131088460016142ef565b81518110613118576131186144c9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c600489848151811061315b5761315b6144c9565b016020015183517f030000000000000000000000000000000000000000000000000000000000000090911690911b9190911760f81c90811061319f5761319f6144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836131d1816143ef565b9450815181106131e3576131e36144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350604051806060016040528060408152602001614586604091396002886132398460016142ef565b81518110613249576132496144c9565b016020015182517f0f0000000000000000000000000000000000000000000000000000000000000090911690911b60f81c908110613289576132896144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836132bb816143ef565b9450815181106132cd576132cd6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600081518110613327576133276144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613359816143ef565b94508151811061336b5761336b6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d0000000000000000000000000000000000000000000000000000000000000083836133c6816143ef565b9450815181106133d8576133d86144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613703565b604051806060016040528060408152602001614586604091396004888381518110613439576134396144c9565b016020015182517f030000000000000000000000000000000000000000000000000000000000000090911690911b60f81c908110613479576134796144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836134ab816143ef565b9450815181106134bd576134bd6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161458660409139600081518110613517576135176144c9565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383613549816143ef565b94508151811061355b5761355b6144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350604051806060016040528060408152602001614586604091396000815181106135b5576135b56144c9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836135e7816143ef565b9450815181106135f9576135f96144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d000000000000000000000000000000000000000000000000000000000000008383613654816143ef565b945081518110613666576136666144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3d0000000000000000000000000000000000000000000000000000000000000083836136c1816143ef565b9450815181106136d3576136d36144c9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b509095945050505050565b60608282604051602001613723929190614152565b604051602081830303815290604052905092915050565b60008181526003602090815260408083205473ffffffffffffffffffffffffffffffffffffffff861684526002909252822080549192909161377e90600190614358565b90506000828281548110613794576137946144c9565b90600052602060002001549050808385815481106137b4576137b46144c9565b600091825260208083209091019290925582815260039091526040902084905582548390806137e5576137e561449a565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810183905590920190925595815260049095525050604090922080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261090b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261398a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610ebc9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016138aa565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516139b29190614136565b6000604051808303816000865af19150503d80600081146139ef576040519150601f19603f3d011682016040523d82523d6000602084013e6139f4565b606091505b509150915081613a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610a25565b805115610ebc5780806020019051810190613a7b9190613f77565b610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a25565b828054613b139061439b565b90600052602060002090601f016020900481019282613b355760008555613b7b565b82601f10613b4e57805160ff1916838001178555613b7b565b82800160010185558215613b7b579182015b82811115613b7b578251825591602001919060010190613b60565b50613b87929150613b8b565b5090565b5b80821115613b875760008155600101613b8c565b600082601f830112613bb157600080fd5b8135602067ffffffffffffffff821115613bcd57613bcd6144f8565b8160051b613bdc8282016142a0565b838152828101908684018388018501891015613bf757600080fd5b600093505b85841015613c1a578035835260019390930192918401918401613bfc565b50979650505050505050565b600082601f830112613c3757600080fd5b813567ffffffffffffffff811115613c5157613c516144f8565b613c8260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016142a0565b818152846020838601011115613c9757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613cc657600080fd5b81356116b181614527565b600060208284031215613ce357600080fd5b81516116b181614527565b60008060408385031215613d0157600080fd5b8235613d0c81614527565b91506020830135613d1c81614527565b809150509250929050565b600080600060608486031215613d3c57600080fd5b8335613d4781614527565b92506020840135613d5781614527565b9150604084013567ffffffffffffffff811115613d7357600080fd5b613d7f86828701613ba0565b9150509250925092565b60008060008060808587031215613d9f57600080fd5b8435613daa81614527565b93506020850135613dba81614527565b9250604085013567ffffffffffffffff80821115613dd757600080fd5b613de388838901613ba0565b93506060870135915080821115613df957600080fd5b50613e0687828801613c26565b91505092959194509250565b600080600060608486031215613e2757600080fd5b8335613e3281614527565b92506020840135613e4281614527565b929592945050506040919091013590565b60008060008060808587031215613e6957600080fd5b8435613e7481614527565b93506020850135613e8481614527565b925060408501359150606085013567ffffffffffffffff811115613ea757600080fd5b613e0687828801613c26565b60008060408385031215613ec657600080fd5b8235613ed181614527565b91506020830135613d1c81614549565b60008060408385031215613ef457600080fd5b8235613eff81614527565b946020939093013593505050565b600080600060608486031215613f2257600080fd5b8335613f2d81614527565b95602085013595506040909401359392505050565b600060208284031215613f5457600080fd5b813567ffffffffffffffff811115613f6b57600080fd5b61101184828501613ba0565b600060208284031215613f8957600080fd5b81516116b181614549565b600060208284031215613fa657600080fd5b81356116b181614557565b600060208284031215613fc357600080fd5b81516116b181614557565b600060208284031215613fe057600080fd5b813567ffffffffffffffff811115613ff757600080fd5b61101184828501613c26565b6000806040838503121561401657600080fd5b823567ffffffffffffffff81111561402d57600080fd5b61403985828601613c26565b9250506020830135613d1c81614527565b60008060006060848603121561405f57600080fd5b833567ffffffffffffffff81111561407657600080fd5b61408286828701613c26565b9660208601359650604090950135949350505050565b6000602082840312156140aa57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156140e1578151875295820195908201906001016140c5565b509495945050505050565b6000815180845261410481602086016020860161436f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161414881846020870161436f565b9190910192915050565b6000835161416481846020880161436f565b83519083019061417881836020880161436f565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526141ba60808301856140b1565b82810360608401526141cc81856140ec565b979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261421660808301846140ec565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561426e57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161423c565b50909695505050505050565b6020815260006116b160208301846140b1565b6020815260006116b160208301846140ec565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142e7576142e76144f8565b604052919050565b600082198211156143025761430261443c565b500190565b6000826143165761431661446b565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143535761435361443c565b500290565b60008282101561436a5761436a61443c565b500390565b60005b8381101561438a578181015183820152602001614372565b83811115610ebc5750506000910152565b600181811c908216806143af57607f821691505b602082108114156143e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144215761442161443c565b5060010190565b6000826144375761443761446b565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611aac57600080fd5b8015158114611aac57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611aac57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa26469706673582212206c5d60ca1aee1c6ba8c1b000b9fe2beb95013e84a3c02df82e4b10e03322c65664736f6c63430008060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e506546692041726d79204361726400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035041430000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): PeFi Army Card
Arg [1] : _symbol (string): PAC

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [3] : 506546692041726d792043617264000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 5041430000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

365:1729:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6609:284:4;;;;;;;;;;-1:-1:-1;6609:284:4;;;;;:::i;:::-;;:::i;:::-;;;13683:14:20;;13676:22;13658:41;;13646:2;13631:18;6609:284:4;;;;;;;;857:191:5;;;;;;;;;;-1:-1:-1;857:191:5;;;;;:::i;:::-;;:::i;:::-;;1455:27:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6188:225::-;;;;;;;;;;-1:-1:-1;6188:225:4;;;;;:::i;:::-;;:::i;:::-;;;10641:42:20;10629:55;;;10611:74;;10599:2;10584:18;6188:225:4;10566:125:20;483:38:6;;;;;;;;;;;;;;;;;;;22753:25:20;;;22741:2;22726:18;483:38:6;22708:76:20;5611:372:4;;;;;;:::i;:::-;;:::i;292:30:5:-;;;;;;;;;;;;;;;;2183:576:4;;;;;;;;;;-1:-1:-1;2183:576:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3785:176::-;;;;;;:::i;:::-;;:::i;1056:605:5:-;;;;;;;;;;-1:-1:-1;1056:605:5;;;;;:::i;:::-;;:::i;443:33:6:-;;;;;;;;;;;;;;;;369:283:2;;;;;;;;;;-1:-1:-1;369:283:2;;;;;:::i;:::-;;:::i;1016:221:0:-;;;;;;;;;;-1:-1:-1;1016:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2991:187:4:-;;;;;;:::i;:::-;;:::i;966:1125:6:-;;;;;;;;;;-1:-1:-1;966:1125:6;;;;;:::i;:::-;;:::i;171:22:14:-;;;;;;;;;;-1:-1:-1;171:22:14;;;;;;;;331:23:5;;;;;;;;;;;;;:::i;2767:216:4:-;;;;;;;;;;-1:-1:-1;2767:216:4;;;;;:::i;:::-;;:::i;1954:190::-;;;;;;;;;;-1:-1:-1;1954:190:4;;;;;:::i;:::-;;:::i;1817:101:16:-;;;;;;;;;;;;;:::i;2646:100:5:-;;;;;;;;;;-1:-1:-1;2646:100:5;;;;;:::i;:::-;;:::i;284:72:2:-;;;;;;;;;;-1:-1:-1;284:72:2;330:26;284:72;;833:144:0;;;;;;;;;;-1:-1:-1;833:144:0;;;;;:::i;:::-;;:::i;1194:85:16:-;;;;;;;;;;-1:-1:-1;1266:6:16;;;;1194:85;;764:88:6;;;;;;;;;;-1:-1:-1;764:88:6;;;;;:::i;:::-;;:::i;1489:29:4:-;;;;;;;;;;;;;:::i;5991:189::-;;;;;;;;;;-1:-1:-1;5991:189:4;;;;;:::i;:::-;;:::i;471:170:0:-;;;;;;;;;;-1:-1:-1;471:170:0;;;;;:::i;:::-;;:::i;860:98:6:-;;;;;;;;;;-1:-1:-1;860:98:6;;;;;:::i;:::-;;:::i;644:112::-;;;;;;;;;;-1:-1:-1;644:112:6;;;;;:::i;:::-;;:::i;1245:175:0:-;;;;;;;;;;-1:-1:-1;1245:175:0;;;;;:::i;:::-;;:::i;649:176::-;;;;;;;;;;-1:-1:-1;649:176:0;;;;;:::i;:::-;;:::i;3186:591:4:-;;;;;;:::i;:::-;;:::i;394:40:6:-;;;;;;;;;;;;;;;;2754:223:5;;;;;;;;;;-1:-1:-1;2754:223:5;;;;;:::i;:::-;;:::i;347:95:14:-;;;;;;;;;;-1:-1:-1;347:95:14;;;;;:::i;:::-;;:::i;721:160:2:-;;;;;;;;;;-1:-1:-1;721:160:2;;;;;:::i;:::-;;:::i;6421:180:4:-;;;;;;;;;;-1:-1:-1;6421:180:4;;;;;:::i;:::-;6561:22;;;;6537:4;6561:22;;;:15;:22;;;;;;;;:32;;;;;;;;;;;;;;;6421:180;2067:198:16;;;;;;;;;;-1:-1:-1;2067:198:16;;;;;:::i;:::-;;:::i;1669:969:5:-;;;;;;;;;;-1:-1:-1;1669:969:5;;;;;:::i;:::-;;:::i;6609:284:4:-;6704:4;6741:34;;;6756:19;6741:34;;:85;;-1:-1:-1;6792:34:4;;;6807:19;6792:34;6741:85;:144;;;-1:-1:-1;6843:42:4;;;6858:27;6843:42;6741:144;6721:164;6609:284;-1:-1:-1;;6609:284:4:o;857:191:5:-;995:45;1017:4;1023:2;1027:8;995:45;;;;;;;;;;;;:21;:45::i;:::-;857:191;;;:::o;1455:27:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6188:225::-;6274:7;6302:20;;;:11;:20;;;;;;:34;:20;6294:68;;;;;;;19577:2:20;6294:68:4;;;19559:21:20;19616:2;19596:18;;;19589:30;19655:23;19635:18;;;19628:51;19696:18;;6294:68:4;;;;;;;;;-1:-1:-1;6382:23:4;;;;:14;:23;;;;;;;;;6188:225::o;5611:372::-;5694:13;5710:20;;;:11;:20;;;;;;;;5765:10;:19;;;:57;;-1:-1:-1;5788:22:4;;;;;;;:15;:22;;;;;;;;5811:10;5788:34;;;;;;;;;;5765:57;5743:147;;;;;;;15542:2:20;5743:147:4;;;15524:21:20;15581:2;15561:18;;;15554:30;15620:34;15600:18;;;15593:62;15691:10;15671:18;;;15664:38;15719:19;;5743:147:4;15514:230:20;5743:147:4;5903:23;;;;:14;:23;;;;;;:28;;;;;;;;;;;;;;5947;;5903:23;;5947:28;;;;;;;5683:300;5611:372;;:::o;2183:576::-;2311:16;2348:19;;;2340:53;;;;;;;17054:2:20;2340:53:4;;;17036:21:20;17093:2;17073:18;;;17066:30;17132:23;17112:18;;;17105:51;17173:18;;2340:53:4;17026:171:20;2340:53:4;2433:18;;;2406:24;2433:18;;;:11;:18;;;;;2466:13;2462:70;;2507:13;;;-1:-1:-1;2462:70:4;2544:23;2584:21;2595:10;2584:8;:21;:::i;:::-;2570:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2570:36:4;-1:-1:-1;2544:62:4;-1:-1:-1;2634:10:4;2617:109;2650:8;2646:1;:12;2617:109;;;2705:6;2712:1;2705:9;;;;;;;;:::i;:::-;;;;;;;;;2680:6;2691:10;2687:1;:14;;;;:::i;:::-;2680:22;;;;;;;;:::i;:::-;;;;;;;;;;:34;2660:3;;;:::i;:::-;;;2617:109;;;-1:-1:-1;2745:6:4;2183:576;-1:-1:-1;;;;;2183:576:4:o;3785:176::-;3921:32;3935:4;3941:2;3945:7;3921:13;:32::i;1056:605:5:-;1220:37;1238:4;1244:2;1248:8;1220:17;:37::i;:::-;1274:14;;;;:18;1270:384;;1335:182;;1521:50;1335:182;;;1521:50;1335:45;;;;1521:50;;1335:182;;1403:10;;1436:4;;1463:8;;1494:4;;1335:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:236;;;1309:333;;;;;;;22405:2:20;1309:333:5;;;22387:21:20;22444:2;22424:18;;;22417:30;22483:34;22463:18;;;22456:62;22554:5;22534:18;;;22527:33;22577:19;;1309:333:5;22377:225:20;1309:333:5;1056:605;;;;:::o;369:283:2:-;278:185:0;;;;;;;;;;;;;;;;;355:36;380:10;355;366:3;355:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;:24;:36::i;:::-;333:110;;;;;;;18464:2:20;333:110:0;;;18446:21:20;18503:2;18483:18;;;18476:30;18542:26;18522:18;;;18515:54;18586:18;;333:110:0;18436:174:20;333:110:0;461:14:2::1;590:11;;604:1;590:15;;;;:::i;:::-;478:128;;543:15;564:2;528:38:::0;;;330:26;479:31;::::1;478:89;:128;::::0;-1:-1:-1;627:17:2::1;633:2:::0;478:128;627:5:::1;:17::i;1016:221:0:-:0;1152:16;1188:41;1208:10;1220:8;1188:10;1199:3;1188:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;:41;:19;:41::i;:::-;1181:48;1016:221;-1:-1:-1;;;;1016:221:0:o;2991:187:4:-;3131:39;3148:4;3154:2;3158:7;3131:39;;;;;;;;;;;;:16;:39::i;966:1125:6:-;1023:13;1039:19;;;:11;:19;;;;;;;;1093:10;:19;;;:76;;-1:-1:-1;1147:22:6;;;;:14;:22;;;;;;;;1133:10;:36;1093:76;:131;;;-1:-1:-1;1190:22:6;;;;;;;:15;:22;;;;;;;;1213:10;1190:34;;;;;;;;;;1093:131;1071:217;;;;;;;18817:2:20;1071:217:6;;;18799:21:20;18856:2;18836:18;;;18829:30;18895:34;18875:18;;;18868:62;18966:6;18946:18;;;18939:34;18990:19;;1071:217:6;18789:226:20;1071:217:6;1301:10;1328:47;;;;;;;;;;;;;;;;;;1364:10;1328:18;:47::i;:::-;1324:343;;;-1:-1:-1;1397:13:6;;1324:343;;;1534:16;;1443:39;1479:2;1469:12;;;1443:39;;1553:15;;1523:27;;1443:39;1523:27;:::i;:::-;:45;1497:128;;;;;;;18114:2:20;1497:128:6;;;18096:21:20;18153:2;18133:18;;;18126:30;18192:23;18172:18;;;18165:51;18233:18;;1497:128:6;18086:171:20;1497:128:6;-1:-1:-1;;1647:8:6;;1324:343;1679:13;1685:6;1679:5;:13::i;:::-;1705:43;1744:3;1734:13;;;1705:43;:19;121:4:19;1775:16:6;1789:2;1705:43;1775:16;:::i;:::-;1774:30;;;;:::i;:::-;1833:7;;:24;;;;;20972:2:20;1833:24:6;;;20954:21:20;21011:1;20991:18;;;20984:29;21049:7;21029:18;;;21022:35;1759:45:6;;-1:-1:-1;1817:13:6;;1833:7;;;;;:15;;21074:18:20;;1833:24:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1817:40;-1:-1:-1;1868:67:6;1817:40;1902:4;1909:5;1916:18;1930:4;1916:11;:18;:::i;:::-;1868;:67::i;:::-;2027:7;;:26;;;;;19927:2:20;2027:26:6;;;19909:21:20;19966:1;19946:18;;;19939:29;20004:9;19984:18;;;19977:37;1946:137:6;;1979:5;;2007:4;;2027:7;;;:15;;20031:18:20;;2027:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2068:4;1946:18;:137::i;:::-;1012:1079;;;;;966:1125;:::o;331:23:5:-;;;;;;;:::i;2767:216:4:-;2833:7;2869:20;;;:11;:20;;;;;;;;2908:19;2900:52;;;;;;;20262:2:20;2900:52:4;;;20244:21:20;20301:2;20281:18;;;20274:30;20340:22;20320:18;;;20313:50;20380:18;;2900:52:4;20234:170:20;1954:190:4;2020:7;2048:19;;;2040:53;;;;;;;17054:2:20;2040:53:4;;;17036:21:20;17093:2;17073:18;;;17066:30;17132:23;17112:18;;;17105:51;17173:18;;2040:53:4;17026:171:20;2040:53:4;-1:-1:-1;2111:18:4;;;;;;:11;:18;;;;;:25;;1954:190::o;1817:101:16:-;1087:13;:11;:13::i;:::-;1881:30:::1;1908:1;1881:18;:30::i;:::-;1817:101::o:0;2646:100:5:-;1087:13:16;:11;:13::i;:::-;2720:18:5;;::::1;::::0;:9:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2646:100:::0;:::o;833:144:0:-;918:7;945:24;:10;956:3;945:15;;;;;;:::i;:::-;;;;;;;;;;;;;1499:13:1;;:20;;1417:110;764:88:6;1087:13:16;:11;:13::i;:::-;829:8:6::1;:15:::0;764:88::o;1489:29:4:-;;;;;;;:::i;5991:189::-;6090:10;6074:27;;;;:15;:27;;;;;;;;;:31;;;;;;;;;;;;:42;;;;;;;;;;;;;6132:40;;13658:41:20;;;6074:31:4;;6090:10;6132:40;;13631:18:20;6132:40:4;;;;;;;5991:189;;:::o;471:170:0:-;581:4;1087:13:16;:11;:13::i;:::-;605:28:0::1;625:7;605:10;616:3;605:15;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;:19:::1;:28::i;:::-;598:35:::0;471:170;-1:-1:-1;;;471:170:0:o;860:98:6:-;1087:13:16;:11;:13::i;:::-;930::6::1;:20:::0;860:98::o;644:112::-;1087:13:16;:11;:13::i;:::-;721:16:6::1;:27:::0;644:112::o;1245:175:0:-;1355:4;1379:33;1404:7;1379:10;1390:3;1379:15;;;;;;:::i;649:176::-;762:4;1087:13:16;:11;:13::i;:::-;786:31:0::1;809:7;786:10;797:3;786:15;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;:22:::1;:31::i;3186:591:4:-:0;3352:32;3366:4;3372:2;3376:7;3352:13;:32::i;:::-;3401:14;;;;:18;3397:373;;3462:177;;3643:46;3462:177;;;3643:46;3462:41;;;;3643:46;;3462:177;;3526:10;;3559:4;;3586:7;;3616:4;;3462:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:227;;;3436:322;;;;;;;15140:2:20;3436:322:4;;;15122:21:20;15179:2;15159:18;;;15152:30;15218:34;15198:18;;;15191:62;15289:3;15269:18;;;15262:31;15310:19;;3436:322:4;15112:223:20;2754::5;2844:13;2870:15;2905:6;2888:24;;;;;;10407:19:20;;10451:2;10442:12;;10397:63;2888:24:5;;;;;;;;;;;;;2870:42;;2930:39;2947:21;2965:2;2947:17;:21::i;:::-;2930:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;:::i;347:95:14:-;1087:13:16;:11;:13::i;:::-;411:7:14::1;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;347:95::o;721:160:2:-;791:9;786:88;810:7;:14;806:1;:18;786:88;;;846:16;851:7;859:1;851:10;;;;;;;;:::i;:::-;;;;;;;846:4;:16::i;:::-;826:3;;;:::i;:::-;;;786:88;;2067:198:16;1087:13;:11;:13::i;:::-;2155:22:::1;::::0;::::1;2147:73;;;::::0;::::1;::::0;;15951:2:20;2147:73:16::1;::::0;::::1;15933:21:20::0;15990:2;15970:18;;;15963:30;16029:34;16009:18;;;16002:62;16100:8;16080:18;;;16073:36;16126:19;;2147:73:16::1;15923:228:20::0;2147:73:16::1;2230:28;2249:8;2230:18;:28::i;:::-;2067:198:::0;:::o;1669:969:5:-;1809:18;;;1801:51;;;;;;;17404:2:20;1801:51:5;;;17386:21:20;17443:2;17423:18;;;17416:30;17482:22;17462:18;;;17455:50;17522:18;;1801:51:5;17376:170:20;1801:51:5;1871:16;;;1863:47;;;;;;;16707:2:20;1863:47:5;;;16689:21:20;16746:2;16726:18;;;16719:30;16785:20;16765:18;;;16758:48;16823:18;;1863:47:5;16679:168:20;1863:47:5;1940:10;1923:14;1977;;;;;;:47;;-1:-1:-1;1995:21:5;;;;;;;;:15;:21;;;;;;;;:29;;;;;;;;;;;;1977:47;1961:63;;2042:9;2037:594;2061:8;:15;2057:1;:19;2037:594;;;2098:15;2116:8;2125:1;2116:11;;;;;;;;:::i;:::-;;;;;;;;;;;;2160:20;;;;:11;:20;;;;;;;;2116:11;;-1:-1:-1;2160:20:5;2152:28;;;2160:20;;2152:28;2144:59;;;;;;;21305:2:20;2144:59:5;;;21287:21:20;21344:2;21324:18;;;21317:30;21383:20;21363:18;;;21356:48;21421:18;;2144:59:5;21277:168:20;2144:59:5;2244:8;:45;;;-1:-1:-1;2266:23:5;;;;:14;:23;;;;;;;2256:33;;;2266:23;;2256:33;2244:45;2218:141;;;;;;;14737:2:20;2218:141:5;;;14719:21:20;14776:2;14756:18;;;14749:30;14815:34;14795:18;;;14788:62;14886:4;14866:18;;;14859:32;14908:19;;2218:141:5;14709:224:20;2218:141:5;2415:1;2380:23;;;:14;:23;;;;;;:37;:23;:37;2376:108;;2445:23;;;;:14;:23;;;;;2438:30;;;;;;2376:108;2500:31;2517:4;2523:7;2500:16;:31::i;:::-;5464:15:4;;;;5437:24;5464:15;;;:11;:15;;;;;;;;5513:13;;5490:20;;;:11;:20;;;;;:36;;;5537:20;;;;;;;;;;;;;;;5570;;;:11;:20;;;;;;:25;;;;;;;;2592:27:5;5490:20:4;;2592:27:5;;;;;;-1:-1:-1;2078:3:5;;;:::i;:::-;;;2037:594;;3969:738:4;4063:18;;;4055:51;;;;;;;17404:2:20;4055:51:4;;;17386:21:20;17443:2;17423:18;;;17416:30;17482:22;17462:18;;;17455:50;17522:18;;4055:51:4;17376:170:20;4055:51:4;4125:16;;;4117:47;;;;;;;16707:2:20;4117:47:4;;;16689:21:20;16746:2;16726:18;;;16719:30;16785:20;16765:18;;;16758:48;16823:18;;4117:47:4;16679:168:20;4117:47:4;4193:20;;;;:11;:20;;;;;;;4185:28;;;4193:20;;4185:28;4177:59;;;;;;;21305:2:20;4177:59:4;;;21287:21:20;21344:2;21324:18;;;21317:30;21383:20;21363:18;;;21356:48;21421:18;;4177:59:4;21277:168:20;4177:59:4;4271:10;:18;;;;;:76;;-1:-1:-1;4324:23:4;;;;:14;:23;;;;;;;;4310:10;:37;4271:76;:130;;;-1:-1:-1;4368:21:4;;;;;;;:15;:21;;;;;;;;4390:10;4368:33;;;;;;;;;;4271:130;4249:214;;;;;;;14737:2:20;4249:214:4;;;14719:21:20;14776:2;14756:18;;;14749:30;14815:34;14795:18;;;14788:62;14886:4;14866:18;;;14859:32;14908:19;;4249:214:4;14709:224:20;4249:214:4;4515:1;4480:23;;;:14;:23;;;;;;:37;:23;:37;4476:100;;4541:23;;;;:14;:23;;;;;4534:30;;;;;;4476:100;4588:31;4605:4;4611:7;4588:16;:31::i;:::-;5464:15;;;;5437:24;5464:15;;;:11;:15;;;;;;;;5513:13;;5490:20;;;:11;:20;;;;;:36;;;5537:20;;;;;;;;;;;;;;;5570;;;:11;:20;;;;;;:25;;;;;;;;4672:27;5490:20;;4672:27;;;;;;3969:738;;;:::o;962:207:1:-;1066:17;;;1033:4;1066:17;;;;;;;;;;;1109:13;;;:20;1101:28;;:60;;;;;1157:4;1133:28;;:3;:13;;1147:5;1133:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;:28;1094:67;962:207;-1:-1:-1;;;;962:207:1:o;363:173:5:-;5464:15:4;;;5437:24;5464:15;;;:11;:15;;;;;;;;5513:13;;5490:20;;;:11;:20;;;;;:36;;;5537:20;;;;;;;;;;;;;;;5570;;;:11;:20;;;;;:25;;;;;;;;;466:11:5;;464:13;;;;;:::i;:::-;;;;-1:-1:-1;495:33:5;;520:7;;495:33;;;;512:1;;495:33;;512:1;;495:33;363:173;;:::o;1919:593:1:-;2018:16;2061:13;2057:77;;2102:13;;;:20;;-1:-1:-1;2057:77:1;2176:8;2162:10;:22;;:58;;;;-1:-1:-1;2200:13:1;;;:20;2188:32;;;2162:58;2154:97;;;;;;;22063:2:20;2154:97:1;;;22045:21:20;22102:2;22082:18;;;22075:30;22141:15;22121:18;;;22114:43;22174:18;;2154:97:1;22035:163:20;2154:97:1;2272:23;2312:21;2323:10;2312:8;:21;:::i;:::-;2298:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2298:36:1;-1:-1:-1;2272:62:1;-1:-1:-1;2372:10:1;2355:116;2388:8;2384:1;:12;2355:116;;;2443:3;:13;;2457:1;2443:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;2418:6;2425:14;2429:10;2425:1;:14;:::i;:::-;2418:22;;;;;;;;:::i;:::-;:41;;;;:22;;;;;;;;;;;:41;2398:3;;;:::i;:::-;;;2355:116;;;-1:-1:-1;2498:6:1;1919:593;-1:-1:-1;;;;1919:593:1:o;544:305:5:-;596:13;612:20;;;:11;:20;;;;;;;;643:32;612:20;624:7;643:16;:32::i;:::-;727:1;692:23;;;:14;:23;;;;;;:37;:23;:37;688:100;;753:23;;;;:14;:23;;;;;746:30;;;;;;688:100;805:36;;833:7;;829:1;;805:36;;;;;;829:1;;805:36;585:264;544:305;:::o;599:775:15:-;741:19;;;737:630;;781:21;;;797:4;781:21;777:360;;;823:28;;:20;;;;:28;;;;;844:6;;823:28;;;;844:6;823:20;:28;;;;;;;;;;;;;;;;;;;;;737:630;;777:360;877:19;;;891:4;877:19;873:264;;;925:18;;;933:10;925:18;917:56;;;;;;;14383:2:20;917:56:15;;;14365:21:20;14422:2;14402:18;;;14395:30;14461:27;14441:18;;;14434:55;14506:18;;917:56:15;14355:175:20;917:56:15;1013:6;1000:9;:19;992:58;;;;;;;19222:2:20;992:58:15;;;19204:21:20;19261:2;19241:18;;;19234:30;19300:28;19280:18;;;19273:56;19346:18;;992:58:15;19194:176:20;992:58:15;737:630;;873:264;1091:30;;;;;16358:2:20;1091:30:15;;;16340:21:20;16397:2;16377:18;;;16370:30;16436:22;16416:18;;;16409:50;16476:18;;1091:30:15;16330:170:20;737:630:15;1173:21;;;1189:4;1173:21;1169:187;;;1215:37;1234:5;1241:2;1245:6;1215:18;:37::i;1169:187::-;1293:47;1316:5;1323:4;1329:2;1333:6;1293:22;:47::i;1352:130:16:-;1266:6;;1415:23;1266:6;734:10:3;1415:23:16;1407:68;;;;;;;20611:2:20;1407:68:16;;;20593:21:20;;;20630:18;;;20623:30;20689:34;20669:18;;;20662:62;20741:18;;1407:68:16;20583:182:20;2419:187:16;2511:6;;;;2527:17;;;;;;;;;;;2559:40;;2511:6;;;2527:17;2511:6;;2559:40;;2492:16;;2559:40;2482:124;2419:187;:::o;201:277:1:-;262:4;283:19;292:3;297:4;283:8;:19::i;:::-;279:64;;;-1:-1:-1;326:5:1;319:12;;279:64;-1:-1:-1;383:13:1;;;;:20;;363:17;;;:11;:17;;;;;;;;;;:40;;;414:24;;;;;;;;;;;;;;;;;;;;;;201:277;;;;:::o;490:460::-;554:4;576:19;585:3;590:4;576:8;:19::i;:::-;571:65;;-1:-1:-1;619:5:1;612:12;;571:65;672:17;;;656:13;672:17;;;;;;;;;;;715:13;;;;729:20;;672:17;;656:13;715;;729:24;;;:::i;:::-;715:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;775:17;;;;;;;;;;;:25;;;811:17;;;;;;;:21;;;;715:39;853:13;;:20;;715:39;;-1:-1:-1;715:39:1;;795:5;;853:20;;;;;;:::i;:::-;;;;;;;;;:27;;;;;;;;;;;;;;;;;;891:3;:13;;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;490:460:1;-1:-1:-1;;;;490:460:1:o;1252:1596:19:-;1330:13;1356:14;1385:1;1373:2;:9;:13;;;;:::i;:::-;1356:30;;1397:14;1427:1;1415:2;:9;:13;;;;:::i;:::-;1414:19;;1432:1;1414:19;:::i;:::-;1397:36;-1:-1:-1;1444:19:19;1539:1;1525:10;1529:6;1539:1;1525:10;:::i;:::-;1524:16;;;;:::i;:::-;1500:11;:19;;1518:1;1500:19;;;1514:1;1500:19;1490:30;;;;:6;:30;:::i;:::-;:51;;;;:::i;:::-;1466:86;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1466:86:19;;1444:108;;1565:9;1589;1613:448;1624:6;1620:1;:10;1613:448;;;1661:17;;;;;;;;;;;;;;;;;1694:1;1685:2;1688:1;1685:5;;;;;;;;:::i;:::-;;;;;1661:36;;1685:5;;;;:10;;;:5;1679:17;;1661:36;;;;;;:::i;:::-;;;;;;;1647:6;1654:3;;;;:::i;:::-;;;1647:11;;;;;;;;:::i;:::-;;;;:50;;;;;;;;;;;1726:17;;;;;;;;;;;;;;;;;1806:1;1793:2;1796:5;:1;1800;1796:5;:::i;:::-;1793:9;;;;;;;;:::i;:::-;;;;;;;;;:14;;;;;1787:1;1770:2;1773:1;1770:5;;;;;;;;:::i;:::-;;;;;1726:98;;1770:12;;;;1769:19;;;1768:40;;;;1770:5;1762:47;;1726:98;;;;;;:::i;:::-;;;;;;;1712:6;1719:3;;;;:::i;:::-;;;1712:11;;;;;;;;:::i;:::-;;;;:112;;;;;;;;;;;1853:17;;;;;;;;;;;;;;;;;1937:1;1924:2;1927:5;:1;1931;1927:5;:::i;:::-;1924:9;;;;;;;;:::i;:::-;;;;;;;:14;;1918:1;1897:2;1900:5;:1;1904;1900:5;:::i;:::-;1897:9;;;;;;;;:::i;:::-;;;;;1853:102;;1897:16;;;;1896:23;;;1895:44;;;;1897:9;1889:51;;1853:102;;;;;;:::i;:::-;;;;;;;1839:6;1846:3;;;;:::i;:::-;;;1839:11;;;;;;;;:::i;:::-;;;;:116;;;;;;;;;;;1984:17;;;;;;;;;;;;;;;;;2008:2;2011:5;:1;2015;2011:5;:::i;:::-;2008:9;;;;;;;;:::i;:::-;;;;;;1984:42;;2008:9;;;;;2020:4;2002:23;;1984:42;;;;;;:::i;:::-;;;;;;;1970:6;1977:3;;;;:::i;:::-;;;1970:11;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;2043:6:19;2048:1;2043:6;;:::i;:::-;;;1613:448;;;2077:11;;2073:734;;2119:17;;;;;;;;;;;;;;;;;2152:1;2143:2;2146:1;2143:5;;;;;;;;:::i;:::-;;;;;2119:36;;2143:5;;;;:10;;;:5;2137:17;;2119:36;;;;;;:::i;:::-;;;;;;;2105:6;2112:3;;;;:::i;:::-;;;2105:11;;;;;;;;:::i;:::-;;;;:50;;;;;;;;;;;2176:6;2186:1;2176:11;2172:624;;;2222:17;;;;;;;;;;;;;;;;;2306:1;2293:2;2296:5;:1;2300;2296:5;:::i;:::-;2293:9;;;;;;;;:::i;:::-;;;;;;;;;:14;;;;;2287:1;2270:2;2273:1;2270:5;;;;;;;;:::i;:::-;;;;;2222:106;;2270:12;;;;2269:19;;;2268:40;;;;2270:5;2262:47;;2222:106;;;;;;:::i;:::-;;;;;;;2208:6;2215:3;;;;:::i;:::-;;;2208:11;;;;;;;;:::i;:::-;;;;:120;;;;;;;;;;;2361:17;;;;;;;;;;;;;;;;;2407:1;2386:2;2389:5;:1;2393;2389:5;:::i;:::-;2386:9;;;;;;;;:::i;:::-;;;;;2361:49;;2386:16;;;;2385:23;;;2386:9;2379:30;;2361:49;;;;;;:::i;:::-;;;;;;;2347:6;2354:3;;;;:::i;:::-;;;2347:11;;;;;;;;:::i;:::-;;;;:63;;;;;;;;;;;2443:17;;;;;;;;;;;;;;;;;2461:1;2443:20;;;;;;;;:::i;:::-;;;;;;;2429:6;2436:3;;;;:::i;:::-;;;2429:11;;;;;;;;:::i;:::-;;;;:34;;;;;;;;;;-1:-1:-1;2482:18:19;:6;2489:3;;;;:::i;:::-;;;2482:11;;;;;;;;:::i;:::-;;;;:18;;;;;;;;;;;2172:624;;;2555:17;;;;;;;;;;;;;;;;;2597:1;2580:2;2583:1;2580:5;;;;;;;;:::i;:::-;;;;;2555:45;;2580:12;;;;2579:19;;;2580:5;2573:26;;2555:45;;;;;;:::i;:::-;;;;;;;2541:6;2548:3;;;;:::i;:::-;;;2541:11;;;;;;;;:::i;:::-;;;;:59;;;;;;;;;;;2633:17;;;;;;;;;;;;;;;;;2651:1;2633:20;;;;;;;;:::i;:::-;;;;;;;2619:6;2626:3;;;;:::i;:::-;;;2619:11;;;;;;;;:::i;:::-;;;;:34;;;;;;;;;;;2686:17;;;;;;;;;;;;;;;;;2704:1;2686:20;;;;;;;;:::i;:::-;;;;;;;2672:6;2679:3;;;;:::i;:::-;;;2672:11;;;;;;;;:::i;:::-;;;;:34;;;;;;;;;;-1:-1:-1;2725:18:19;:6;2732:3;;;;:::i;:::-;;;2725:11;;;;;;;;:::i;:::-;;;;:18;;;;;;;;;;-1:-1:-1;2762:18:19;:6;2769:3;;;;:::i;:::-;;;2762:11;;;;;;;;:::i;:::-;;;;:18;;;;;;;;;;;2172:624;-1:-1:-1;2833:6:19;;1252:1596;-1:-1:-1;;;;;1252:1596:19:o;597:162:18:-;678:13;745:1;748;728:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;714:37;;597:162;;;;:::o;4762:550:4:-;4839:13;4855:20;;;:11;:20;;;;;;;;;4915:17;;;;;:11;:17;;;;;4963:13;;4855:20;;4915:17;;4963;;4979:1;;4963:17;:::i;:::-;4943:37;;5052:19;5074:6;5081:9;5074:17;;;;;;;;:::i;:::-;;;;;;;;;5052:39;;5118:11;5102:6;5109:5;5102:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;;5140:24;;;:11;:24;;;;;;:32;;;5199:12;;:6;;:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;5284:20;;;:11;:20;;;-1:-1:-1;;5284:20:4;;;;5277:27;;;;;;-1:-1:-1;;;4762:550:4:o;119:188:17:-;225:73;;12468:42:20;12456:55;;225:73:17;;;12438:74:20;12528:18;;;12521:34;;;199:100:17;;218:5;;262:24;;12411:18:20;;225:73:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;199:18;:100::i;316:216::-;440:83;;11557:42:20;11626:15;;;440:83:17;;;11608:34:20;11678:15;;11658:18;;;11651:43;11710:18;;;11703:34;;;414:110:17;;433:5;;477:28;;11520:18:20;;440:83:17;11502:241:20;1748:359:17;1830:12;1844:23;1871:5;:10;;1882:4;1871:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1829:58;;;;1906:7;1898:52;;;;;;;17753:2:20;1898:52:17;;;17735:21:20;;;17772:18;;;17765:30;17831:34;17811:18;;;17804:62;17883:18;;1898:52:17;17725:182:20;1898:52:17;1965:17;;:21;1961:139;;2022:10;2011:30;;;;;;;;;;;;:::i;:::-;2003:85;;;;;;;21652:2:20;2003:85:17;;;21634:21:20;21691:2;21671:18;;;21664:30;21730:34;21710:18;;;21703:62;21801:12;21781:18;;;21774:40;21831:19;;2003:85:17;21624:232:20;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:723:20;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;139:1;136;129:12;88:2;175:6;162:20;201:4;224:18;220:2;217:26;214:2;;;246:18;;:::i;:::-;292:2;289:1;285:10;315:28;339:2;335;331:11;315:28;:::i;:::-;377:15;;;408:12;;;;440:15;;;474;;;470:24;;467:33;-1:-1:-1;464:2:20;;;513:1;510;503:12;464:2;535:1;526:10;;545:163;559:2;556:1;553:9;545:163;;;616:17;;604:30;;577:1;570:9;;;;;654:12;;;;686;;545:163;;;-1:-1:-1;726:5:20;78:659;-1:-1:-1;;;;;;;78:659:20:o;742:589::-;784:5;837:3;830:4;822:6;818:17;814:27;804:2;;855:1;852;845:12;804:2;891:6;878:20;917:18;913:2;910:26;907:2;;;939:18;;:::i;:::-;983:114;1091:4;1022:66;1015:4;1011:2;1007:13;1003:86;999:97;983:114;:::i;:::-;1122:2;1113:7;1106:19;1168:3;1161:4;1156:2;1148:6;1144:15;1140:26;1137:35;1134:2;;;1185:1;1182;1175:12;1134:2;1250;1243:4;1235:6;1231:17;1224:4;1215:7;1211:18;1198:55;1298:1;1273:16;;;1291:4;1269:27;1262:38;;;;1277:7;794:537;-1:-1:-1;;;794:537:20:o;1336:247::-;1395:6;1448:2;1436:9;1427:7;1423:23;1419:32;1416:2;;;1464:1;1461;1454:12;1416:2;1503:9;1490:23;1522:31;1547:5;1522:31;:::i;1588:251::-;1658:6;1711:2;1699:9;1690:7;1686:23;1682:32;1679:2;;;1727:1;1724;1717:12;1679:2;1759:9;1753:16;1778:31;1803:5;1778:31;:::i;1844:388::-;1912:6;1920;1973:2;1961:9;1952:7;1948:23;1944:32;1941:2;;;1989:1;1986;1979:12;1941:2;2028:9;2015:23;2047:31;2072:5;2047:31;:::i;:::-;2097:5;-1:-1:-1;2154:2:20;2139:18;;2126:32;2167:33;2126:32;2167:33;:::i;:::-;2219:7;2209:17;;;1931:301;;;;;:::o;2237:624::-;2339:6;2347;2355;2408:2;2396:9;2387:7;2383:23;2379:32;2376:2;;;2424:1;2421;2414:12;2376:2;2463:9;2450:23;2482:31;2507:5;2482:31;:::i;:::-;2532:5;-1:-1:-1;2589:2:20;2574:18;;2561:32;2602:33;2561:32;2602:33;:::i;:::-;2654:7;-1:-1:-1;2712:2:20;2697:18;;2684:32;2739:18;2728:30;;2725:2;;;2771:1;2768;2761:12;2725:2;2794:61;2847:7;2838:6;2827:9;2823:22;2794:61;:::i;:::-;2784:71;;;2366:495;;;;;:::o;2866:844::-;2986:6;2994;3002;3010;3063:3;3051:9;3042:7;3038:23;3034:33;3031:2;;;3080:1;3077;3070:12;3031:2;3119:9;3106:23;3138:31;3163:5;3138:31;:::i;:::-;3188:5;-1:-1:-1;3245:2:20;3230:18;;3217:32;3258:33;3217:32;3258:33;:::i;:::-;3310:7;-1:-1:-1;3368:2:20;3353:18;;3340:32;3391:18;3421:14;;;3418:2;;;3448:1;3445;3438:12;3418:2;3471:61;3524:7;3515:6;3504:9;3500:22;3471:61;:::i;:::-;3461:71;;3585:2;3574:9;3570:18;3557:32;3541:48;;3614:2;3604:8;3601:16;3598:2;;;3630:1;3627;3620:12;3598:2;;3653:51;3696:7;3685:8;3674:9;3670:24;3653:51;:::i;:::-;3643:61;;;3021:689;;;;;;;:::o;3715:456::-;3792:6;3800;3808;3861:2;3849:9;3840:7;3836:23;3832:32;3829:2;;;3877:1;3874;3867:12;3829:2;3916:9;3903:23;3935:31;3960:5;3935:31;:::i;:::-;3985:5;-1:-1:-1;4042:2:20;4027:18;;4014:32;4055:33;4014:32;4055:33;:::i;:::-;3819:352;;4107:7;;-1:-1:-1;;;4161:2:20;4146:18;;;;4133:32;;3819:352::o;4176:665::-;4271:6;4279;4287;4295;4348:3;4336:9;4327:7;4323:23;4319:33;4316:2;;;4365:1;4362;4355:12;4316:2;4404:9;4391:23;4423:31;4448:5;4423:31;:::i;:::-;4473:5;-1:-1:-1;4530:2:20;4515:18;;4502:32;4543:33;4502:32;4543:33;:::i;:::-;4595:7;-1:-1:-1;4649:2:20;4634:18;;4621:32;;-1:-1:-1;4704:2:20;4689:18;;4676:32;4731:18;4720:30;;4717:2;;;4763:1;4760;4753:12;4717:2;4786:49;4827:7;4818:6;4807:9;4803:22;4786:49;:::i;4846:382::-;4911:6;4919;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4988:1;4985;4978:12;4940:2;5027:9;5014:23;5046:31;5071:5;5046:31;:::i;:::-;5096:5;-1:-1:-1;5153:2:20;5138:18;;5125:32;5166:30;5125:32;5166:30;:::i;5233:315::-;5301:6;5309;5362:2;5350:9;5341:7;5337:23;5333:32;5330:2;;;5378:1;5375;5368:12;5330:2;5417:9;5404:23;5436:31;5461:5;5436:31;:::i;:::-;5486:5;5538:2;5523:18;;;;5510:32;;-1:-1:-1;;;5320:228:20:o;5553:383::-;5630:6;5638;5646;5699:2;5687:9;5678:7;5674:23;5670:32;5667:2;;;5715:1;5712;5705:12;5667:2;5754:9;5741:23;5773:31;5798:5;5773:31;:::i;:::-;5823:5;5875:2;5860:18;;5847:32;;-1:-1:-1;5926:2:20;5911:18;;;5898:32;;5657:279;-1:-1:-1;;;5657:279:20:o;5941:348::-;6025:6;6078:2;6066:9;6057:7;6053:23;6049:32;6046:2;;;6094:1;6091;6084:12;6046:2;6134:9;6121:23;6167:18;6159:6;6156:30;6153:2;;;6199:1;6196;6189:12;6153:2;6222:61;6275:7;6266:6;6255:9;6251:22;6222:61;:::i;6294:245::-;6361:6;6414:2;6402:9;6393:7;6389:23;6385:32;6382:2;;;6430:1;6427;6420:12;6382:2;6462:9;6456:16;6481:28;6503:5;6481:28;:::i;6544:245::-;6602:6;6655:2;6643:9;6634:7;6630:23;6626:32;6623:2;;;6671:1;6668;6661:12;6623:2;6710:9;6697:23;6729:30;6753:5;6729:30;:::i;6794:249::-;6863:6;6916:2;6904:9;6895:7;6891:23;6887:32;6884:2;;;6932:1;6929;6922:12;6884:2;6964:9;6958:16;6983:30;7007:5;6983:30;:::i;7048:321::-;7117:6;7170:2;7158:9;7149:7;7145:23;7141:32;7138:2;;;7186:1;7183;7176:12;7138:2;7226:9;7213:23;7259:18;7251:6;7248:30;7245:2;;;7291:1;7288;7281:12;7245:2;7314:49;7355:7;7346:6;7335:9;7331:22;7314:49;:::i;7374:456::-;7452:6;7460;7513:2;7501:9;7492:7;7488:23;7484:32;7481:2;;;7529:1;7526;7519:12;7481:2;7569:9;7556:23;7602:18;7594:6;7591:30;7588:2;;;7634:1;7631;7624:12;7588:2;7657:49;7698:7;7689:6;7678:9;7674:22;7657:49;:::i;:::-;7647:59;;;7756:2;7745:9;7741:18;7728:32;7769:31;7794:5;7769:31;:::i;7835:457::-;7922:6;7930;7938;7991:2;7979:9;7970:7;7966:23;7962:32;7959:2;;;8007:1;8004;7997:12;7959:2;8047:9;8034:23;8080:18;8072:6;8069:30;8066:2;;;8112:1;8109;8102:12;8066:2;8135:49;8176:7;8167:6;8156:9;8152:22;8135:49;:::i;:::-;8125:59;8231:2;8216:18;;8203:32;;-1:-1:-1;8282:2:20;8267:18;;;8254:32;;7949:343;-1:-1:-1;;;;7949:343:20:o;8297:180::-;8356:6;8409:2;8397:9;8388:7;8384:23;8380:32;8377:2;;;8425:1;8422;8415:12;8377:2;-1:-1:-1;8448:23:20;;8367:110;-1:-1:-1;8367:110:20:o;8482:435::-;8535:3;8573:5;8567:12;8600:6;8595:3;8588:19;8626:4;8655:2;8650:3;8646:12;8639:19;;8692:2;8685:5;8681:14;8713:1;8723:169;8737:6;8734:1;8731:13;8723:169;;;8798:13;;8786:26;;8832:12;;;;8867:15;;;;8759:1;8752:9;8723:169;;;-1:-1:-1;8908:3:20;;8543:374;-1:-1:-1;;;;;8543:374:20:o;8922:316::-;8963:3;9001:5;8995:12;9028:6;9023:3;9016:19;9044:63;9100:6;9093:4;9088:3;9084:14;9077:4;9070:5;9066:16;9044:63;:::i;:::-;9152:2;9140:15;9157:66;9136:88;9127:98;;;;9227:4;9123:109;;8971:267;-1:-1:-1;;8971:267:20:o;9243:274::-;9372:3;9410:6;9404:13;9426:53;9472:6;9467:3;9460:4;9452:6;9448:17;9426:53;:::i;:::-;9495:16;;;;;9380:137;-1:-1:-1;;9380:137:20:o;9803:470::-;9982:3;10020:6;10014:13;10036:53;10082:6;10077:3;10070:4;10062:6;10058:17;10036:53;:::i;:::-;10152:13;;10111:16;;;;10174:57;10152:13;10111:16;10208:4;10196:17;;10174:57;:::i;:::-;10247:20;;9990:283;-1:-1:-1;;;;9990:283:20:o;10696:644::-;10940:4;10969:42;11050:2;11042:6;11038:15;11027:9;11020:34;11102:2;11094:6;11090:15;11085:2;11074:9;11070:18;11063:43;;11142:3;11137:2;11126:9;11122:18;11115:31;11169:57;11221:3;11210:9;11206:19;11198:6;11169:57;:::i;:::-;11274:9;11266:6;11262:22;11257:2;11246:9;11242:18;11235:50;11302:32;11327:6;11319;11302:32;:::i;:::-;11294:40;10949:391;-1:-1:-1;;;;;;;10949:391:20:o;11748:511::-;11942:4;11971:42;12052:2;12044:6;12040:15;12029:9;12022:34;12104:2;12096:6;12092:15;12087:2;12076:9;12072:18;12065:43;;12144:6;12139:2;12128:9;12124:18;12117:34;12187:3;12182:2;12171:9;12167:18;12160:31;12208:45;12248:3;12237:9;12233:19;12225:6;12208:45;:::i;:::-;12200:53;11951:308;-1:-1:-1;;;;;;11951:308:20:o;12566:681::-;12737:2;12789:21;;;12859:13;;12762:18;;;12881:22;;;12708:4;;12737:2;12960:15;;;;12934:2;12919:18;;;12708:4;13003:218;13017:6;13014:1;13011:13;13003:218;;;13082:13;;13097:42;13078:62;13066:75;;13196:15;;;;13161:12;;;;13039:1;13032:9;13003:218;;;-1:-1:-1;13238:3:20;;12717:530;-1:-1:-1;;;;;;12717:530:20:o;13252:261::-;13431:2;13420:9;13413:21;13394:4;13451:56;13503:2;13492:9;13488:18;13480:6;13451:56;:::i;13957:219::-;14106:2;14095:9;14088:21;14069:4;14126:44;14166:2;14155:9;14151:18;14143:6;14126:44;:::i;22789:334::-;22860:2;22854:9;22916:2;22906:13;;22921:66;22902:86;22890:99;;23019:18;23004:34;;23040:22;;;23001:62;22998:2;;;23066:18;;:::i;:::-;23102:2;23095:22;22834:289;;-1:-1:-1;22834:289:20:o;23128:128::-;23168:3;23199:1;23195:6;23192:1;23189:13;23186:2;;;23205:18;;:::i;:::-;-1:-1:-1;23241:9:20;;23176:80::o;23261:120::-;23301:1;23327;23317:2;;23332:18;;:::i;:::-;-1:-1:-1;23366:9:20;;23307:74::o;23386:228::-;23426:7;23552:1;23484:66;23480:74;23477:1;23474:81;23469:1;23462:9;23455:17;23451:105;23448:2;;;23559:18;;:::i;:::-;-1:-1:-1;23599:9:20;;23438:176::o;23619:125::-;23659:4;23687:1;23684;23681:8;23678:2;;;23692:18;;:::i;:::-;-1:-1:-1;23729:9:20;;23668:76::o;23749:258::-;23821:1;23831:113;23845:6;23842:1;23839:13;23831:113;;;23921:11;;;23915:18;23902:11;;;23895:39;23867:2;23860:10;23831:113;;;23962:6;23959:1;23956:13;23953:2;;;-1:-1:-1;;23997:1:20;23979:16;;23972:27;23802:205::o;24012:437::-;24091:1;24087:12;;;;24134;;;24155:2;;24209:4;24201:6;24197:17;24187:27;;24155:2;24262;24254:6;24251:14;24231:18;24228:38;24225:2;;;24299:77;24296:1;24289:88;24400:4;24397:1;24390:15;24428:4;24425:1;24418:15;24225:2;;24067:382;;;:::o;24454:195::-;24493:3;24524:66;24517:5;24514:77;24511:2;;;24594:18;;:::i;:::-;-1:-1:-1;24641:1:20;24630:13;;24501:148::o;24654:112::-;24686:1;24712;24702:2;;24717:18;;:::i;:::-;-1:-1:-1;24751:9:20;;24692:74::o;24771:184::-;24823:77;24820:1;24813:88;24920:4;24917:1;24910:15;24944:4;24941:1;24934:15;24960:184;25012:77;25009:1;25002:88;25109:4;25106:1;25099:15;25133:4;25130:1;25123:15;25149:184;25201:77;25198:1;25191:88;25298:4;25295:1;25288:15;25322:4;25319:1;25312:15;25338:184;25390:77;25387:1;25380:88;25487:4;25484:1;25477:15;25511:4;25508:1;25501:15;25527:184;25579:77;25576:1;25569:88;25676:4;25673:1;25666:15;25700:4;25697:1;25690:15;25716:154;25802:42;25795:5;25791:54;25784:5;25781:65;25771:2;;25860:1;25857;25850:12;25875:118;25961:5;25954:13;25947:21;25940:5;25937:32;25927:2;;25983:1;25980;25973:12;25998:177;26083:66;26076:5;26072:78;26065:5;26062:89;26052:2;;26165:1;26162;26155:12

Swarm Source

ipfs://6c5d60ca1aee1c6ba8c1b000b9fe2beb95013e84a3c02df82e4b10e03322c656

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.