ETH Price: $2,858.32 (-2.73%)
 

Overview

Max Total Supply

184,685 PAC

Holders

557

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 PAC
0x638f093f26c6c1adc01957771b454df083ec1a7d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

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 7 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 1 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 2 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 3 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 4 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 5 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 6 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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.