Address Details
contract
token

0x9eBF4D434139A90d8bB9c6da4E9e2FA909E711a7

Token
Proof of Attendance Verified (POAV)
Creator
0x0ca82c–81b919 at 0xb75674–8d7c4d
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
59 Transactions
Transfers
0 Transfers
Gas Used
6,470,095
Last Balance Update
14929373
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
POAVToken




Optimization enabled
false
Compiler version
v0.8.2+commit.661d1103




EVM Version
istanbul




Verified at
2022-11-09T08:08:18.910967Z

POAV2.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

library AddressUtils {
  function isContract(address _addr) internal view returns (bool addressCheck) {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }
}

contract NFToken   {
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";
  address contractOwner ;
  /**
   * @dev Magic value of a smart contract that can recieve NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    
  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;



   /**
   * @dev Mapping from owner address to count of his tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

 
  modifier validNFToken(uint256 _tokenId) {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }
  modifier onlyOwner() {
    require(contractOwner == msg.sender, NOT_OWNER_OR_OPERATOR);
    _;
  }

  mapping(bytes4 => bool) internal supportedInterfaces;
  constructor()  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
    contractOwner= msg.sender;
  }


  function supportsInterface (bytes4 _interfaceID) external  view returns (bool) {
    return supportedInterfaces[_interfaceID];
  }

  function balanceOf(address _owner) external  view returns (uint256) {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  function ownerOf(uint256 _tokenId) external  view returns (address _owner) {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  function _mint(address _to, uint256 _tokenId) internal  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    _addNFToken(_to, _tokenId);
  }

  function _addNFToken(address _to, uint256 _tokenId) internal  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to] + 1;
    
  }

  function _getOwnerNFTCount(address _owner) internal  view returns (uint256) {
    return ownerToNFTokenCount[_owner];
  }

    

}

interface ERC721Metadata {
  function name() external view returns (string memory _name);
  function symbol() external view returns (string memory _symbol);
  function tokenURI(uint256 _tokenId) external view returns (string memory);
}

contract NFTokenMetadata is  NFToken{
  mapping (uint256 => string) internal idToUri;
  string internal  _baseURI; 
  constructor()  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
    _baseURI = "https://stamping.mypinata.cloud/ipfs/";
  }

  function tokenURI(uint256 _tokenId) external  view validNFToken(_tokenId) returns (string memory) {
        return bytes(_baseURI).length > 0
            ? string(abi.encodePacked(_baseURI, idToUri[_tokenId]))
            : '';

  }

  function baseURI() public view returns (string memory) {
        return _baseURI;
    }

  function setBaseURI(string calldata _uri) external onlyOwner {
    _baseURI = _uri;
  }

  function _setTokenUri(uint256 _tokenId, string  memory _uri) internal validNFToken(_tokenId) {
     idToUri[_tokenId] = _uri;
  } 


}

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}
library ECDSA {
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;
        if (signature.length == 65) {
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
        } else if (signature.length == 64) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                let vs := mload(add(signature, 0x40))
                r := mload(add(signature, 0x20))
                s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
                v := add(shr(255, vs), 27)
            }
        } else {
            revert("ECDSA: invalid signature length");
        }

        return recover(hash, v, r, s);
    }
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");
        return signer;
    }
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

contract POAVToken is NFTokenMetadata {
    using ECDSA for bytes32;
    bytes32 DOMAIN_SEPARATOR;
    bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    bytes32 constant internal VERIFIABLE_CREDENTIAL_TYPEHASH = keccak256("VerifiableCredential(address issuer,address subject,bytes32 POAV,uint256 validFrom,uint256 validTo)");
    struct EIP712Domain {string name;string version;uint256 chainId;address verifyingContract;}
    enum Status {Undefined, Active, Inactive, Revoked, StandBy}
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    address public owner;  
    mapping(string => address) private issuersOfPOAV;
    mapping(string => uint256) private validFromOfPOAV;
    mapping(string => mapping(address  => Status)) private statusOfPOAVSubject;
    uint256 private _POAVs;
    string public name;
    string public symbol;
    uint256 public decimals;
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event POAVMinted(address indexed issuer, string indexed POAV, uint validFrom );
    event POAVSent(address indexed issuer, string indexed POAV, address indexed subject, uint256 validFrom);
    event POAVStatusChanged(string indexed POAV, address indexed subject, Status _status);

    constructor()  {
        owner = msg.sender;
        decimals = 0;
        name   = "Proof of Attendance Verified";
        symbol = "POAV";
        _POAVs = 0;
        DOMAIN_SEPARATOR = hashEIP712Domain(
            EIP712Domain({
                name : "EIP712Domain",
                version : "1",
                chainId : 100,
                verifyingContract : address(this) //¿Es la dirección de la instancia del contrato?
                }));
    }

    function isIssuerOfPOAV(string calldata _POAV) external view returns (address) {
      return (issuersOfPOAV[_POAV]);
    }
    function isValidFromOfPOAV(string calldata _POAV) external view returns (uint256) {
      return (validFromOfPOAV[_POAV]);
    }
    function getStatusOf(string calldata _POAV, address _subject) external view returns (Status) {
      return (statusOfPOAVSubject[_POAV][_subject]);
    }
    function hashEIP712Domain(EIP712Domain memory eip712Domain) internal pure returns (bytes32) {
        return keccak256(abi.encode(EIP712DOMAIN_TYPEHASH,keccak256(bytes(eip712Domain.name)),keccak256(bytes(eip712Domain.version)),eip712Domain.chainId,eip712Domain.verifyingContract));
    }

    function hashVerifiableCredential(address _issuer,address _subject,string memory _POAV,uint256 _validFrom,uint256 _validTo) internal pure returns (bytes32) {//0xAABBCC11223344....556677
        return keccak256(abi.encode(VERIFIABLE_CREDENTIAL_TYPEHASH,_issuer,_subject,_POAV,_validFrom,_validTo));
    }

    function hashForSigned(string memory _POAV, address _subject) public view returns (bytes32) {
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                hashVerifiableCredential(issuersOfPOAV[_POAV], _subject, _POAV, validFromOfPOAV[_POAV], validFromOfPOAV[_POAV]+252478800)
            )
        );
        return (digest);
    }

    function validateSignature(string memory _POAV, address _subject,bytes32  _credentialHash, bytes memory _signature ) public view 
        returns (address, bytes32, bytes32) {
        return (_credentialHash.recover(_signature), hashForSigned(_POAV, _subject), 
        keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hashForSigned(_POAV, _subject))));
    }

    function close(string memory _POAV) public returns (bool) {
        require(issuersOfPOAV[_POAV]==msg.sender, "Does not have access");
        issuersOfPOAV[_POAV] = address(0);
        return true;
    }

    function changeStatus(string memory _POAV, address _subject, Status _status) public returns (bool) {
        require(issuersOfPOAV[_POAV]==msg.sender, "Does not have access");
        require(statusOfPOAVSubject[_POAV][_subject] != _status, "There is no change of state");
        statusOfPOAVSubject[_POAV][_subject] = _status;
        emit POAVStatusChanged(_POAV, _subject, _status);
        return true;
    }
    
    function mintEndorsed(string memory _POAV, bytes32  _credentialHash, bytes memory _signature) public returns (bool) {
        address  _issuer = _credentialHash.recover(_signature);
        require(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hashForSigned(_POAV, _issuer)))==_credentialHash, "Rejected POAV");
        require(_issuer!=msg.sender,"You cannot endorse from the same wallet");
        _mintPOAV( _POAV, _issuer, block.timestamp);
        return true;
    }
    
    function mint(string memory _POAV) public returns (bool) {
       _mintPOAV( _POAV, msg.sender, block.timestamp);
        return true;
    }

    function _mintPOAV(string memory _POAV, address _issuer, uint256 _validFrom) private returns (bool) {
        require(issuersOfPOAV[_POAV] == address(0), "POAV already exists");
        issuersOfPOAV[_POAV] = _issuer;
        validFromOfPOAV[_POAV] = _validFrom;
        _POAVs++;
        emit POAVMinted(_issuer, _POAV, _validFrom);
        return true;
    } 

    function burn(string memory _POAV) public returns (bool) {
        require(issuersOfPOAV[_POAV]==msg.sender, "Does not have access");
        delete issuersOfPOAV[_POAV];
        delete validFromOfPOAV[_POAV] ;
        return true;
    }

    function sendToBatchEndorsed(string memory _POAV, address[] memory _subjects, bytes32  _credentialHash, bytes memory _signature) public returns (bool) {
        address  _issuer = _credentialHash.recover(_signature);
        require(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hashForSigned(_POAV, _issuer)))==_credentialHash, "Rejected POAV");
        require(_issuer!=msg.sender,"You cannot endorse from the same wallet");
        
        require(issuersOfPOAV[_POAV]==_issuer, "Does not have access");
        for(uint256 indx = 0; indx < _subjects.length; indx++) {
            _claim(_POAV, _subjects[indx]);
        }
        return (true);
    }

    function sendToBatch(string memory _POAV, address[] memory _subjects) public returns (bool) {
        require(issuersOfPOAV[_POAV]==msg.sender, "Does not have access");
        for(uint256 indx = 0; indx < _subjects.length; indx++) {
            _claim(_POAV, _subjects[indx]);
        }
        return (true);
    }

    function sendToEndorsed(string memory _POAV, address _subject, bytes32  _credentialHash, bytes memory _signature) public returns (uint256) {
        address  _issuer = _credentialHash.recover(_signature);
        require(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hashForSigned(_POAV, _subject)))==_credentialHash, "Rejected POAV");
        require(_issuer!=msg.sender,"You cannot endorse from the same wallet");
        require(issuersOfPOAV[_POAV]==_issuer, "Does not have access");
        
        return (_claim(_POAV, _subject));
    }

    function sendTo(string memory _POAV, address _subject) public returns (uint256) {
        require(issuersOfPOAV[_POAV]==msg.sender, "Does not have access");
        return (_claim(_POAV, _subject));
    }

    function claimFrom(string memory _POAV, bytes32  _credentialHash, bytes memory _signature ) public returns (uint256) {
        require((issuersOfPOAV[_POAV]!=address(0) && issuersOfPOAV[_POAV]==_credentialHash.recover(_signature)), "Does not have access");
        require(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hashForSigned(_POAV, msg.sender)))==_credentialHash, "Rejected POAV");
        return (_claim(_POAV, msg.sender));
    }

    function _claim(string memory _POAV, address _subject) private returns (uint256) {
         require(issuersOfPOAV[_POAV]!=_subject, "Can't self-certify");
         require(statusOfPOAVSubject[_POAV][_subject]==Status.Undefined, "You can only get a POAV");
         
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(_subject, newItemId);
        _setTokenUri(newItemId, _POAV);
        statusOfPOAVSubject[_POAV][_subject] = Status.Active;
        emit Transfer(issuersOfPOAV[_POAV], _subject, newItemId);
        emit POAVSent(issuersOfPOAV[_POAV], _POAV, _subject, validFromOfPOAV[_POAV]);
        return newItemId;
    }

    function totalSupply() external  view returns (uint256) {
      return _tokenIds.current();
    }
    function totalPOAVs() external  view returns (uint256) {
      return _POAVs;
    }
}       
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"POAVMinted","inputs":[{"type":"address","name":"issuer","internalType":"address","indexed":true},{"type":"string","name":"POAV","internalType":"string","indexed":true},{"type":"uint256","name":"validFrom","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"POAVSent","inputs":[{"type":"address","name":"issuer","internalType":"address","indexed":true},{"type":"string","name":"POAV","internalType":"string","indexed":true},{"type":"address","name":"subject","internalType":"address","indexed":true},{"type":"uint256","name":"validFrom","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"POAVStatusChanged","inputs":[{"type":"string","name":"POAV","internalType":"string","indexed":true},{"type":"address","name":"subject","internalType":"address","indexed":true},{"type":"uint8","name":"_status","internalType":"enum POAVToken.Status","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true},{"type":"uint256","name":"_tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"baseURI","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"string","name":"_POAV","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"changeStatus","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"},{"type":"uint8","name":"_status","internalType":"enum POAVToken.Status"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"claimFrom","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"bytes32","name":"_credentialHash","internalType":"bytes32"},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"close","inputs":[{"type":"string","name":"_POAV","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum POAVToken.Status"}],"name":"getStatusOf","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"hashForSigned","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"isIssuerOfPOAV","inputs":[{"type":"string","name":"_POAV","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"isValidFromOfPOAV","inputs":[{"type":"string","name":"_POAV","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"string","name":"_POAV","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintEndorsed","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"bytes32","name":"_credentialHash","internalType":"bytes32"},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"_owner","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sendTo","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"sendToBatch","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address[]","name":"_subjects","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"sendToBatchEndorsed","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address[]","name":"_subjects","internalType":"address[]"},{"type":"bytes32","name":"_credentialHash","internalType":"bytes32"},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sendToEndorsed","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"},{"type":"bytes32","name":"_credentialHash","internalType":"bytes32"},{"type":"bytes","name":"_signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBaseURI","inputs":[{"type":"string","name":"_uri","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"_interfaceID","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPOAVs","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"validateSignature","inputs":[{"type":"string","name":"_POAV","internalType":"string"},{"type":"address","name":"_subject","internalType":"address"},{"type":"bytes32","name":"_credentialHash","internalType":"bytes32"},{"type":"bytes","name":"_signature","internalType":"bytes"}]}]
              

Contract Creation Code

Verify & Publish
0x60806040523480156200001157600080fd5b506001600360006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160036000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060600160405280602581526020016200445f6025913960059080519060200190620001799291906200039e565b5033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f819055506040518060400160405280601c81526020017f50726f6f66206f6620417474656e64616e636520566572696669656400000000815250600d9080519060200190620002109291906200039e565b506040518060400160405280600481526020017f504f415600000000000000000000000000000000000000000000000000000000815250600e90805190602001906200025e9291906200039e565b506000600c819055506200031a60405180608001604052806040518060400160405280600c81526020017f454950373132446f6d61696e000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250815260200161a4ec81526020013073ffffffffffffffffffffffffffffffffffffffff168152506200032660201b60201c565b6006819055506200058b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f826000015180519060200120836020015180519060200120846040015185606001516040516020016200038195949392919062000481565b604051602081830303815290604052805190602001209050919050565b828054620003ac9062000526565b90600052602060002090601f016020900481019282620003d057600085556200041c565b82601f10620003eb57805160ff19168380011785556200041c565b828001600101855582156200041c579182015b828111156200041b578251825591602001919060010190620003fe565b5b5090506200042b91906200042f565b5090565b5b808211156200044a57600081600090555060010162000430565b5090565b6200045981620004de565b82525050565b6200046a81620004f2565b82525050565b6200047b816200051c565b82525050565b600060a0820190506200049860008301886200045f565b620004a760208301876200045f565b620004b660408301866200045f565b620004c5606083018562000470565b620004d460808301846200044e565b9695505050505050565b6000620004eb82620004fc565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200053f57607f821691505b602082108114156200055657620005556200055c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613ec4806200059b6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638b1382fd116100f9578063c1596fc911610097578063ce80cca011610071578063ce80cca01461056e578063d85d3d271461059e578063dafa1d2d146105ce578063e8c8de70146105fe576101a9565b8063c1596fc9146104de578063c87b56dd1461050e578063ce3014b91461053e576101a9565b806392202f6e116100d357806392202f6e1461044257806395d89b41146104725780639d869eac146104905780639e376c11146104c0576101a9565b80638b1382fd146103c45780638c53abf2146103f45780638da5cb5b14610424576101a9565b8063313ce567116101665780636352211e116101405780636352211e146103165780636c0360eb1461034657806370a082311461036457806374f9445014610394576101a9565b8063313ce567146102ac57806355f804b3146102ca5780636088ea63146102e6576101a9565b806301ffc9a7146101ae57806306fdde03146101de5780630f09e2d8146101fc57806310647e1b1461022c57806318160ddd1461025e5780632955643c1461027c575b600080fd5b6101c860048036038101906101c39190612cd5565b61062e565b6040516101d59190613532565b60405180910390f35b6101e6610696565b6040516101f39190613630565b60405180910390f35b61021660048036038101906102119190612cfe565b610724565b60405161022391906134e0565b60405180910390f35b61024660048036038101906102419190612e30565b61076f565b604051610255939291906134fb565b60405180910390f35b6102666107d1565b60405161027391906137b2565b60405180910390f35b61029660048036038101906102919190612ddc565b6107e2565b6040516102a391906137b2565b60405180910390f35b6102b46108a2565b6040516102c191906137b2565b60405180910390f35b6102e460048036038101906102df9190612cfe565b6108a8565b005b61030060048036038101906102fb9190612cfe565b610985565b60405161030d91906137b2565b60405180910390f35b610330600480360381019061032b91906130c0565b6109b0565b60405161033d91906134e0565b60405180910390f35b61034e610a96565b60405161035b9190613630565b60405180910390f35b61037e60048036038101906103799190612cac565b610b28565b60405161038b91906137b2565b60405180910390f35b6103ae60048036038101906103a99190612d43565b610be2565b6040516103bb9190613615565b60405180910390f35b6103de60048036038101906103d99190612ddc565b610c58565b6040516103eb919061354d565b60405180910390f35b61040e60048036038101906104099190612e30565b610d27565b60405161041b91906137b2565b60405180910390f35b61042c610ee0565b60405161043991906134e0565b60405180910390f35b61045c60048036038101906104579190612ec3565b610f06565b6040516104699190613532565b60405180910390f35b61047a6111e7565b6040516104879190613630565b60405180910390f35b6104aa60048036038101906104a59190612d9b565b611275565b6040516104b79190613532565b60405180910390f35b6104c861138a565b6040516104d591906137b2565b60405180910390f35b6104f860048036038101906104f39190612f96565b611394565b6040516105059190613532565b60405180910390f35b610528600480360381019061052391906130c0565b6115b0565b6040516105359190613630565b60405180910390f35b61055860048036038101906105539190612f2a565b6116f8565b6040516105659190613532565b60405180910390f35b61058860048036038101906105839190613041565b61181b565b6040516105959190613532565b60405180910390f35b6105b860048036038101906105b39190612d9b565b61192b565b6040516105c59190613532565b60405180910390f35b6105e860048036038101906105e39190612d9b565b611942565b6040516105f59190613532565b60405180910390f35b61061860048036038101906106139190613041565b611a5c565b60405161062591906137b2565b60405180910390f35b600060036000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600d80546106a390613a04565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf90613a04565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b505050505081565b60006009838360405161073892919061342f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008060006107878486611c1690919063ffffffff16565b6107918888610c58565b61079b8989610c58565b6040516020016107ab9190613483565b604051602081830303815290604052805190602001209250925092509450945094915050565b60006107dd6007611ce0565b905090565b60003373ffffffffffffffffffffffffffffffffffffffff1660098460405161080b9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790613792565b60405180910390fd5b61089a8383611cee565b905092915050565b600f5481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109659190613630565b60405180910390fd5b5081816005919061098092919061296a565b505050565b6000600a838360405161099992919061342f565b908152602001604051809103902054905092915050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a879190613630565b60405180910390fd5b50919050565b606060058054610aa590613a04565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613a04565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89190613630565b60405180910390fd5b50610bdb82612108565b9050919050565b6000600b8484604051610bf692919061342f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b600080600654610cf4600986604051610c719190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168587600a89604051610cb29190613448565b908152602001604051809103902054630f0c8550600a8b604051610cd69190613448565b908152602001604051809103902054610cef91906138bc565b612151565b604051602001610d059291906134a9565b6040516020818303038152906040528051906020012090508091505092915050565b600080610d3d8385611c1690919063ffffffff16565b905083610d4a8787610c58565b604051602001610d5a9190613483565b6040516020818303038152906040528051906020012014610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e16906136f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600987604051610e469190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290613792565b60405180910390fd5b610ed58686611cee565b915050949350505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003373ffffffffffffffffffffffffffffffffffffffff16600985604051610f2f9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90613792565b60405180910390fd5b816004811115610fed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b85604051610ffd9190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600481111561108e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613752565b60405180910390fd5b81600b856040516110e09190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836004811115611173577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508273ffffffffffffffffffffffffffffffffffffffff168460405161119d9190613448565b60405180910390207f71416df70d37bb841ac884d01b163ff0e4fe5d2b9f452bedbb91308f649f6e5c846040516111d49190613615565b60405180910390a3600190509392505050565b600e80546111f490613a04565b80601f016020809104026020016040519081016040528092919081815260200182805461122090613a04565b801561126d5780601f106112425761010080835404028352916020019161126d565b820191906000526020600020905b81548152906001019060200180831161125057829003601f168201915b505050505081565b60003373ffffffffffffffffffffffffffffffffffffffff1660098360405161129e9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90613792565b60405180910390fd5b60006009836040516113359190613448565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c54905090565b6000806113aa8385611c1690919063ffffffff16565b9050836113b78783610c58565b6040516020016113c79190613483565b604051602081830303815290604052805190602001201461141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906136f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166009876040516114b39190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613792565b60405180910390fd5b60005b85518110156115a25761158e87878381518110611581577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611cee565b50808061159a90613a67565b91505061153b565b506001915050949350505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061168e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116859190613630565b60405180910390fd5b5060006005805461169e90613a04565b9050116116ba57604051806020016040528060008152506116f0565b6005600460008581526020019081526020016000206040516020016116e092919061345f565b6040516020818303038152906040525b915050919050565b60003373ffffffffffffffffffffffffffffffffffffffff166009846040516117219190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179d90613792565b60405180910390fd5b60005b8251811015611810576117fc848483815181106117ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611cee565b50808061180890613a67565b9150506117a9565b506001905092915050565b6000806118318385611c1690919063ffffffff16565b90508361183e8683610c58565b60405160200161184e9190613483565b60405160208183030381529060405280519060200120146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906136f2565b60405180910390fd5b61191e8582426121af565b5060019150509392505050565b60006119388233426121af565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff1660098360405161196b9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613792565b60405180910390fd5b600982604051611a009190613448565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a82604051611a419190613448565b90815260200160405180910390206000905560019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600985604051611a859190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611b535750611ae68284611c1690919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600985604051611b0c9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613792565b60405180910390fd5b82611b9d8533610c58565b604051602001611bad9190613483565b6040516020818303038152906040528051906020012014611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613672565b60405180910390fd5b611c0d8433611cee565b90509392505050565b600080600080604185511415611c43576020850151925060408501519150606085015160001a9050611cc9565b604085511415611c8d576040850151602086015193507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169250601b8160ff1c01915050611cc8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90613692565b60405180910390fd5b5b611cd586828585612364565b935050505092915050565b600081600001549050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600984604051611d179190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d94906136d2565b60405180910390fd5b60006004811115611dd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b84604051611de79190613448565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166004811115611e78577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613772565b60405180910390fd5b611ec260076124ef565b6000611ece6007611ce0565b9050611eda838261250e565b611ee481856126a0565b6001600b85604051611ef69190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836004811115611f89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550808373ffffffffffffffffffffffffffffffffffffffff16600986604051611fb69190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168460405161204c9190613448565b60405180910390206009866040516120649190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fef060a9a655ecd7a23c86b5d1ca6772c8ea95495d19654313d0bdfc004fe61f8600a886040516120da9190613448565b9081526020016040518091039020546040516120f691906137b2565b60405180910390a48091505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f78d766495a639e39ac46a0c4f7226dc41014051e6a16f1f2191196167c335d4a868686868660405160200161218e96959493929190613568565b60405160208183030381529060405280519060200120905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166009856040516121d89190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613732565b60405180910390fd5b8260098560405161226e9190613448565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a856040516122cb9190613448565b908152602001604051809103902081905550600c60008154809291906122f090613a67565b9190505550836040516123039190613448565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff167fccc58b3e01635cfde12019ef103098a30f0a06bb706656558422e0041d3340d58460405161235191906137b2565b60405180910390a3600190509392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156123cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c3906136b2565b60405180910390fd5b601b8460ff1614806123e15750601c8460ff16145b612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790613712565b60405180910390fd5b60006001868686866040516000815260200160405260405161244594939291906135d0565b6020604051602081039080840390855afa158015612467573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da90613652565b60405180910390fd5b80915050949350505050565b600181600001600082825461250491906138bc565b9250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad9190613630565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126889190613630565b60405180910390fd5b5061269c82826127aa565b5050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061277c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127739190613630565b60405180910390fd5b50816004600085815260200190815260200160002090805190602001906127a49291906129f0565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b9190613630565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461292391906138bc565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b82805461297690613a04565b90600052602060002090601f01602090048101928261299857600085556129df565b82601f106129b157803560ff19168380011785556129df565b828001600101855582156129df579182015b828111156129de5782358255916020019190600101906129c3565b5b5090506129ec9190612a76565b5090565b8280546129fc90613a04565b90600052602060002090601f016020900481019282612a1e5760008555612a65565b82601f10612a3757805160ff1916838001178555612a65565b82800160010185558215612a65579182015b82811115612a64578251825591602001919060010190612a49565b5b509050612a729190612a76565b5090565b5b80821115612a8f576000816000905550600101612a77565b5090565b6000612aa6612aa1846137f2565b6137cd565b90508083825260208201905082856020860282011115612ac557600080fd5b60005b85811015612af55781612adb8882612b7b565b845260208401935060208301925050600181019050612ac8565b5050509392505050565b6000612b12612b0d8461381e565b6137cd565b905082815260208101848484011115612b2a57600080fd5b612b358482856139c2565b509392505050565b6000612b50612b4b8461384f565b6137cd565b905082815260208101848484011115612b6857600080fd5b612b738482856139c2565b509392505050565b600081359050612b8a81613e22565b92915050565b600082601f830112612ba157600080fd5b8135612bb1848260208601612a93565b91505092915050565b600081359050612bc981613e39565b92915050565b600081359050612bde81613e50565b92915050565b600082601f830112612bf557600080fd5b8135612c05848260208601612aff565b91505092915050565b600081359050612c1d81613e67565b92915050565b60008083601f840112612c3557600080fd5b8235905067ffffffffffffffff811115612c4e57600080fd5b602083019150836001820283011115612c6657600080fd5b9250929050565b600082601f830112612c7e57600080fd5b8135612c8e848260208601612b3d565b91505092915050565b600081359050612ca681613e77565b92915050565b600060208284031215612cbe57600080fd5b6000612ccc84828501612b7b565b91505092915050565b600060208284031215612ce757600080fd5b6000612cf584828501612bcf565b91505092915050565b60008060208385031215612d1157600080fd5b600083013567ffffffffffffffff811115612d2b57600080fd5b612d3785828601612c23565b92509250509250929050565b600080600060408486031215612d5857600080fd5b600084013567ffffffffffffffff811115612d7257600080fd5b612d7e86828701612c23565b93509350506020612d9186828701612b7b565b9150509250925092565b600060208284031215612dad57600080fd5b600082013567ffffffffffffffff811115612dc757600080fd5b612dd384828501612c6d565b91505092915050565b60008060408385031215612def57600080fd5b600083013567ffffffffffffffff811115612e0957600080fd5b612e1585828601612c6d565b9250506020612e2685828601612b7b565b9150509250929050565b60008060008060808587031215612e4657600080fd5b600085013567ffffffffffffffff811115612e6057600080fd5b612e6c87828801612c6d565b9450506020612e7d87828801612b7b565b9350506040612e8e87828801612bba565b925050606085013567ffffffffffffffff811115612eab57600080fd5b612eb787828801612be4565b91505092959194509250565b600080600060608486031215612ed857600080fd5b600084013567ffffffffffffffff811115612ef257600080fd5b612efe86828701612c6d565b9350506020612f0f86828701612b7b565b9250506040612f2086828701612c0e565b9150509250925092565b60008060408385031215612f3d57600080fd5b600083013567ffffffffffffffff811115612f5757600080fd5b612f6385828601612c6d565b925050602083013567ffffffffffffffff811115612f8057600080fd5b612f8c85828601612b90565b9150509250929050565b60008060008060808587031215612fac57600080fd5b600085013567ffffffffffffffff811115612fc657600080fd5b612fd287828801612c6d565b945050602085013567ffffffffffffffff811115612fef57600080fd5b612ffb87828801612b90565b935050604061300c87828801612bba565b925050606085013567ffffffffffffffff81111561302957600080fd5b61303587828801612be4565b91505092959194509250565b60008060006060848603121561305657600080fd5b600084013567ffffffffffffffff81111561307057600080fd5b61307c86828701612c6d565b935050602061308d86828701612bba565b925050604084013567ffffffffffffffff8111156130aa57600080fd5b6130b686828701612be4565b9150509250925092565b6000602082840312156130d257600080fd5b60006130e084828501612c97565b91505092915050565b6130f281613912565b82525050565b61310181613924565b82525050565b61311081613930565b82525050565b61312761312282613930565b613ab0565b82525050565b613136816139b0565b82525050565b600061314883856138b1565b93506131558385846139c2565b82840190509392505050565b600061316c82613895565b61317681856138a0565b93506131868185602086016139d1565b61318f81613b76565b840191505092915050565b60006131a582613895565b6131af81856138b1565b93506131bf8185602086016139d1565b80840191505092915050565b600081546131d881613a04565b6131e281866138b1565b945060018216600081146131fd576001811461320e57613241565b60ff19831686528186019350613241565b61321785613880565b60005b838110156132395781548189015260018201915060208101905061321a565b838801955050505b50505092915050565b60006132576018836138a0565b915061326282613b87565b602082019050919050565b600061327a600d836138a0565b915061328582613bb0565b602082019050919050565b600061329d601f836138a0565b91506132a882613bd9565b602082019050919050565b60006132c0601c836138b1565b91506132cb82613c02565b601c82019050919050565b60006132e36002836138b1565b91506132ee82613c2b565b600282019050919050565b60006133066022836138a0565b915061331182613c54565b604082019050919050565b60006133296012836138a0565b915061333482613ca3565b602082019050919050565b600061334c6027836138a0565b915061335782613ccc565b604082019050919050565b600061336f6022836138a0565b915061337a82613d1b565b604082019050919050565b60006133926013836138a0565b915061339d82613d6a565b602082019050919050565b60006133b5601b836138a0565b91506133c082613d93565b602082019050919050565b60006133d86017836138a0565b91506133e382613dbc565b602082019050919050565b60006133fb6014836138a0565b915061340682613de5565b602082019050919050565b61341a81613999565b82525050565b613429816139a3565b82525050565b600061343c82848661313c565b91508190509392505050565b6000613454828461319a565b915081905092915050565b600061346b82856131cb565b915061347782846131cb565b91508190509392505050565b600061348e826132b3565b915061349a8284613116565b60208201915081905092915050565b60006134b4826132d6565b91506134c08285613116565b6020820191506134d08284613116565b6020820191508190509392505050565b60006020820190506134f560008301846130e9565b92915050565b600060608201905061351060008301866130e9565b61351d6020830185613107565b61352a6040830184613107565b949350505050565b600060208201905061354760008301846130f8565b92915050565b60006020820190506135626000830184613107565b92915050565b600060c08201905061357d6000830189613107565b61358a60208301886130e9565b61359760408301876130e9565b81810360608301526135a98186613161565b90506135b86080830185613411565b6135c560a0830184613411565b979650505050505050565b60006080820190506135e56000830187613107565b6135f26020830186613420565b6135ff6040830185613107565b61360c6060830184613107565b95945050505050565b600060208201905061362a600083018461312d565b92915050565b6000602082019050818103600083015261364a8184613161565b905092915050565b6000602082019050818103600083015261366b8161324a565b9050919050565b6000602082019050818103600083015261368b8161326d565b9050919050565b600060208201905081810360008301526136ab81613290565b9050919050565b600060208201905081810360008301526136cb816132f9565b9050919050565b600060208201905081810360008301526136eb8161331c565b9050919050565b6000602082019050818103600083015261370b8161333f565b9050919050565b6000602082019050818103600083015261372b81613362565b9050919050565b6000602082019050818103600083015261374b81613385565b9050919050565b6000602082019050818103600083015261376b816133a8565b9050919050565b6000602082019050818103600083015261378b816133cb565b9050919050565b600060208201905081810360008301526137ab816133ee565b9050919050565b60006020820190506137c76000830184613411565b92915050565b60006137d76137e8565b90506137e38282613a36565b919050565b6000604051905090565b600067ffffffffffffffff82111561380d5761380c613b47565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561383957613838613b47565b5b61384282613b76565b9050602081019050919050565b600067ffffffffffffffff82111561386a57613869613b47565b5b61387382613b76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006138c782613999565b91506138d283613999565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390757613906613aba565b5b828201905092915050565b600061391d82613979565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061397482613e0e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139bb82613966565b9050919050565b82818337600083830152505050565b60005b838110156139ef5780820151818401526020810190506139d4565b838111156139fe576000848401525b50505050565b60006002820490506001821680613a1c57607f821691505b60208210811415613a3057613a2f613b18565b5b50919050565b613a3f82613b76565b810181811067ffffffffffffffff82111715613a5e57613a5d613b47565b5b80604052505050565b6000613a7282613999565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aa557613aa4613aba565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f52656a656374656420504f415600000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e27742073656c662d636572746966790000000000000000000000000000600082015250565b7f596f752063616e6e6f7420656e646f7273652066726f6d207468652073616d6560008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f504f415620616c72656164792065786973747300000000000000000000000000600082015250565b7f5468657265206973206e6f206368616e6765206f662073746174650000000000600082015250565b7f596f752063616e206f6e6c7920676574206120504f4156000000000000000000600082015250565b7f446f6573206e6f74206861766520616363657373000000000000000000000000600082015250565b60058110613e1f57613e1e613ae9565b5b50565b613e2b81613912565b8114613e3657600080fd5b50565b613e4281613930565b8114613e4d57600080fd5b50565b613e598161393a565b8114613e6457600080fd5b50565b60058110613e7457600080fd5b50565b613e8081613999565b8114613e8b57600080fd5b5056fea26469706673582212206eda3c1fe9b2ef407411c0d04d4cb104b62615aaf2b8d1908c8003812bbea1d164736f6c6343000802003368747470733a2f2f7374616d70696e672e6d7970696e6174612e636c6f75642f697066732f

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80638b1382fd116100f9578063c1596fc911610097578063ce80cca011610071578063ce80cca01461056e578063d85d3d271461059e578063dafa1d2d146105ce578063e8c8de70146105fe576101a9565b8063c1596fc9146104de578063c87b56dd1461050e578063ce3014b91461053e576101a9565b806392202f6e116100d357806392202f6e1461044257806395d89b41146104725780639d869eac146104905780639e376c11146104c0576101a9565b80638b1382fd146103c45780638c53abf2146103f45780638da5cb5b14610424576101a9565b8063313ce567116101665780636352211e116101405780636352211e146103165780636c0360eb1461034657806370a082311461036457806374f9445014610394576101a9565b8063313ce567146102ac57806355f804b3146102ca5780636088ea63146102e6576101a9565b806301ffc9a7146101ae57806306fdde03146101de5780630f09e2d8146101fc57806310647e1b1461022c57806318160ddd1461025e5780632955643c1461027c575b600080fd5b6101c860048036038101906101c39190612cd5565b61062e565b6040516101d59190613532565b60405180910390f35b6101e6610696565b6040516101f39190613630565b60405180910390f35b61021660048036038101906102119190612cfe565b610724565b60405161022391906134e0565b60405180910390f35b61024660048036038101906102419190612e30565b61076f565b604051610255939291906134fb565b60405180910390f35b6102666107d1565b60405161027391906137b2565b60405180910390f35b61029660048036038101906102919190612ddc565b6107e2565b6040516102a391906137b2565b60405180910390f35b6102b46108a2565b6040516102c191906137b2565b60405180910390f35b6102e460048036038101906102df9190612cfe565b6108a8565b005b61030060048036038101906102fb9190612cfe565b610985565b60405161030d91906137b2565b60405180910390f35b610330600480360381019061032b91906130c0565b6109b0565b60405161033d91906134e0565b60405180910390f35b61034e610a96565b60405161035b9190613630565b60405180910390f35b61037e60048036038101906103799190612cac565b610b28565b60405161038b91906137b2565b60405180910390f35b6103ae60048036038101906103a99190612d43565b610be2565b6040516103bb9190613615565b60405180910390f35b6103de60048036038101906103d99190612ddc565b610c58565b6040516103eb919061354d565b60405180910390f35b61040e60048036038101906104099190612e30565b610d27565b60405161041b91906137b2565b60405180910390f35b61042c610ee0565b60405161043991906134e0565b60405180910390f35b61045c60048036038101906104579190612ec3565b610f06565b6040516104699190613532565b60405180910390f35b61047a6111e7565b6040516104879190613630565b60405180910390f35b6104aa60048036038101906104a59190612d9b565b611275565b6040516104b79190613532565b60405180910390f35b6104c861138a565b6040516104d591906137b2565b60405180910390f35b6104f860048036038101906104f39190612f96565b611394565b6040516105059190613532565b60405180910390f35b610528600480360381019061052391906130c0565b6115b0565b6040516105359190613630565b60405180910390f35b61055860048036038101906105539190612f2a565b6116f8565b6040516105659190613532565b60405180910390f35b61058860048036038101906105839190613041565b61181b565b6040516105959190613532565b60405180910390f35b6105b860048036038101906105b39190612d9b565b61192b565b6040516105c59190613532565b60405180910390f35b6105e860048036038101906105e39190612d9b565b611942565b6040516105f59190613532565b60405180910390f35b61061860048036038101906106139190613041565b611a5c565b60405161062591906137b2565b60405180910390f35b600060036000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600d80546106a390613a04565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf90613a04565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b505050505081565b60006009838360405161073892919061342f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008060006107878486611c1690919063ffffffff16565b6107918888610c58565b61079b8989610c58565b6040516020016107ab9190613483565b604051602081830303815290604052805190602001209250925092509450945094915050565b60006107dd6007611ce0565b905090565b60003373ffffffffffffffffffffffffffffffffffffffff1660098460405161080b9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088790613792565b60405180910390fd5b61089a8383611cee565b905092915050565b600f5481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109659190613630565b60405180910390fd5b5081816005919061098092919061296a565b505050565b6000600a838360405161099992919061342f565b908152602001604051809103902054905092915050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a879190613630565b60405180910390fd5b50919050565b606060058054610aa590613a04565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613a04565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89190613630565b60405180910390fd5b50610bdb82612108565b9050919050565b6000600b8484604051610bf692919061342f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b600080600654610cf4600986604051610c719190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168587600a89604051610cb29190613448565b908152602001604051809103902054630f0c8550600a8b604051610cd69190613448565b908152602001604051809103902054610cef91906138bc565b612151565b604051602001610d059291906134a9565b6040516020818303038152906040528051906020012090508091505092915050565b600080610d3d8385611c1690919063ffffffff16565b905083610d4a8787610c58565b604051602001610d5a9190613483565b6040516020818303038152906040528051906020012014610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e16906136f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600987604051610e469190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290613792565b60405180910390fd5b610ed58686611cee565b915050949350505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003373ffffffffffffffffffffffffffffffffffffffff16600985604051610f2f9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90613792565b60405180910390fd5b816004811115610fed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b85604051610ffd9190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600481111561108e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613752565b60405180910390fd5b81600b856040516110e09190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836004811115611173577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055508273ffffffffffffffffffffffffffffffffffffffff168460405161119d9190613448565b60405180910390207f71416df70d37bb841ac884d01b163ff0e4fe5d2b9f452bedbb91308f649f6e5c846040516111d49190613615565b60405180910390a3600190509392505050565b600e80546111f490613a04565b80601f016020809104026020016040519081016040528092919081815260200182805461122090613a04565b801561126d5780601f106112425761010080835404028352916020019161126d565b820191906000526020600020905b81548152906001019060200180831161125057829003601f168201915b505050505081565b60003373ffffffffffffffffffffffffffffffffffffffff1660098360405161129e9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90613792565b60405180910390fd5b60006009836040516113359190613448565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c54905090565b6000806113aa8385611c1690919063ffffffff16565b9050836113b78783610c58565b6040516020016113c79190613483565b604051602081830303815290604052805190602001201461141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906136f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166009876040516114b39190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90613792565b60405180910390fd5b60005b85518110156115a25761158e87878381518110611581577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611cee565b50808061159a90613a67565b91505061153b565b506001915050949350505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061168e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116859190613630565b60405180910390fd5b5060006005805461169e90613a04565b9050116116ba57604051806020016040528060008152506116f0565b6005600460008581526020019081526020016000206040516020016116e092919061345f565b6040516020818303038152906040525b915050919050565b60003373ffffffffffffffffffffffffffffffffffffffff166009846040516117219190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179d90613792565b60405180910390fd5b60005b8251811015611810576117fc848483815181106117ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611cee565b50808061180890613a67565b9150506117a9565b506001905092915050565b6000806118318385611c1690919063ffffffff16565b90508361183e8683610c58565b60405160200161184e9190613483565b60405160208183030381529060405280519060200120146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90613672565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906136f2565b60405180910390fd5b61191e8582426121af565b5060019150509392505050565b60006119388233426121af565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff1660098360405161196b9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613792565b60405180910390fd5b600982604051611a009190613448565b908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a82604051611a419190613448565b90815260200160405180910390206000905560019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600985604051611a859190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611b535750611ae68284611c1690919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600985604051611b0c9190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613792565b60405180910390fd5b82611b9d8533610c58565b604051602001611bad9190613483565b6040516020818303038152906040528051906020012014611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613672565b60405180910390fd5b611c0d8433611cee565b90509392505050565b600080600080604185511415611c43576020850151925060408501519150606085015160001a9050611cc9565b604085511415611c8d576040850151602086015193507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169250601b8160ff1c01915050611cc8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90613692565b60405180910390fd5b5b611cd586828585612364565b935050505092915050565b600081600001549050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600984604051611d179190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d94906136d2565b60405180910390fd5b60006004811115611dd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600b84604051611de79190613448565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166004811115611e78577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613772565b60405180910390fd5b611ec260076124ef565b6000611ece6007611ce0565b9050611eda838261250e565b611ee481856126a0565b6001600b85604051611ef69190613448565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836004811115611f89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550808373ffffffffffffffffffffffffffffffffffffffff16600986604051611fb69190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168460405161204c9190613448565b60405180910390206009866040516120649190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fef060a9a655ecd7a23c86b5d1ca6772c8ea95495d19654313d0bdfc004fe61f8600a886040516120da9190613448565b9081526020016040518091039020546040516120f691906137b2565b60405180910390a48091505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f78d766495a639e39ac46a0c4f7226dc41014051e6a16f1f2191196167c335d4a868686868660405160200161218e96959493929190613568565b60405160208183030381529060405280519060200120905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166009856040516121d89190613448565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613732565b60405180910390fd5b8260098560405161226e9190613448565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a856040516122cb9190613448565b908152602001604051809103902081905550600c60008154809291906122f090613a67565b9190505550836040516123039190613448565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff167fccc58b3e01635cfde12019ef103098a30f0a06bb706656558422e0041d3340d58460405161235191906137b2565b60405180910390a3600190509392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156123cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c3906136b2565b60405180910390fd5b601b8460ff1614806123e15750601c8460ff16145b612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790613712565b60405180910390fd5b60006001868686866040516000815260200160405260405161244594939291906135d0565b6020604051602081039080840390855afa158015612467573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da90613652565b60405180910390fd5b80915050949350505050565b600181600001600082825461250491906138bc565b9250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad9190613630565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126889190613630565b60405180910390fd5b5061269c82826127aa565b5050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061277c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127739190613630565b60405180910390fd5b50816004600085815260200190815260200160002090805190602001906127a49291906129f0565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b9190613630565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461292391906138bc565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b82805461297690613a04565b90600052602060002090601f01602090048101928261299857600085556129df565b82601f106129b157803560ff19168380011785556129df565b828001600101855582156129df579182015b828111156129de5782358255916020019190600101906129c3565b5b5090506129ec9190612a76565b5090565b8280546129fc90613a04565b90600052602060002090601f016020900481019282612a1e5760008555612a65565b82601f10612a3757805160ff1916838001178555612a65565b82800160010185558215612a65579182015b82811115612a64578251825591602001919060010190612a49565b5b509050612a729190612a76565b5090565b5b80821115612a8f576000816000905550600101612a77565b5090565b6000612aa6612aa1846137f2565b6137cd565b90508083825260208201905082856020860282011115612ac557600080fd5b60005b85811015612af55781612adb8882612b7b565b845260208401935060208301925050600181019050612ac8565b5050509392505050565b6000612b12612b0d8461381e565b6137cd565b905082815260208101848484011115612b2a57600080fd5b612b358482856139c2565b509392505050565b6000612b50612b4b8461384f565b6137cd565b905082815260208101848484011115612b6857600080fd5b612b738482856139c2565b509392505050565b600081359050612b8a81613e22565b92915050565b600082601f830112612ba157600080fd5b8135612bb1848260208601612a93565b91505092915050565b600081359050612bc981613e39565b92915050565b600081359050612bde81613e50565b92915050565b600082601f830112612bf557600080fd5b8135612c05848260208601612aff565b91505092915050565b600081359050612c1d81613e67565b92915050565b60008083601f840112612c3557600080fd5b8235905067ffffffffffffffff811115612c4e57600080fd5b602083019150836001820283011115612c6657600080fd5b9250929050565b600082601f830112612c7e57600080fd5b8135612c8e848260208601612b3d565b91505092915050565b600081359050612ca681613e77565b92915050565b600060208284031215612cbe57600080fd5b6000612ccc84828501612b7b565b91505092915050565b600060208284031215612ce757600080fd5b6000612cf584828501612bcf565b91505092915050565b60008060208385031215612d1157600080fd5b600083013567ffffffffffffffff811115612d2b57600080fd5b612d3785828601612c23565b92509250509250929050565b600080600060408486031215612d5857600080fd5b600084013567ffffffffffffffff811115612d7257600080fd5b612d7e86828701612c23565b93509350506020612d9186828701612b7b565b9150509250925092565b600060208284031215612dad57600080fd5b600082013567ffffffffffffffff811115612dc757600080fd5b612dd384828501612c6d565b91505092915050565b60008060408385031215612def57600080fd5b600083013567ffffffffffffffff811115612e0957600080fd5b612e1585828601612c6d565b9250506020612e2685828601612b7b565b9150509250929050565b60008060008060808587031215612e4657600080fd5b600085013567ffffffffffffffff811115612e6057600080fd5b612e6c87828801612c6d565b9450506020612e7d87828801612b7b565b9350506040612e8e87828801612bba565b925050606085013567ffffffffffffffff811115612eab57600080fd5b612eb787828801612be4565b91505092959194509250565b600080600060608486031215612ed857600080fd5b600084013567ffffffffffffffff811115612ef257600080fd5b612efe86828701612c6d565b9350506020612f0f86828701612b7b565b9250506040612f2086828701612c0e565b9150509250925092565b60008060408385031215612f3d57600080fd5b600083013567ffffffffffffffff811115612f5757600080fd5b612f6385828601612c6d565b925050602083013567ffffffffffffffff811115612f8057600080fd5b612f8c85828601612b90565b9150509250929050565b60008060008060808587031215612fac57600080fd5b600085013567ffffffffffffffff811115612fc657600080fd5b612fd287828801612c6d565b945050602085013567ffffffffffffffff811115612fef57600080fd5b612ffb87828801612b90565b935050604061300c87828801612bba565b925050606085013567ffffffffffffffff81111561302957600080fd5b61303587828801612be4565b91505092959194509250565b60008060006060848603121561305657600080fd5b600084013567ffffffffffffffff81111561307057600080fd5b61307c86828701612c6d565b935050602061308d86828701612bba565b925050604084013567ffffffffffffffff8111156130aa57600080fd5b6130b686828701612be4565b9150509250925092565b6000602082840312156130d257600080fd5b60006130e084828501612c97565b91505092915050565b6130f281613912565b82525050565b61310181613924565b82525050565b61311081613930565b82525050565b61312761312282613930565b613ab0565b82525050565b613136816139b0565b82525050565b600061314883856138b1565b93506131558385846139c2565b82840190509392505050565b600061316c82613895565b61317681856138a0565b93506131868185602086016139d1565b61318f81613b76565b840191505092915050565b60006131a582613895565b6131af81856138b1565b93506131bf8185602086016139d1565b80840191505092915050565b600081546131d881613a04565b6131e281866138b1565b945060018216600081146131fd576001811461320e57613241565b60ff19831686528186019350613241565b61321785613880565b60005b838110156132395781548189015260018201915060208101905061321a565b838801955050505b50505092915050565b60006132576018836138a0565b915061326282613b87565b602082019050919050565b600061327a600d836138a0565b915061328582613bb0565b602082019050919050565b600061329d601f836138a0565b91506132a882613bd9565b602082019050919050565b60006132c0601c836138b1565b91506132cb82613c02565b601c82019050919050565b60006132e36002836138b1565b91506132ee82613c2b565b600282019050919050565b60006133066022836138a0565b915061331182613c54565b604082019050919050565b60006133296012836138a0565b915061333482613ca3565b602082019050919050565b600061334c6027836138a0565b915061335782613ccc565b604082019050919050565b600061336f6022836138a0565b915061337a82613d1b565b604082019050919050565b60006133926013836138a0565b915061339d82613d6a565b602082019050919050565b60006133b5601b836138a0565b91506133c082613d93565b602082019050919050565b60006133d86017836138a0565b91506133e382613dbc565b602082019050919050565b60006133fb6014836138a0565b915061340682613de5565b602082019050919050565b61341a81613999565b82525050565b613429816139a3565b82525050565b600061343c82848661313c565b91508190509392505050565b6000613454828461319a565b915081905092915050565b600061346b82856131cb565b915061347782846131cb565b91508190509392505050565b600061348e826132b3565b915061349a8284613116565b60208201915081905092915050565b60006134b4826132d6565b91506134c08285613116565b6020820191506134d08284613116565b6020820191508190509392505050565b60006020820190506134f560008301846130e9565b92915050565b600060608201905061351060008301866130e9565b61351d6020830185613107565b61352a6040830184613107565b949350505050565b600060208201905061354760008301846130f8565b92915050565b60006020820190506135626000830184613107565b92915050565b600060c08201905061357d6000830189613107565b61358a60208301886130e9565b61359760408301876130e9565b81810360608301526135a98186613161565b90506135b86080830185613411565b6135c560a0830184613411565b979650505050505050565b60006080820190506135e56000830187613107565b6135f26020830186613420565b6135ff6040830185613107565b61360c6060830184613107565b95945050505050565b600060208201905061362a600083018461312d565b92915050565b6000602082019050818103600083015261364a8184613161565b905092915050565b6000602082019050818103600083015261366b8161324a565b9050919050565b6000602082019050818103600083015261368b8161326d565b9050919050565b600060208201905081810360008301526136ab81613290565b9050919050565b600060208201905081810360008301526136cb816132f9565b9050919050565b600060208201905081810360008301526136eb8161331c565b9050919050565b6000602082019050818103600083015261370b8161333f565b9050919050565b6000602082019050818103600083015261372b81613362565b9050919050565b6000602082019050818103600083015261374b81613385565b9050919050565b6000602082019050818103600083015261376b816133a8565b9050919050565b6000602082019050818103600083015261378b816133cb565b9050919050565b600060208201905081810360008301526137ab816133ee565b9050919050565b60006020820190506137c76000830184613411565b92915050565b60006137d76137e8565b90506137e38282613a36565b919050565b6000604051905090565b600067ffffffffffffffff82111561380d5761380c613b47565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561383957613838613b47565b5b61384282613b76565b9050602081019050919050565b600067ffffffffffffffff82111561386a57613869613b47565b5b61387382613b76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006138c782613999565b91506138d283613999565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390757613906613aba565b5b828201905092915050565b600061391d82613979565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061397482613e0e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139bb82613966565b9050919050565b82818337600083830152505050565b60005b838110156139ef5780820151818401526020810190506139d4565b838111156139fe576000848401525b50505050565b60006002820490506001821680613a1c57607f821691505b60208210811415613a3057613a2f613b18565b5b50919050565b613a3f82613b76565b810181811067ffffffffffffffff82111715613a5e57613a5d613b47565b5b80604052505050565b6000613a7282613999565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aa557613aa4613aba565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f52656a656374656420504f415600000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e27742073656c662d636572746966790000000000000000000000000000600082015250565b7f596f752063616e6e6f7420656e646f7273652066726f6d207468652073616d6560008201527f2077616c6c657400000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f504f415620616c72656164792065786973747300000000000000000000000000600082015250565b7f5468657265206973206e6f206368616e6765206f662073746174650000000000600082015250565b7f596f752063616e206f6e6c7920676574206120504f4156000000000000000000600082015250565b7f446f6573206e6f74206861766520616363657373000000000000000000000000600082015250565b60058110613e1f57613e1e613ae9565b5b50565b613e2b81613912565b8114613e3657600080fd5b50565b613e4281613930565b8114613e4d57600080fd5b50565b613e598161393a565b8114613e6457600080fd5b50565b60058110613e7457600080fd5b50565b613e8081613999565b8114613e8b57600080fd5b5056fea26469706673582212206eda3c1fe9b2ef407411c0d04d4cb104b62615aaf2b8d1908c8003812bbea1d164736f6c63430008020033