ETH Price: $3,095.63 (+2.06%)
Gas: 3 Gwei

Token

yInsureNFT (yNFT)
 

Overview

Max Total Supply

1,380 yNFT

Holders

283

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 yNFT
0x57797c4814608a46494f9bed5541b94d0a037fcf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

yInsure Insurance NFTs provide smart contract insurance for various protocols. Use at your own risk. You should always be careful when interacting with DeFi applications.

Covers smart contract risk


# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xcB597AF9...9351CaE93
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
yInsure

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-29
*/

pragma solidity ^0.5.0;

contract Context {

    constructor () internal { }
    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC165 {
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

contract IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    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-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}
library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    mapping (uint256 => address) private _tokenOwner;
    mapping (uint256 => address) private _tokenApprovals;
    mapping (address => Counters.Counter) private _ownedTokensCount;
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][to] = approved;
        emit ApprovalForAll(_msgSender(), to, approved);
    }
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransferFrom(from, to, tokenId, _data);
    }
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    mapping(address => uint256[]) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;
    uint256[] private _allTokens;
    mapping(uint256 => uint256) private _allTokensIndex;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }
        _ownedTokens[from].length--;
    }
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
    string private _name;
    string private _symbol;
    string private _baseURI;
    mapping(uint256 => string) private _tokenURIs;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }
    function name() external view returns (string memory) {
        return _name;
    }
    function symbol() external view returns (string memory) {
        return _symbol;
    }
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];

        // Even if there is a base URI, it is only appended to non-empty token-specific URIs
        if (bytes(_tokenURI).length == 0) {
            return "";
        } else {
            // abi.encodePacked is being used to concatenate strings
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
    }
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    function _setBaseURI(string memory baseURI) internal {
        _baseURI = baseURI;
    }
    function baseURI() external view returns (string memory) {
        return _baseURI;
    }
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        _notEntered = true;
    }
    modifier nonReentrant() {
        require(_notEntered, "ReentrancyGuard: reentrant call");
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

interface Pool1  {
    function changeDependentContractAddress() external;
    function makeCoverBegin(
        address smartCAdd,
        bytes4 coverCurr,
        uint[] calldata coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        external
        payable;
    function makeCoverUsingCA(
        address smartCAdd,
        bytes4 coverCurr,
        uint[] calldata coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        external;
    function getWei(uint amount) external view returns(uint);
    function sellNXMTokens(uint _amount) external  returns (bool);
}

contract INXMMaster {
    address public tokenAddress;
    address public owner;
    uint public pauseTime;
    function masterInitialized() external view returns(bool);
    function isPause() external view returns(bool check);
    function isMember(address _add) external view returns(bool);
    function getLatestAddress(bytes2 _contractName) external view returns(address payable contractAddress);
}

interface DSValue {
    function peek() external view returns (bytes32, bool);
    function read() external view returns (bytes32);
}

interface PoolData {

    struct ApiId {
        bytes4 typeOf;
        bytes4 currency;
        uint id;
        uint64 dateAdd;
        uint64 dateUpd;
    }

    struct CurrencyAssets {
        address currAddress;
        uint baseMin;
        uint varMin;
    }

    struct InvestmentAssets {
        address currAddress;
        bool status;
        uint64 minHoldingPercX100;
        uint64 maxHoldingPercX100;
        uint8 decimals;
    }

    struct IARankDetails {
        bytes4 maxIACurr;
        uint64 maxRate;
        bytes4 minIACurr;
        uint64 minRate;
    }

    struct McrData {
        uint mcrPercx100;
        uint mcrEther;
        uint vFull; //Pool funds
        uint64 date;
    }

    function setCapReached(uint val) external;
    function getInvestmentAssetDecimals(bytes4 curr) external returns(uint8 decimal);
    function getCurrencyAssetAddress(bytes4 curr) external view returns(address);
    function getInvestmentAssetAddress(bytes4 curr) external view returns(address);
    function getInvestmentAssetStatus(bytes4 curr) external view returns(bool status);

}

interface QuotationData {

    enum HCIDStatus { NA, kycPending, kycPass, kycFailedOrRefunded, kycPassNoCover }
    enum CoverStatus { Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested }

    struct Cover {
        address payable memberAddress;
        bytes4 currencyCode;
        uint sumAssured;
        uint16 coverPeriod;
        uint validUntil;
        address scAddress;
        uint premiumNXM;
    }

    struct HoldCover {
        uint holdCoverId;
        address payable userAddress;
        address scAddress;
        bytes4 coverCurr;
        uint[] coverDetails;
        uint16 coverPeriod;
    }

    function getCoverLength() external returns(uint len);
    function getAuthQuoteEngine() external returns(address _add);
    function getAllCoversOfUser(address _add) external returns(uint[] memory allCover);
    function getUserCoverLength(address _add) external returns(uint len);
    function getCoverStatusNo(uint _cid) external returns(uint8);
    function getCoverPeriod(uint _cid) external returns(uint32 cp);
    function getCoverSumAssured(uint _cid) external returns(uint sa);
    function getCurrencyOfCover(uint _cid) external returns(bytes4 curr);
    function getValidityOfCover(uint _cid) external returns(uint date);
    function getscAddressOfCover(uint _cid) external returns(uint, address);
    function getCoverMemberAddress(uint _cid) external returns(address payable _add);
    function getCoverPremiumNXM(uint _cid) external returns(uint _premiumNXM);
    function getCoverDetailsByCoverID1(
        uint _cid
    )
        external
        returns (
            uint cid,
            address _memberAddress,
            address _scAddress,
            bytes4 _currencyCode,
            uint _sumAssured,
            uint premiumNXM
        );
    function getCoverDetailsByCoverID2(
        uint _cid
    )
        external
        view
        returns (
            uint cid,
            uint8 status,
            uint sumAssured,
            uint16 coverPeriod,
            uint validUntil
        );
    function getHoldedCoverDetailsByID1(
        uint _hcid
    )
        external
        view
        returns (
            uint hcid,
            address scAddress,
            bytes4 coverCurr,
            uint16 coverPeriod
        );
    function getUserHoldedCoverLength(address _add) external returns (uint);
    function getUserHoldedCoverByIndex(address _add, uint index) external returns (uint);
    function getHoldedCoverDetailsByID2(
        uint _hcid
    )
        external
        returns (
            uint hcid,
            address payable memberAddress,
            uint[] memory coverDetails
        );
    function getTotalSumAssuredSC(address _add, bytes4 _curr) external returns(uint amount);

}

contract TokenData {
    function lockTokenTimeAfterCoverExp() external returns (uint);
}

interface Claims {
    function getClaimbyIndex(uint _claimId) external view returns (
        uint claimId,
        uint status,
        int8 finalVerdict,
        address claimOwner,
        uint coverId
    );
    function submitClaim(uint coverId) external;
}

contract ClaimsData {
    function actualClaimLength() external view returns(uint);
}

interface NXMToken {
    function balanceOf(address owner) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);

}

interface MemberRoles {
    function switchMembership(address) external;
}

contract yInsure is
    ERC721Full("yInsureNFT", "yNFT"),
    Ownable,
    ReentrancyGuard {
    
    struct Token {
        uint expirationTimestamp;
        bytes4 coverCurrency;
        uint coverAmount;
        uint coverPrice;
        uint coverPriceNXM;
        uint expireTime;
        uint generationTime;
        uint coverId;
        bool claimInProgress;
        uint claimId;
    }
    
    event ClaimRedeemed (
        address receiver,
        uint value,
        bytes4 currency
    );
    
    using SafeMath for uint;

    INXMMaster constant public nxMaster = INXMMaster(0x01BFd82675DBCc7762C84019cA518e701C0cD07e);
    
    enum CoverStatus {
        Active,
        ClaimAccepted,
        ClaimDenied,
        CoverExpired,
        ClaimSubmitted,
        Requested
    }
    
    enum ClaimStatus {
        PendingClaimAssessorVote, // 0
        PendingClaimAssessorVoteDenied, // 1
        PendingClaimAssessorVoteThresholdNotReachedAccept, // 2
        PendingClaimAssessorVoteThresholdNotReachedDeny, // 3
        PendingClaimAssessorConsensusNotReachedAccept, // 4
        PendingClaimAssessorConsensusNotReachedDeny, // 5
        FinalClaimAssessorVoteDenied, // 6
        FinalClaimAssessorVoteAccepted, // 7
        FinalClaimAssessorVoteDeniedMVAccepted, // 8
        FinalClaimAssessorVoteDeniedMVDenied, // 9
        FinalClaimAssessorVotAcceptedMVNoDecision, // 10
        FinalClaimAssessorVoteDeniedMVNoDecision, // 11
        ClaimAcceptedPayoutPending, // 12
        ClaimAcceptedNoPayout, // 13
        ClaimAcceptedPayoutDone // 14
    }
    
    function _buyCover(
        address coveredContractAddress,
        bytes4 coverCurrency,
        uint[] memory coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) internal returns (uint coverId) {
    
        uint coverPrice = coverDetails[1];
        Pool1 pool1 = Pool1(nxMaster.getLatestAddress("P1"));
        if (coverCurrency == "ETH") {
            pool1.makeCoverBegin.value(coverPrice)(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s);
        } else {
            address payable pool1Address = address(uint160(address(pool1)));
            PoolData poolData = PoolData(nxMaster.getLatestAddress("PD"));
            IERC20 erc20 = IERC20(poolData.getCurrencyAssetAddress(coverCurrency));
            erc20.approve(pool1Address, coverPrice);
            pool1.makeCoverUsingCA(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s);
        }
    
        QuotationData quotationData = QuotationData(nxMaster.getLatestAddress("QD"));
        // *assumes* the newly created claim is appended at the end of the list covers
        coverId = quotationData.getCoverLength().sub(1);
    }
    
    function _submitClaim(uint coverId) internal returns (uint) {
        Claims claims = Claims(nxMaster.getLatestAddress("CL"));
        claims.submitClaim(coverId);
    
        ClaimsData claimsData = ClaimsData(nxMaster.getLatestAddress("CD"));
        uint claimId = claimsData.actualClaimLength() - 1;
        return claimId;
    }
    
    function getMemberRoles() public view returns (address) {
        return nxMaster.getLatestAddress("MR");
    }
    
    function getCover(
        uint coverId
    ) internal view returns (
        uint cid,
        uint8 status,
        uint sumAssured,
        uint16 coverPeriod,
        uint validUntil
    ) {
        QuotationData quotationData = QuotationData(nxMaster.getLatestAddress("QD"));
        return quotationData.getCoverDetailsByCoverID2(coverId);
    }
    
    function _sellNXMTokens(uint amount) internal returns (uint ethValue) {
        address payable pool1Address = nxMaster.getLatestAddress("P1");
        Pool1 p1 = Pool1(pool1Address);
    
        NXMToken nxmToken = NXMToken(nxMaster.tokenAddress());
    
        ethValue = p1.getWei(amount);
        nxmToken.approve(pool1Address, amount);
        p1.sellNXMTokens(amount);
    }
    
    function _getCurrencyAssetAddress(bytes4 currency) internal view returns (address) {
        PoolData pd = PoolData(nxMaster.getLatestAddress("PD"));
        return pd.getCurrencyAssetAddress(currency);
    }
    
    function _getLockTokenTimeAfterCoverExpiry() internal returns (uint) {
        TokenData tokenData = TokenData(nxMaster.getLatestAddress("TD"));
        return tokenData.lockTokenTimeAfterCoverExp();
    }
    
    function _getTokenAddress() internal view returns (address) {
        return nxMaster.tokenAddress();
    }
    
    function _payoutIsCompleted(uint claimId) internal view returns (bool) {
        uint256 status;
        Claims claims = Claims(nxMaster.getLatestAddress("CL"));
        (, status, , , ) = claims.getClaimbyIndex(claimId);
        return status == uint(ClaimStatus.FinalClaimAssessorVoteAccepted)
            || status == uint(ClaimStatus.ClaimAcceptedPayoutDone);
    }
  
    bytes4 internal constant ethCurrency = "ETH";
    
    uint public distributorFeePercentage;
    uint256 internal issuedTokensCount;
    mapping(uint256 => Token) public tokens;
    
    mapping(bytes4 => uint) public withdrawableTokens;
    
    constructor(uint _distributorFeePercentage) public {
        distributorFeePercentage = _distributorFeePercentage;
    }
    
    function switchMembership(address _newMembership) external onlyOwner {
        NXMToken nxmToken = NXMToken(nxMaster.tokenAddress());
        nxmToken.approve(getMemberRoles(),uint(-1));
        MemberRoles(getMemberRoles()).switchMembership(_newMembership);
    }
    
    // Arguments to be passed as coverDetails, from the quote api:
    //    coverDetails[0] = coverAmount;
    //    coverDetails[1] = coverPrice;
    //    coverDetails[2] = coverPriceNXM;
    //    coverDetails[3] = expireTime;
    //    coverDetails[4] = generationTime;
    function buyCover(
        address coveredContractAddress,
        bytes4 coverCurrency,
        uint[] calldata coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) external payable {
    
        uint coverPrice = coverDetails[1];
        uint requiredValue = distributorFeePercentage.mul(coverPrice).div(100).add(coverPrice);
        if (coverCurrency == "ETH") {
            require(msg.value == requiredValue, "Incorrect value sent");
        } else {
            IERC20 erc20 = IERC20(_getCurrencyAssetAddress(coverCurrency));
            require(erc20.transferFrom(msg.sender, address(this), requiredValue), "Transfer failed");
        }
        
        uint coverId = _buyCover(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s);
        withdrawableTokens[coverCurrency] = withdrawableTokens[coverCurrency].add(requiredValue.sub(coverPrice));
        
        // mint token
        uint256 nextTokenId = issuedTokensCount++;
        uint expirationTimestamp = block.timestamp + _getLockTokenTimeAfterCoverExpiry() + coverPeriod * 1 days;
        tokens[nextTokenId] = Token(expirationTimestamp,
          coverCurrency,
          coverDetails[0],
          coverDetails[1],
          coverDetails[2],
          coverDetails[3],
          coverDetails[4],
          coverId, false, 0);
        _mint(msg.sender, nextTokenId);
    }
    
    function submitClaim(uint256 tokenId) external onlyTokenApprovedOrOwner(tokenId) {
    
        if (tokens[tokenId].claimInProgress) {
            uint8 coverStatus;
            (, coverStatus, , , ) = getCover(tokens[tokenId].coverId);
            require(coverStatus == uint8(CoverStatus.ClaimDenied),
            "Can submit another claim only if the previous one was denied.");
        }
        require(tokens[tokenId].expirationTimestamp > block.timestamp, "Token is expired");
        
        uint claimId = _submitClaim(tokens[tokenId].coverId);
        
        tokens[tokenId].claimInProgress = true;
        tokens[tokenId].claimId = claimId;
    }
    
    function redeemClaim(uint256 tokenId) public onlyTokenApprovedOrOwner(tokenId)  nonReentrant {
        require(tokens[tokenId].claimInProgress, "No claim is in progress");
        uint8 coverStatus;
        uint sumAssured;
        (, coverStatus, sumAssured, , ) = getCover(tokens[tokenId].coverId);
        
        require(coverStatus == uint8(CoverStatus.ClaimAccepted), "Claim is not accepted");
        require(_payoutIsCompleted(tokens[tokenId].coverId), "Claim accepted but payout not completed");
        
        _burn(tokenId);
        _sendAssuredSum(tokens[tokenId].coverCurrency, sumAssured);
        emit ClaimRedeemed(msg.sender, sumAssured, tokens[tokenId].coverCurrency);
    }
    
    function _sendAssuredSum(bytes4 coverCurrency, uint sumAssured) internal {
        if (coverCurrency == ethCurrency) {
            msg.sender.transfer(sumAssured);
        } else {
            IERC20 erc20 = IERC20(_getCurrencyAssetAddress(coverCurrency));
            require(erc20.transfer(msg.sender, sumAssured), "Transfer failed");
        }
    }
    
    function getCoverStatus(uint256 tokenId) external view returns (uint8 coverStatus, bool payoutCompleted) {
        (, coverStatus, , , ) = getCover(tokens[tokenId].coverId);
        payoutCompleted = _payoutIsCompleted(tokenId);
    }
    
    function nxmTokenApprove(address _spender, uint256 _value) public onlyOwner {
        IERC20 nxmToken = IERC20(_getTokenAddress());
        nxmToken.approve(_spender, _value);
    }
    
    function withdrawEther(address payable _recipient, uint256 _amount) external onlyOwner nonReentrant {
        require(withdrawableTokens[ethCurrency] >= _amount, "Not enough ETH");
        withdrawableTokens[ethCurrency] = withdrawableTokens[ethCurrency].sub(_amount);
        _recipient.transfer(_amount);
    }
    
    function withdrawTokens(address payable _recipient, uint256 _amount, bytes4 _currency) external onlyOwner nonReentrant {
        require(withdrawableTokens[_currency] >= _amount, "Not enough tokens");
        withdrawableTokens[_currency] = withdrawableTokens[_currency].sub(_amount);
    
        IERC20 erc20 = IERC20(_getCurrencyAssetAddress(_currency));
        require(erc20.transfer(_recipient, _amount), "Transfer failed");
    }
    
    function sellNXMTokens(uint amount) external onlyOwner {
        uint ethValue = _sellNXMTokens(amount);
        withdrawableTokens[ethCurrency] = withdrawableTokens[ethCurrency].add(ethValue);
    }
    
    modifier onlyTokenApprovedOrOwner(uint256 tokenId) {
        require(_isApprovedOrOwner(msg.sender, tokenId), "Not approved or owner");
        _;
    }
    
    function () payable external {
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_distributorFeePercentage","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes4","name":"currency","type":"bytes4"}],"name":"ClaimRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"coveredContractAddress","type":"address"},{"internalType":"bytes4","name":"coverCurrency","type":"bytes4"},{"internalType":"uint256[]","name":"coverDetails","type":"uint256[]"},{"internalType":"uint16","name":"coverPeriod","type":"uint16"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"buyCover","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"distributorFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCoverStatus","outputs":[{"internalType":"uint8","name":"coverStatus","type":"uint8"},{"internalType":"bool","name":"payoutCompleted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMemberRoles","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nxMaster","outputs":[{"internalType":"contract INXMMaster","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"nxmTokenApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeemClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellNXMTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"submitClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newMembership","type":"address"}],"name":"switchMembership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"expirationTimestamp","type":"uint256"},{"internalType":"bytes4","name":"coverCurrency","type":"bytes4"},{"internalType":"uint256","name":"coverAmount","type":"uint256"},{"internalType":"uint256","name":"coverPrice","type":"uint256"},{"internalType":"uint256","name":"coverPriceNXM","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"generationTime","type":"uint256"},{"internalType":"uint256","name":"coverId","type":"uint256"},{"internalType":"bool","name":"claimInProgress","type":"bool"},{"internalType":"uint256","name":"claimId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes4","name":"_currency","type":"bytes4"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"withdrawableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200477838038062004778833981810160405260208110156200003757600080fd5b5051604080518082018252600a8152691e525b9cdd5c9953919560b21b602082810191909152825180840190935260048352631e53919560e21b90830152908181620000936301ffc9a760e01b6001600160e01b036200019016565b620000ae6380ac58cd60e01b6001600160e01b036200019016565b620000c963780e9d6360e01b6001600160e01b036200019016565b8151620000de9060099060208501906200021a565b508051620000f490600a9060208401906200021a565b5062000110635b5e139f60e01b6001600160e01b036200019016565b505050506000620001266200021560201b60201c565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d805460ff60a01b1916600160a01b179055600e55620002bc565b6001600160e01b03198082161415620001f0576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025d57805160ff19168380011785556200028d565b828001600101855582156200028d579182015b828111156200028d57825182559160200191906001019062000270565b506200029b9291506200029f565b5090565b6200021791905b808211156200029b5760008155600101620002a6565b6144ac80620002cc6000396000f3fe6080604052600436106102045760003560e01c80636aa14a961161011857806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd14610913578063dc4645c31461093d578063e974471214610984578063e985e9c5146109b8578063f2fde38b146109f357610204565b806395d89b41146107db578063a22cb465146107f0578063b4634a5e1461082b578063b88d4fde1461084057610204565b80637388614b116100e75780637388614b146106a657806374bd0ace1461074e5780638da5cb5b146107785780638f32d59b1461078d57806391be3713146107a257610204565b80636aa14a961461061f5780636c0360eb1461064957806370a082311461065e578063715018a61461069157610204565b80633500e4a91161019b5780634ed75d471161016a5780634ed75d47146104da5780634f64b2be1461050d5780634f6ccce714610592578063522f6815146105bc5780636352211e146105f557610204565b80633500e4a91461044357806342842e0e1461046d578063445def2e146104b05780634e170591146104c557610204565b8063165ffdcc116101d7578063165ffdcc1461035757806318160ddd146103a057806323b872dd146103c75780632f745c591461040a57610204565b806301ffc9a71461020657806306fdde031461024e578063081812fc146102d8578063095ea7b31461031e575b005b34801561021257600080fd5b5061023a6004803603602081101561022957600080fd5b50356001600160e01b031916610a26565b604080519115158252519081900360200190f35b34801561025a57600080fd5b50610263610a49565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029d578181015183820152602001610285565b50505050905090810190601f1680156102ca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102e457600080fd5b50610302600480360360208110156102fb57600080fd5b5035610ae0565b604080516001600160a01b039092168252519081900360200190f35b34801561032a57600080fd5b506102046004803603604081101561034157600080fd5b506001600160a01b038135169060200135610b42565b34801561036357600080fd5b506102046004803603606081101561037a57600080fd5b5080356001600160a01b031690602081013590604001356001600160e01b031916610c6a565b3480156103ac57600080fd5b506103b5610eb8565b60408051918252519081900360200190f35b3480156103d357600080fd5b50610204600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610ebe565b34801561041657600080fd5b506103b56004803603604081101561042d57600080fd5b506001600160a01b038135169060200135610f1a565b34801561044f57600080fd5b506102046004803603602081101561046657600080fd5b5035610f9a565b34801561047957600080fd5b506102046004803603606081101561049057600080fd5b506001600160a01b03813581169160208101359091169060400135611234565b3480156104bc57600080fd5b506103b561124f565b3480156104d157600080fd5b50610302611255565b3480156104e657600080fd5b50610204600480360360208110156104fd57600080fd5b50356001600160a01b03166112df565b34801561051957600080fd5b506105376004803603602081101561053057600080fd5b50356114ae565b604080519a8b526001600160e01b031990991660208b0152898901979097526060890195909552608088019390935260a087019190915260c086015260e0850152151561010084015261012083015251908190036101400190f35b34801561059e57600080fd5b506103b5600480360360208110156105b557600080fd5b503561150a565b3480156105c857600080fd5b50610204600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611570565b34801561060157600080fd5b506103026004803603602081101561061857600080fd5b5035611725565b34801561062b57600080fd5b506102046004803603602081101561064257600080fd5b5035611779565b34801561065557600080fd5b506102636118f0565b34801561066a57600080fd5b506103b56004803603602081101561068157600080fd5b50356001600160a01b0316611951565b34801561069d57600080fd5b506102046119b9565b610204600480360360e08110156106bc57600080fd5b6001600160a01b03823516916001600160e01b0319602082013516918101906060810160408201356401000000008111156106f657600080fd5b82018360208201111561070857600080fd5b8035906020019184602083028401116401000000008311171561072a57600080fd5b919350915061ffff8135169060ff6020820135169060408101359060600135611a4a565b34801561075a57600080fd5b506102046004803603602081101561077157600080fd5b5035611df7565b34801561078457600080fd5b50610302611e9e565b34801561079957600080fd5b5061023a611ead565b3480156107ae57600080fd5b50610204600480360360408110156107c557600080fd5b506001600160a01b038135169060200135611ed3565b3480156107e757600080fd5b50610263611fb7565b3480156107fc57600080fd5b506102046004803603604081101561081357600080fd5b506001600160a01b0381351690602001351515612018565b34801561083757600080fd5b5061030261211d565b34801561084c57600080fd5b506102046004803603608081101561086357600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561089e57600080fd5b8201836020820111156108b057600080fd5b803590602001918460018302840111640100000000831117156108d257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061212f945050505050565b34801561091f57600080fd5b506102636004803603602081101561093657600080fd5b503561218d565b34801561094957600080fd5b506109676004803603602081101561096057600080fd5b5035612359565b6040805160ff909316835290151560208301528051918290030190f35b34801561099057600080fd5b506103b5600480360360208110156109a757600080fd5b50356001600160e01b031916612390565b3480156109c457600080fd5b5061023a600480360360408110156109db57600080fd5b506001600160a01b03813581169160200135166123a2565b3480156109ff57600080fd5b5061020460048036036020811015610a1657600080fd5b50356001600160a01b03166123d0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b820191906000526020600020905b815481529060010190602001808311610ab857829003601f168201915b505050505090505b90565b6000610aeb82612423565b610b265760405162461bcd60e51b815260040180806020018281038252602c81526020018061430a602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610b4d82611725565b9050806001600160a01b0316836001600160a01b03161415610ba05760405162461bcd60e51b81526004018080602001828103825260218152602001806143ae6021913960400191505060405180910390fd5b806001600160a01b0316610bb2612440565b6001600160a01b03161480610bd35750610bd381610bce612440565b6123a2565b610c0e5760405162461bcd60e51b815260040180806020018281038252603881526020018061425e6038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610c72611ead565b610cb1576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d54600160a01b900460ff16610d0f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b191690556001600160e01b03198116600090815260116020526040902054821115610d7e576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6001600160e01b03198116600090815260116020526040902054610da8908363ffffffff61244416565b6001600160e01b03198216600090815260116020526040812091909155610dce8261248d565b9050806001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e3057600080fd5b505af1158015610e44573d6000803e3d6000fd5b505050506040513d6020811015610e5a57600080fd5b5051610e9f576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b5050600d805460ff60a01b1916600160a01b1790555050565b60075490565b610ecf610ec9612440565b8261259a565b610f0a5760405162461bcd60e51b81526004018080602001828103825260318152602001806143cf6031913960400191505060405180910390fd5b610f1583838361263e565b505050565b6000610f2583611951565b8210610f625760405162461bcd60e51b815260040180806020018281038252602b81526020018061412e602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110610f8657fe5b906000526020600020015490505b92915050565b80610fa5338261259a565b610fee576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b600d54600160a01b900460ff1661104c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b1916905560008281526010602052604090206008015460ff166110bf576040805162461bcd60e51b815260206004820152601760248201527f4e6f20636c61696d20697320696e2070726f6772657373000000000000000000604482015290519081900360640190fd5b60008281526010602052604081206007015481906110dc9061265d565b509194509250600191506110ed9050565b60ff168260ff161461113e576040805162461bcd60e51b815260206004820152601560248201527410db185a5b481a5cc81b9bdd081858d8d95c1d1959605a1b604482015290519081900360640190fd5b60008481526010602052604090206007015461115990612788565b6111945760405162461bcd60e51b81526004018080602001828103825260278152602001806144516027913960400191505060405180910390fd5b61119d846128a0565b6000848152601060205260409020600101546111bc9060e01b826128b2565b60008481526010602090815260409182902060010154825133815291820184905260e01b6001600160e01b0319168183015290517fd4f54fa2069b89f4677f28f106ddad2b5d9fd5ddb36a493cafcecd4dd32a721c916060908290030190a15050600d805460ff60a01b1916600160a01b1790555050565b610f158383836040518060200160405280600081525061212f565b600e5481565b60006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806126a960f11b815250602001905060206040518083038186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b5051905090565b6112e7611ead565b611326576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b60006000805160206142128339815191526001600160a01b0316639d76ea586040518163ffffffff1660e01b815260040160206040518083038186803b15801561136f57600080fd5b505afa158015611383573d6000803e3d6000fd5b505050506040513d602081101561139957600080fd5b505190506001600160a01b03811663095ea7b36113b4611255565b6000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561140657600080fd5b505af115801561141a573d6000803e3d6000fd5b505050506040513d602081101561143057600080fd5b5061143b9050611255565b6001600160a01b0316634ed75d47836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050505050565b6010602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979860e09790971b9795969495939492939192909160ff909116908a565b6000611514610eb8565b82106115515760405162461bcd60e51b815260040180806020018281038252602c815260200180614400602c913960400191505060405180910390fd5b6007828154811061155e57fe5b90600052602060002001549050919050565b611578611ead565b6115b7576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d54600160a01b900460ff16611615576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b191690556208aa8960eb1b600052601160205260008051602061410e83398151915254811115611686576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b6208aa8960eb1b600052601160205260008051602061410e833981519152546116b5908263ffffffff61244416565b6208aa8960eb1b6000908152601160205260008051602061410e833981519152919091556040516001600160a01b0384169183156108fc02918491818181858888f1935050505015801561170d573d6000803e3d6000fd5b5050600d805460ff60a01b1916600160a01b17905550565b6000818152600160205260408120546001600160a01b031680610f945760405162461bcd60e51b81526004018080602001828103825260298152602001806142c06029913960400191505060405180910390fd5b80611784338261259a565b6117cd576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b60008281526010602052604090206008015460ff1615611857576000828152601060205260408120600701546118029061265d565b5091935060029250611812915050565b60ff168160ff16146118555760405162461bcd60e51b815260040180806020018281038252603d8152602001806141b1603d913960400191505060405180910390fd5b505b60008281526010602052604090205442106118ac576040805162461bcd60e51b815260206004820152601060248201526f151bdad95b881a5cc8195e1c1a5c995960821b604482015290519081900360640190fd5b6000828152601060205260408120600701546118c7906129ce565b60009384526010602052604090932060088101805460ff19166001179055600901929092555050565b600b8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b60006001600160a01b0382166119985760405162461bcd60e51b815260040180806020018281038252602a815260200180614296602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600360205260409020610f9490612bbd565b6119c1611ead565b611a00576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600086866001818110611a5957fe5b9050602002013590506000611a9a82611a8e6064611a8286600e54612bc190919063ffffffff16565b9063ffffffff612c1a16565b9063ffffffff612c5c16565b90506208aa8960eb1b6001600160e01b03198a161415611b0457803414611aff576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604482015290519081900360640190fd5b611bd9565b6000611b0f8a61248d565b604080516323b872dd60e01b81523360048201523060248201526044810185905290519192506001600160a01b038316916323b872dd916064808201926020929091908290030181600087803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b505050506040513d6020811015611b9257600080fd5b5051611bd7576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505b6000611c1f8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d92508c91508b90508a612cb6565b9050611c5a611c34838563ffffffff61244416565b6001600160e01b03198c166000908152601160205260409020549063ffffffff612c5c16565b6001600160e01b03198b16600090815260116020526040812091909155600f8054600181019091559062ffffff6201518061ffff8b160216611c9a613226565b42010190506040518061014001604052808281526020018d6001600160e01b03191681526020018c8c6000818110611cce57fe5b9050602002013581526020018c8c6001818110611ce757fe5b9050602002013581526020018c8c6002818110611d0057fe5b9050602002013581526020018c8c6003818110611d1957fe5b9050602002013581526020018c8c6004818110611d3257fe5b602090810292909201358352508181018690526000604080840182905260609384018290528682526010835290819020845181559184015160018301805463ffffffff191660e092831c1790559084015160028301559183015160038201556080830151600482015560a0830151600582015560c0830151600682015590820151600782015561010082015160088201805460ff191691151591909117905561012090910151600990910155611de83383613324565b50505050505050505050505050565b611dff611ead565b611e3e576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b6000611e4982613341565b6208aa8960eb1b600052601160205260008051602061410e83398151915254909150611e7b908263ffffffff612c5c16565b6208aa8960eb1b600052601160205260008051602061410e833981519152555050565b600d546001600160a01b031690565b600d546000906001600160a01b0316611ec4612440565b6001600160a01b031614905090565b611edb611ead565b611f1a576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b6000611f246135b8565b9050806001600160a01b031663095ea7b384846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b5050505050565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b612020612440565b6001600160a01b0316826001600160a01b03161415612086576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060046000612093612440565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556120d7612440565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60008051602061421283398151915281565b61214061213a612440565b8361259a565b61217b5760405162461bcd60e51b81526004018080602001828103825260318152602001806143cf6031913960400191505060405180910390fd5b61218784848484613601565b50505050565b606061219882612423565b6121d35760405162461bcd60e51b815260040180806020018281038252602f81526020018061437f602f913960400191505060405180910390fd5b6000828152600c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156122685780601f1061223d57610100808354040283529160200191612268565b820191906000526020600020905b81548152906001019060200180831161224b57829003601f168201915b5050505050905080516000141561228f575050604080516020810190915260008152610a44565b600b8160405160200180838054600181600116156101000203166002900480156122f05780601f106122ce5761010080835404028352918201916122f0565b820191906000526020600020905b8154815290600101906020018083116122dc575b5050825160208401908083835b6020831061231c5780518252601f1990920191602091820191016122fd565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050610a44565b60008181526010602052604081206007015481906123769061265d565b5091945061238992508591506127889050565b9050915091565b60116020526000908152604090205481565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6123d8611ead565b612417576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b61242081613653565b50565b6000908152600160205260409020546001600160a01b0316151590565b3390565b600061248683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136f4565b9392505050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061141160f21b815250602001905060206040518083038186803b1580156124e757600080fd5b505afa1580156124fb573d6000803e3d6000fd5b505050506040513d602081101561251157600080fd5b50516040805163e3dee23960e01b81526001600160e01b03198616600482015290519192506001600160a01b0383169163e3dee23991602480820192602092909190829003018186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b50519392505050565b60006125a582612423565b6125e05760405162461bcd60e51b815260040180806020018281038252602c815260200180614232602c913960400191505060405180910390fd5b60006125eb83611725565b9050806001600160a01b0316846001600160a01b031614806126265750836001600160a01b031661261b84610ae0565b6001600160a01b0316145b80612636575061263681856123a2565b949350505050565b61264983838361378b565b61265383826138cf565b610f1582826139bd565b6000806000806000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156126bd57600080fd5b505afa1580156126d1573d6000803e3d6000fd5b505050506040513d60208110156126e757600080fd5b505160408051631993d17d60e11b8152600481018a905290519192506001600160a01b03831691633327a2fa9160248082019260a092909190829003018186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d60a081101561275e57600080fd5b508051602082015160408301516060840151608090940151929b919a509850919650945092505050565b60008060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b1580156127e457600080fd5b505afa1580156127f8573d6000803e3d6000fd5b505050506040513d602081101561280e57600080fd5b505160408051631e41b72960e11b81526004810187905290519192506001600160a01b03831691633c836e529160248082019260a092909190829003018186803b15801561285b57600080fd5b505afa15801561286f573d6000803e3d6000fd5b505050506040513d60a081101561288557600080fd5b506020015191506007821480612636575050600e1492915050565b6124206128ac82611725565b826139fb565b6001600160e01b031982166208aa8960eb1b14156128fd57604051339082156108fc029083906000818181858888f193505050501580156128f7573d6000803e3d6000fd5b506129ca565b60006129088361248d565b6040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb916044808201926020929091908290030181600087803b15801561295b57600080fd5b505af115801561296f573d6000803e3d6000fd5b505050506040513d602081101561298557600080fd5b5051610f15576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b5050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b158015612a2857600080fd5b505afa158015612a3c573d6000803e3d6000fd5b505050506040513d6020811015612a5257600080fd5b505160408051633550a54b60e11b81526004810186905290519192506001600160a01b03831691636aa14a969160248082019260009290919082900301818387803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b5050505060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d160f21b815250602001905060206040518083038186803b158015612b1157600080fd5b505afa158015612b25573d6000803e3d6000fd5b505050506040513d6020811015612b3b57600080fd5b505160408051636235bbe160e11b815290519192506000916001916001600160a01b0385169163c46b77c291600480820192602092909190829003018186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b50510395945050505050565b5490565b600082612bd057506000610f94565b82820282848281612bdd57fe5b04146124865760405162461bcd60e51b81526004018080602001828103825260218152602001806142e96021913960400191505060405180910390fd5b600061248683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a43565b600082820183811015612486576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008086600181518110612cc657fe5b6020026020010151905060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b158015612d2957600080fd5b505afa158015612d3d573d6000803e3d6000fd5b505050506040513d6020811015612d5357600080fd5b505190506208aa8960eb1b6001600160e01b03198a161415612e7557806001600160a01b03166368da80af838c8c8c8c8c8c8c6040518963ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b83811015612e2d578181015183820152602001612e15565b50505050905001985050505050505050506000604051808303818588803b158015612e5757600080fd5b505af1158015612e6b573d6000803e3d6000fd5b505050505061310d565b604080516227050b60e31b815261141160f21b600482015290518291600091600080516020614212833981519152916301382858916024808301926020929190829003018186803b158015612ec957600080fd5b505afa158015612edd573d6000803e3d6000fd5b505050506040513d6020811015612ef357600080fd5b50516040805163e3dee23960e01b81526001600160e01b03198e16600482015290519192506000916001600160a01b0384169163e3dee239916024808301926020929190829003018186803b158015612f4b57600080fd5b505afa158015612f5f573d6000803e3d6000fd5b505050506040513d6020811015612f7557600080fd5b50516040805163095ea7b360e01b81526001600160a01b0386811660048301526024820189905291519293509083169163095ea7b3916044808201926020929091908290030181600087803b158015612fcd57600080fd5b505af1158015612fe1573d6000803e3d6000fd5b505050506040513d6020811015612ff757600080fd5b810190808051906020019092919050505050836001600160a01b0316638076083d8e8e8e8e8e8e8e6040518863ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b838110156130c65781810151838201526020016130ae565b5050505090500198505050505050505050600060405180830381600087803b1580156130f157600080fd5b505af1158015613105573d6000803e3d6000fd5b505050505050505b60006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b15801561316657600080fd5b505afa15801561317a573d6000803e3d6000fd5b505050506040513d602081101561319057600080fd5b50516040805163067157ff60e41b81529051919250613217916001916001600160a01b038516916367157ff0916004808201926020929091908290030181600087803b1580156131df57600080fd5b505af11580156131f3573d6000803e3d6000fd5b505050506040513d602081101561320957600080fd5b50519063ffffffff61244416565b9b9a5050505050505050505050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061151160f21b815250602001905060206040518083038186803b15801561328057600080fd5b505afa158015613294573d6000803e3d6000fd5b505050506040513d60208110156132aa57600080fd5b50516040805163ce0a6d5f60e01b815290519192506001600160a01b0383169163ce0a6d5f916004808201926020929091908290030181600087803b1580156132f257600080fd5b505af1158015613306573d6000803e3d6000fd5b505050506040513d602081101561331c57600080fd5b505191505090565b61332e8282613aa8565b61333882826139bd565b6129ca81613bd9565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d60208110156133c557600080fd5b5051604080516313aedd4b60e31b81529051919250829160009160008051602061421283398151915291639d76ea5891600480820192602092909190829003018186803b15801561341557600080fd5b505afa158015613429573d6000803e3d6000fd5b505050506040513d602081101561343f57600080fd5b505160408051633a50b15960e21b81526004810188905290519192506001600160a01b0384169163e942c56491602480820192602092909190829003018186803b15801561348c57600080fd5b505afa1580156134a0573d6000803e3d6000fd5b505050506040513d60208110156134b657600080fd5b50516040805163095ea7b360e01b81526001600160a01b0386811660048301526024820189905291519296509083169163095ea7b3916044808201926020929091908290030181600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505060408051633a5e856760e11b81526004810187905290516001600160a01b038416916374bd0ace9160248083019260209291908290030181600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b505050506040513d60208110156135ad57600080fd5b509395945050505050565b60006000805160206142128339815191526001600160a01b0316639d76ea586040518163ffffffff1660e01b815260040160206040518083038186803b1580156112ae57600080fd5b61360c84848461263e565b61361884848484613c1d565b6121875760405162461bcd60e51b81526004018080602001828103825260328152602001806141596032913960400191505060405180910390fd5b6001600160a01b0381166136985760405162461bcd60e51b815260040180806020018281038252602681526020018061418b6026913960400191505060405180910390fd5b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156137835760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613748578181015183820152602001613730565b50505050905090810190601f1680156137755780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b826001600160a01b031661379e82611725565b6001600160a01b0316146137e35760405162461bcd60e51b81526004018080602001828103825260298152602001806143566029913960400191505060405180910390fd5b6001600160a01b0382166138285760405162461bcd60e51b81526004018080602001828103825260248152602001806141ee6024913960400191505060405180910390fd5b61383181613e58565b6001600160a01b038316600090815260036020526040902061385290613e93565b6001600160a01b038216600090815260036020526040902061387390613eaa565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600560205260408120546138f990600163ffffffff61244416565b600083815260066020526040902054909150808214613994576001600160a01b038416600090815260056020526040812080548490811061393657fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061397457fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b0384166000908152600560205260409020805490611fb090600019830161408b565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b613a058282613eb3565b6000818152600c602052604090205460026000196101006001841615020190911604156129ca576000818152600c602052604081206129ca916140af565b60008183613a925760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613748578181015183820152602001613730565b506000838581613a9e57fe5b0495945050505050565b6001600160a01b038216613b03576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613b0c81612423565b15613b5e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260039091529020613b9d90613eaa565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b6000613c31846001600160a01b0316613edf565b613c3d57506001612636565b600060606001600160a01b038616630a85bd0160e11b613c5b612440565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613cd4578181015183820152602001613cbc565b50505050905090810190601f168015613d015780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310613d695780518252601f199092019160209182019101613d4a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dcb576040519150601f19603f3d011682016040523d82523d6000602084013e613dd0565b606091505b509150915081613e2157805115613dea5780518082602001fd5b60405162461bcd60e51b81526004018080602001828103825260328152602001806141596032913960400191505060405180910390fd5b6000818060200190516020811015613e3857600080fd5b50516001600160e01b031916630a85bd0160e11b14935061263692505050565b6000818152600260205260409020546001600160a01b03161561242057600090815260026020526040902080546001600160a01b0319169055565b8054613ea690600163ffffffff61244416565b9055565b80546001019055565b613ebd8282613f18565b613ec782826138cf565b6000818152600660205260408120556129ca81613fef565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612636575050151592915050565b816001600160a01b0316613f2b82611725565b6001600160a01b031614613f705760405162461bcd60e51b815260040180806020018281038252602581526020018061442c6025913960400191505060405180910390fd5b613f7981613e58565b6001600160a01b0382166000908152600360205260409020613f9a90613e93565b60008181526001602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60075460009061400690600163ffffffff61244416565b6000838152600860205260408120546007805493945090928490811061402857fe5b90600052602060002001549050806007838154811061404357fe5b6000918252602080832090910192909255828152600890915260409020829055600780549061407690600019830161408b565b50505060009182525060086020526040812055565b815481835581811115610f1557600083815260209020610f159181019083016140ef565b50805460018160011615610100020316600290046000825580601f106140d55750612420565b601f01602090049060005260206000209081019061242091905b610add91905b8082111561410957600081556001016140f5565b509056fe9265befcbf333c95b8514538387396fd61568e7751a29f9f58e9f4b1a22b4bc4455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e207375626d697420616e6f7468657220636c61696d206f6e6c79206966207468652070726576696f7573206f6e65207761732064656e6965642e4552433732313a207472616e7366657220746f20746865207a65726f206164647265737300000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64734552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e436c61696d20616363657074656420627574207061796f7574206e6f7420636f6d706c65746564a265627a7a72315820312e32093c56349129705a30aae4f77360f9511cf1ac62100928c7c7cfbadca864736f6c634300051100320000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636aa14a961161011857806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd14610913578063dc4645c31461093d578063e974471214610984578063e985e9c5146109b8578063f2fde38b146109f357610204565b806395d89b41146107db578063a22cb465146107f0578063b4634a5e1461082b578063b88d4fde1461084057610204565b80637388614b116100e75780637388614b146106a657806374bd0ace1461074e5780638da5cb5b146107785780638f32d59b1461078d57806391be3713146107a257610204565b80636aa14a961461061f5780636c0360eb1461064957806370a082311461065e578063715018a61461069157610204565b80633500e4a91161019b5780634ed75d471161016a5780634ed75d47146104da5780634f64b2be1461050d5780634f6ccce714610592578063522f6815146105bc5780636352211e146105f557610204565b80633500e4a91461044357806342842e0e1461046d578063445def2e146104b05780634e170591146104c557610204565b8063165ffdcc116101d7578063165ffdcc1461035757806318160ddd146103a057806323b872dd146103c75780632f745c591461040a57610204565b806301ffc9a71461020657806306fdde031461024e578063081812fc146102d8578063095ea7b31461031e575b005b34801561021257600080fd5b5061023a6004803603602081101561022957600080fd5b50356001600160e01b031916610a26565b604080519115158252519081900360200190f35b34801561025a57600080fd5b50610263610a49565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029d578181015183820152602001610285565b50505050905090810190601f1680156102ca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102e457600080fd5b50610302600480360360208110156102fb57600080fd5b5035610ae0565b604080516001600160a01b039092168252519081900360200190f35b34801561032a57600080fd5b506102046004803603604081101561034157600080fd5b506001600160a01b038135169060200135610b42565b34801561036357600080fd5b506102046004803603606081101561037a57600080fd5b5080356001600160a01b031690602081013590604001356001600160e01b031916610c6a565b3480156103ac57600080fd5b506103b5610eb8565b60408051918252519081900360200190f35b3480156103d357600080fd5b50610204600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610ebe565b34801561041657600080fd5b506103b56004803603604081101561042d57600080fd5b506001600160a01b038135169060200135610f1a565b34801561044f57600080fd5b506102046004803603602081101561046657600080fd5b5035610f9a565b34801561047957600080fd5b506102046004803603606081101561049057600080fd5b506001600160a01b03813581169160208101359091169060400135611234565b3480156104bc57600080fd5b506103b561124f565b3480156104d157600080fd5b50610302611255565b3480156104e657600080fd5b50610204600480360360208110156104fd57600080fd5b50356001600160a01b03166112df565b34801561051957600080fd5b506105376004803603602081101561053057600080fd5b50356114ae565b604080519a8b526001600160e01b031990991660208b0152898901979097526060890195909552608088019390935260a087019190915260c086015260e0850152151561010084015261012083015251908190036101400190f35b34801561059e57600080fd5b506103b5600480360360208110156105b557600080fd5b503561150a565b3480156105c857600080fd5b50610204600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611570565b34801561060157600080fd5b506103026004803603602081101561061857600080fd5b5035611725565b34801561062b57600080fd5b506102046004803603602081101561064257600080fd5b5035611779565b34801561065557600080fd5b506102636118f0565b34801561066a57600080fd5b506103b56004803603602081101561068157600080fd5b50356001600160a01b0316611951565b34801561069d57600080fd5b506102046119b9565b610204600480360360e08110156106bc57600080fd5b6001600160a01b03823516916001600160e01b0319602082013516918101906060810160408201356401000000008111156106f657600080fd5b82018360208201111561070857600080fd5b8035906020019184602083028401116401000000008311171561072a57600080fd5b919350915061ffff8135169060ff6020820135169060408101359060600135611a4a565b34801561075a57600080fd5b506102046004803603602081101561077157600080fd5b5035611df7565b34801561078457600080fd5b50610302611e9e565b34801561079957600080fd5b5061023a611ead565b3480156107ae57600080fd5b50610204600480360360408110156107c557600080fd5b506001600160a01b038135169060200135611ed3565b3480156107e757600080fd5b50610263611fb7565b3480156107fc57600080fd5b506102046004803603604081101561081357600080fd5b506001600160a01b0381351690602001351515612018565b34801561083757600080fd5b5061030261211d565b34801561084c57600080fd5b506102046004803603608081101561086357600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561089e57600080fd5b8201836020820111156108b057600080fd5b803590602001918460018302840111640100000000831117156108d257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061212f945050505050565b34801561091f57600080fd5b506102636004803603602081101561093657600080fd5b503561218d565b34801561094957600080fd5b506109676004803603602081101561096057600080fd5b5035612359565b6040805160ff909316835290151560208301528051918290030190f35b34801561099057600080fd5b506103b5600480360360208110156109a757600080fd5b50356001600160e01b031916612390565b3480156109c457600080fd5b5061023a600480360360408110156109db57600080fd5b506001600160a01b03813581169160200135166123a2565b3480156109ff57600080fd5b5061020460048036036020811015610a1657600080fd5b50356001600160a01b03166123d0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b820191906000526020600020905b815481529060010190602001808311610ab857829003601f168201915b505050505090505b90565b6000610aeb82612423565b610b265760405162461bcd60e51b815260040180806020018281038252602c81526020018061430a602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610b4d82611725565b9050806001600160a01b0316836001600160a01b03161415610ba05760405162461bcd60e51b81526004018080602001828103825260218152602001806143ae6021913960400191505060405180910390fd5b806001600160a01b0316610bb2612440565b6001600160a01b03161480610bd35750610bd381610bce612440565b6123a2565b610c0e5760405162461bcd60e51b815260040180806020018281038252603881526020018061425e6038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610c72611ead565b610cb1576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d54600160a01b900460ff16610d0f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b191690556001600160e01b03198116600090815260116020526040902054821115610d7e576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6001600160e01b03198116600090815260116020526040902054610da8908363ffffffff61244416565b6001600160e01b03198216600090815260116020526040812091909155610dce8261248d565b9050806001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e3057600080fd5b505af1158015610e44573d6000803e3d6000fd5b505050506040513d6020811015610e5a57600080fd5b5051610e9f576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b5050600d805460ff60a01b1916600160a01b1790555050565b60075490565b610ecf610ec9612440565b8261259a565b610f0a5760405162461bcd60e51b81526004018080602001828103825260318152602001806143cf6031913960400191505060405180910390fd5b610f1583838361263e565b505050565b6000610f2583611951565b8210610f625760405162461bcd60e51b815260040180806020018281038252602b81526020018061412e602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110610f8657fe5b906000526020600020015490505b92915050565b80610fa5338261259a565b610fee576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b600d54600160a01b900460ff1661104c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b1916905560008281526010602052604090206008015460ff166110bf576040805162461bcd60e51b815260206004820152601760248201527f4e6f20636c61696d20697320696e2070726f6772657373000000000000000000604482015290519081900360640190fd5b60008281526010602052604081206007015481906110dc9061265d565b509194509250600191506110ed9050565b60ff168260ff161461113e576040805162461bcd60e51b815260206004820152601560248201527410db185a5b481a5cc81b9bdd081858d8d95c1d1959605a1b604482015290519081900360640190fd5b60008481526010602052604090206007015461115990612788565b6111945760405162461bcd60e51b81526004018080602001828103825260278152602001806144516027913960400191505060405180910390fd5b61119d846128a0565b6000848152601060205260409020600101546111bc9060e01b826128b2565b60008481526010602090815260409182902060010154825133815291820184905260e01b6001600160e01b0319168183015290517fd4f54fa2069b89f4677f28f106ddad2b5d9fd5ddb36a493cafcecd4dd32a721c916060908290030190a15050600d805460ff60a01b1916600160a01b1790555050565b610f158383836040518060200160405280600081525061212f565b600e5481565b60006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806126a960f11b815250602001905060206040518083038186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b5051905090565b6112e7611ead565b611326576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b60006000805160206142128339815191526001600160a01b0316639d76ea586040518163ffffffff1660e01b815260040160206040518083038186803b15801561136f57600080fd5b505afa158015611383573d6000803e3d6000fd5b505050506040513d602081101561139957600080fd5b505190506001600160a01b03811663095ea7b36113b4611255565b6000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561140657600080fd5b505af115801561141a573d6000803e3d6000fd5b505050506040513d602081101561143057600080fd5b5061143b9050611255565b6001600160a01b0316634ed75d47836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050505050565b6010602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979860e09790971b9795969495939492939192909160ff909116908a565b6000611514610eb8565b82106115515760405162461bcd60e51b815260040180806020018281038252602c815260200180614400602c913960400191505060405180910390fd5b6007828154811061155e57fe5b90600052602060002001549050919050565b611578611ead565b6115b7576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d54600160a01b900460ff16611615576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600d805460ff60a01b191690556208aa8960eb1b600052601160205260008051602061410e83398151915254811115611686576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b6208aa8960eb1b600052601160205260008051602061410e833981519152546116b5908263ffffffff61244416565b6208aa8960eb1b6000908152601160205260008051602061410e833981519152919091556040516001600160a01b0384169183156108fc02918491818181858888f1935050505015801561170d573d6000803e3d6000fd5b5050600d805460ff60a01b1916600160a01b17905550565b6000818152600160205260408120546001600160a01b031680610f945760405162461bcd60e51b81526004018080602001828103825260298152602001806142c06029913960400191505060405180910390fd5b80611784338261259a565b6117cd576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b60008281526010602052604090206008015460ff1615611857576000828152601060205260408120600701546118029061265d565b5091935060029250611812915050565b60ff168160ff16146118555760405162461bcd60e51b815260040180806020018281038252603d8152602001806141b1603d913960400191505060405180910390fd5b505b60008281526010602052604090205442106118ac576040805162461bcd60e51b815260206004820152601060248201526f151bdad95b881a5cc8195e1c1a5c995960821b604482015290519081900360640190fd5b6000828152601060205260408120600701546118c7906129ce565b60009384526010602052604090932060088101805460ff19166001179055600901929092555050565b600b8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b60006001600160a01b0382166119985760405162461bcd60e51b815260040180806020018281038252602a815260200180614296602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600360205260409020610f9490612bbd565b6119c1611ead565b611a00576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600086866001818110611a5957fe5b9050602002013590506000611a9a82611a8e6064611a8286600e54612bc190919063ffffffff16565b9063ffffffff612c1a16565b9063ffffffff612c5c16565b90506208aa8960eb1b6001600160e01b03198a161415611b0457803414611aff576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604482015290519081900360640190fd5b611bd9565b6000611b0f8a61248d565b604080516323b872dd60e01b81523360048201523060248201526044810185905290519192506001600160a01b038316916323b872dd916064808201926020929091908290030181600087803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b505050506040513d6020811015611b9257600080fd5b5051611bd7576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505b6000611c1f8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d92508c91508b90508a612cb6565b9050611c5a611c34838563ffffffff61244416565b6001600160e01b03198c166000908152601160205260409020549063ffffffff612c5c16565b6001600160e01b03198b16600090815260116020526040812091909155600f8054600181019091559062ffffff6201518061ffff8b160216611c9a613226565b42010190506040518061014001604052808281526020018d6001600160e01b03191681526020018c8c6000818110611cce57fe5b9050602002013581526020018c8c6001818110611ce757fe5b9050602002013581526020018c8c6002818110611d0057fe5b9050602002013581526020018c8c6003818110611d1957fe5b9050602002013581526020018c8c6004818110611d3257fe5b602090810292909201358352508181018690526000604080840182905260609384018290528682526010835290819020845181559184015160018301805463ffffffff191660e092831c1790559084015160028301559183015160038201556080830151600482015560a0830151600582015560c0830151600682015590820151600782015561010082015160088201805460ff191691151591909117905561012090910151600990910155611de83383613324565b50505050505050505050505050565b611dff611ead565b611e3e576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b6000611e4982613341565b6208aa8960eb1b600052601160205260008051602061410e83398151915254909150611e7b908263ffffffff612c5c16565b6208aa8960eb1b600052601160205260008051602061410e833981519152555050565b600d546001600160a01b031690565b600d546000906001600160a01b0316611ec4612440565b6001600160a01b031614905090565b611edb611ead565b611f1a576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b6000611f246135b8565b9050806001600160a01b031663095ea7b384846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b5050505050565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad55780601f10610aaa57610100808354040283529160200191610ad5565b612020612440565b6001600160a01b0316826001600160a01b03161415612086576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060046000612093612440565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556120d7612440565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60008051602061421283398151915281565b61214061213a612440565b8361259a565b61217b5760405162461bcd60e51b81526004018080602001828103825260318152602001806143cf6031913960400191505060405180910390fd5b61218784848484613601565b50505050565b606061219882612423565b6121d35760405162461bcd60e51b815260040180806020018281038252602f81526020018061437f602f913960400191505060405180910390fd5b6000828152600c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156122685780601f1061223d57610100808354040283529160200191612268565b820191906000526020600020905b81548152906001019060200180831161224b57829003601f168201915b5050505050905080516000141561228f575050604080516020810190915260008152610a44565b600b8160405160200180838054600181600116156101000203166002900480156122f05780601f106122ce5761010080835404028352918201916122f0565b820191906000526020600020905b8154815290600101906020018083116122dc575b5050825160208401908083835b6020831061231c5780518252601f1990920191602091820191016122fd565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050610a44565b60008181526010602052604081206007015481906123769061265d565b5091945061238992508591506127889050565b9050915091565b60116020526000908152604090205481565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6123d8611ead565b612417576040805162461bcd60e51b81526020600482018190526024820152600080516020614336833981519152604482015290519081900360640190fd5b61242081613653565b50565b6000908152600160205260409020546001600160a01b0316151590565b3390565b600061248683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136f4565b9392505050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061141160f21b815250602001905060206040518083038186803b1580156124e757600080fd5b505afa1580156124fb573d6000803e3d6000fd5b505050506040513d602081101561251157600080fd5b50516040805163e3dee23960e01b81526001600160e01b03198616600482015290519192506001600160a01b0383169163e3dee23991602480820192602092909190829003018186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b50519392505050565b60006125a582612423565b6125e05760405162461bcd60e51b815260040180806020018281038252602c815260200180614232602c913960400191505060405180910390fd5b60006125eb83611725565b9050806001600160a01b0316846001600160a01b031614806126265750836001600160a01b031661261b84610ae0565b6001600160a01b0316145b80612636575061263681856123a2565b949350505050565b61264983838361378b565b61265383826138cf565b610f1582826139bd565b6000806000806000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156126bd57600080fd5b505afa1580156126d1573d6000803e3d6000fd5b505050506040513d60208110156126e757600080fd5b505160408051631993d17d60e11b8152600481018a905290519192506001600160a01b03831691633327a2fa9160248082019260a092909190829003018186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d60a081101561275e57600080fd5b508051602082015160408301516060840151608090940151929b919a509850919650945092505050565b60008060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b1580156127e457600080fd5b505afa1580156127f8573d6000803e3d6000fd5b505050506040513d602081101561280e57600080fd5b505160408051631e41b72960e11b81526004810187905290519192506001600160a01b03831691633c836e529160248082019260a092909190829003018186803b15801561285b57600080fd5b505afa15801561286f573d6000803e3d6000fd5b505050506040513d60a081101561288557600080fd5b506020015191506007821480612636575050600e1492915050565b6124206128ac82611725565b826139fb565b6001600160e01b031982166208aa8960eb1b14156128fd57604051339082156108fc029083906000818181858888f193505050501580156128f7573d6000803e3d6000fd5b506129ca565b60006129088361248d565b6040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb916044808201926020929091908290030181600087803b15801561295b57600080fd5b505af115801561296f573d6000803e3d6000fd5b505050506040513d602081101561298557600080fd5b5051610f15576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b5050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b158015612a2857600080fd5b505afa158015612a3c573d6000803e3d6000fd5b505050506040513d6020811015612a5257600080fd5b505160408051633550a54b60e11b81526004810186905290519192506001600160a01b03831691636aa14a969160248082019260009290919082900301818387803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b5050505060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d160f21b815250602001905060206040518083038186803b158015612b1157600080fd5b505afa158015612b25573d6000803e3d6000fd5b505050506040513d6020811015612b3b57600080fd5b505160408051636235bbe160e11b815290519192506000916001916001600160a01b0385169163c46b77c291600480820192602092909190829003018186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b50510395945050505050565b5490565b600082612bd057506000610f94565b82820282848281612bdd57fe5b04146124865760405162461bcd60e51b81526004018080602001828103825260218152602001806142e96021913960400191505060405180910390fd5b600061248683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a43565b600082820183811015612486576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008086600181518110612cc657fe5b6020026020010151905060006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b158015612d2957600080fd5b505afa158015612d3d573d6000803e3d6000fd5b505050506040513d6020811015612d5357600080fd5b505190506208aa8960eb1b6001600160e01b03198a161415612e7557806001600160a01b03166368da80af838c8c8c8c8c8c8c6040518963ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b83811015612e2d578181015183820152602001612e15565b50505050905001985050505050505050506000604051808303818588803b158015612e5757600080fd5b505af1158015612e6b573d6000803e3d6000fd5b505050505061310d565b604080516227050b60e31b815261141160f21b600482015290518291600091600080516020614212833981519152916301382858916024808301926020929190829003018186803b158015612ec957600080fd5b505afa158015612edd573d6000803e3d6000fd5b505050506040513d6020811015612ef357600080fd5b50516040805163e3dee23960e01b81526001600160e01b03198e16600482015290519192506000916001600160a01b0384169163e3dee239916024808301926020929190829003018186803b158015612f4b57600080fd5b505afa158015612f5f573d6000803e3d6000fd5b505050506040513d6020811015612f7557600080fd5b50516040805163095ea7b360e01b81526001600160a01b0386811660048301526024820189905291519293509083169163095ea7b3916044808201926020929091908290030181600087803b158015612fcd57600080fd5b505af1158015612fe1573d6000803e3d6000fd5b505050506040513d6020811015612ff757600080fd5b810190808051906020019092919050505050836001600160a01b0316638076083d8e8e8e8e8e8e8e6040518863ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b838110156130c65781810151838201526020016130ae565b5050505090500198505050505050505050600060405180830381600087803b1580156130f157600080fd5b505af1158015613105573d6000803e3d6000fd5b505050505050505b60006000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b15801561316657600080fd5b505afa15801561317a573d6000803e3d6000fd5b505050506040513d602081101561319057600080fd5b50516040805163067157ff60e41b81529051919250613217916001916001600160a01b038516916367157ff0916004808201926020929091908290030181600087803b1580156131df57600080fd5b505af11580156131f3573d6000803e3d6000fd5b505050506040513d602081101561320957600080fd5b50519063ffffffff61244416565b9b9a5050505050505050505050565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061151160f21b815250602001905060206040518083038186803b15801561328057600080fd5b505afa158015613294573d6000803e3d6000fd5b505050506040513d60208110156132aa57600080fd5b50516040805163ce0a6d5f60e01b815290519192506001600160a01b0383169163ce0a6d5f916004808201926020929091908290030181600087803b1580156132f257600080fd5b505af1158015613306573d6000803e3d6000fd5b505050506040513d602081101561331c57600080fd5b505191505090565b61332e8282613aa8565b61333882826139bd565b6129ca81613bd9565b6000806000805160206142128339815191526001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d60208110156133c557600080fd5b5051604080516313aedd4b60e31b81529051919250829160009160008051602061421283398151915291639d76ea5891600480820192602092909190829003018186803b15801561341557600080fd5b505afa158015613429573d6000803e3d6000fd5b505050506040513d602081101561343f57600080fd5b505160408051633a50b15960e21b81526004810188905290519192506001600160a01b0384169163e942c56491602480820192602092909190829003018186803b15801561348c57600080fd5b505afa1580156134a0573d6000803e3d6000fd5b505050506040513d60208110156134b657600080fd5b50516040805163095ea7b360e01b81526001600160a01b0386811660048301526024820189905291519296509083169163095ea7b3916044808201926020929091908290030181600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505060408051633a5e856760e11b81526004810187905290516001600160a01b038416916374bd0ace9160248083019260209291908290030181600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b505050506040513d60208110156135ad57600080fd5b509395945050505050565b60006000805160206142128339815191526001600160a01b0316639d76ea586040518163ffffffff1660e01b815260040160206040518083038186803b1580156112ae57600080fd5b61360c84848461263e565b61361884848484613c1d565b6121875760405162461bcd60e51b81526004018080602001828103825260328152602001806141596032913960400191505060405180910390fd5b6001600160a01b0381166136985760405162461bcd60e51b815260040180806020018281038252602681526020018061418b6026913960400191505060405180910390fd5b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156137835760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613748578181015183820152602001613730565b50505050905090810190601f1680156137755780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b826001600160a01b031661379e82611725565b6001600160a01b0316146137e35760405162461bcd60e51b81526004018080602001828103825260298152602001806143566029913960400191505060405180910390fd5b6001600160a01b0382166138285760405162461bcd60e51b81526004018080602001828103825260248152602001806141ee6024913960400191505060405180910390fd5b61383181613e58565b6001600160a01b038316600090815260036020526040902061385290613e93565b6001600160a01b038216600090815260036020526040902061387390613eaa565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600560205260408120546138f990600163ffffffff61244416565b600083815260066020526040902054909150808214613994576001600160a01b038416600090815260056020526040812080548490811061393657fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061397457fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b0384166000908152600560205260409020805490611fb090600019830161408b565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b613a058282613eb3565b6000818152600c602052604090205460026000196101006001841615020190911604156129ca576000818152600c602052604081206129ca916140af565b60008183613a925760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613748578181015183820152602001613730565b506000838581613a9e57fe5b0495945050505050565b6001600160a01b038216613b03576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613b0c81612423565b15613b5e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260039091529020613b9d90613eaa565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b6000613c31846001600160a01b0316613edf565b613c3d57506001612636565b600060606001600160a01b038616630a85bd0160e11b613c5b612440565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613cd4578181015183820152602001613cbc565b50505050905090810190601f168015613d015780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310613d695780518252601f199092019160209182019101613d4a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dcb576040519150601f19603f3d011682016040523d82523d6000602084013e613dd0565b606091505b509150915081613e2157805115613dea5780518082602001fd5b60405162461bcd60e51b81526004018080602001828103825260328152602001806141596032913960400191505060405180910390fd5b6000818060200190516020811015613e3857600080fd5b50516001600160e01b031916630a85bd0160e11b14935061263692505050565b6000818152600260205260409020546001600160a01b03161561242057600090815260026020526040902080546001600160a01b0319169055565b8054613ea690600163ffffffff61244416565b9055565b80546001019055565b613ebd8282613f18565b613ec782826138cf565b6000818152600660205260408120556129ca81613fef565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612636575050151592915050565b816001600160a01b0316613f2b82611725565b6001600160a01b031614613f705760405162461bcd60e51b815260040180806020018281038252602581526020018061442c6025913960400191505060405180910390fd5b613f7981613e58565b6001600160a01b0382166000908152600360205260409020613f9a90613e93565b60008181526001602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60075460009061400690600163ffffffff61244416565b6000838152600860205260408120546007805493945090928490811061402857fe5b90600052602060002001549050806007838154811061404357fe5b6000918252602080832090910192909255828152600890915260409020829055600780549061407690600019830161408b565b50505060009182525060086020526040812055565b815481835581811115610f1557600083815260209020610f159181019083016140ef565b50805460018160011615610100020316600290046000825580601f106140d55750612420565b601f01602090049060005260206000209081019061242091905b610add91905b8082111561410957600081556001016140f5565b509056fe9265befcbf333c95b8514538387396fd61568e7751a29f9f58e9f4b1a22b4bc4455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e207375626d697420616e6f7468657220636c61696d206f6e6c79206966207468652070726576696f7573206f6e65207761732064656e6965642e4552433732313a207472616e7366657220746f20746865207a65726f206164647265737300000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64734552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e436c61696d20616363657074656420627574207061796f7574206e6f7420636f6d706c65746564a265627a7a72315820312e32093c56349129705a30aae4f77360f9511cf1ac62100928c7c7cfbadca864736f6c63430005110032

Deployed Bytecode Sourcemap

26730:10920:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5280:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5280:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5280:135:0;-1:-1:-1;;;;;;5280:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;16830:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16830:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16830:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7218:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7218:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7218:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;7218:204:0;;;;;;;;;;;;;;6787:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6787:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6787:425:0;;;;;;;;:::i;36775:442::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36775:442:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36775:442:0;;-1:-1:-1;;;;;36775:442:0;;;;;;;;;;-1:-1:-1;;;;;;36775:442:0;;:::i;13273:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13273:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;7841:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7841:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7841:292:0;;;;;;;;;;;;;;;;;:::i;13035:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13035:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13035:232:0;;;;;;;;:::i;34912:707::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34912:707:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34912:707:0;;:::i;8139:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8139:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8139:134:0;;;;;;;;;;;;;;;;;:::i;31868:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31868:36:0;;;:::i;29960:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29960:113:0;;;:::i;32200:268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32200:268:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32200:268:0;-1:-1:-1;;;;;32200:268:0;;:::i;31952:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31952:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31952:39:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;;31952:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13375:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13375:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13375:199:0;;:::i;36447:316::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36447:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36447:316:0;;;;;;;;:::i;6553:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6553:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6553:228:0;;:::i;34226:674::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34226:674:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34226:674:0;;:::i;17888:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17888:91:0;;;:::i;6336:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6336:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6336:211:0;-1:-1:-1;;;;;6336:211:0;;:::i;19773:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19773:140:0;;;:::i;32761:1453::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;32761:1453:0;;;;-1:-1:-1;;;;;;32761:1453:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32761:1453:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32761:1453:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32761:1453:0;;-1:-1:-1;32761:1453:0;-1:-1:-1;32761:1453:0;;;;;;;;;;;;;;;;;;;;;:::i;37229:202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37229:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37229:202:0;;:::i;19476:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19476:79:0;;;:::i;19673:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19673:94:0;;;:::i;36251:184::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36251:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36251:184:0;;;;;;;;:::i;16921:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16921:89:0;;;:::i;7428:254::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7428:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7428:254:0;;;;;;;;;;:::i;27297:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27297:92:0;;;:::i;8279:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8279:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8279:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8279:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8279:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8279:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;8279:272:0;;-1:-1:-1;8279:272:0;;-1:-1:-1;;;;;8279:272:0:i;17016:557::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17016:557:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17016:557:0;;:::i;36002:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36002:237:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36002:237:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;32004:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32004:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32004:49:0;-1:-1:-1;;;;;;32004:49:0;;:::i;7688:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7688:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7688:147:0;;;;;;;;;;:::i;19919:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19919:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19919:109:0;-1:-1:-1;;;;;19919:109:0;;:::i;5280:135::-;-1:-1:-1;;;;;;5374:33:0;;5350:4;5374:33;;;;;;;;;;;;;5280:135;;;;:::o;16830:85::-;16902:5;16895:12;;;;;;;;-1:-1:-1;;16895:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16869:13;;16895:12;;16902:5;;16895:12;;16902:5;16895:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16830:85;;:::o;7218:204::-;7277:7;7305:16;7313:7;7305;:16::i;:::-;7297:73;;;;-1:-1:-1;;;7297:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7390:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;7390:24:0;;7218:204::o;6787:425::-;6851:13;6867:16;6875:7;6867;:16::i;:::-;6851:32;;6908:5;-1:-1:-1;;;;;6902:11:0;:2;-1:-1:-1;;;;;6902:11:0;;;6894:57;;;;-1:-1:-1;;;6894:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6988:5;-1:-1:-1;;;;;6972:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;6972:21:0;;:62;;;;6997:37;7014:5;7021:12;:10;:12::i;:::-;6997:16;:37::i;:::-;6964:154;;;;-1:-1:-1;;;6964:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7131:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;7131:29:0;-1:-1:-1;;;;;7131:29:0;;;;;;;;;7176:28;;7131:24;;7176:28;;;;;;;6787:425;;;:::o;36775:442::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;20445:11;;-1:-1:-1;;;20445:11:0;;;;20437:55;;;;;-1:-1:-1;;;20437:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20503:11;:19;;-1:-1:-1;;;;20503:19:0;;;-1:-1:-1;;;;;;36913:29:0;;20517:5;36913:29;;;:18;:29;;;;;;:40;-1:-1:-1;36913:40:0;36905:70;;;;;-1:-1:-1;;;36905:70:0;;;;;;;;;;;;-1:-1:-1;;;36905:70:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37018:29:0;;;;;;:18;:29;;;;;;:42;;37052:7;37018:42;:33;:42;:::i;:::-;-1:-1:-1;;;;;;36986:29:0;;;;;;:18;:29;;;;;:74;;;;37099:35;37005:9;37099:24;:35::i;:::-;37077:58;;37154:5;-1:-1:-1;;;;;37154:14:0;;37169:10;37181:7;37154:35;;;;;;;;;;;;;-1:-1:-1;;;;;37154:35:0;-1:-1:-1;;;;;37154:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37154:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37154:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37154:35:0;37146:63;;;;;-1:-1:-1;;;37146:63:0;;;;;;;;;;;;-1:-1:-1;;;37146:63:0;;;;;;;;;;;;;;;-1:-1:-1;;20683:11:0;:18;;-1:-1:-1;;;;20683:18:0;-1:-1:-1;;;20683:18:0;;;-1:-1:-1;;36775:442:0:o;13273:96::-;13344:10;:17;13273:96;:::o;7841:292::-;7985:41;8004:12;:10;:12::i;:::-;8018:7;7985:18;:41::i;:::-;7977:103;;;;-1:-1:-1;;;7977:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8093:32;8107:4;8113:2;8117:7;8093:13;:32::i;:::-;7841:292;;;:::o;13035:232::-;13115:7;13151:16;13161:5;13151:9;:16::i;:::-;13143:5;:24;13135:80;;;;-1:-1:-1;;;13135:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13233:19:0;;;;;;:12;:19;;;;;:26;;13253:5;;13233:26;;;;;;;;;;;;;;13226:33;;13035:232;;;;;:::o;34912:707::-;34982:7;37513:39;37532:10;37544:7;37513:18;:39::i;:::-;37505:73;;;;;-1:-1:-1;;;37505:73:0;;;;;;;;;;;;-1:-1:-1;;;37505:73:0;;;;;;;;;;;;;;;20445:11;;-1:-1:-1;;;20445:11:0;;;;20437:55;;;;;-1:-1:-1;;;20437:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20503:11;:19;;-1:-1:-1;;;;20503:19:0;;;20517:5;35024:15;;;:6;:15;;;;;:31;;;20503:19;35024:31;35016:67;;;;;-1:-1:-1;;;35016:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35094:17;35191:15;;;:6;:15;;;;;:23;;;35094:17;;35182:33;;:8;:33::i;:::-;-1:-1:-1;35148:67:0;;-1:-1:-1;35148:67:0;-1:-1:-1;35265:25:0;;-1:-1:-1;35259:32:0;;-1:-1:-1;35259:32:0;;35244:47;;:11;:47;;;35236:81;;;;;-1:-1:-1;;;35236:81:0;;;;;;;;;;;;-1:-1:-1;;;35236:81:0;;;;;;;;;;;;;;;35355:15;;;;:6;:15;;;;;:23;;;35336:43;;:18;:43::i;:::-;35328:95;;;;-1:-1:-1;;;35328:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35444:14;35450:7;35444:5;:14::i;:::-;35485:15;;;;:6;:15;;;;;:29;;;35469:58;;35485:29;;35516:10;35469:15;:58::i;:::-;35581:15;;;;:6;:15;;;;;;;;;:29;;;35543:68;;35557:10;35543:68;;;;;;;;35581:29;;-1:-1:-1;;;;;;35543:68:0;;;;;;;;;;;;;;;;;-1:-1:-1;;20683:11:0;:18;;-1:-1:-1;;;;20683:18:0;-1:-1:-1;;;20683:18:0;;;-1:-1:-1;;34912:707:0:o;8139:134::-;8226:39;8243:4;8249:2;8253:7;8226:39;;;;;;;;;;;;:16;:39::i;31868:36::-;;;;:::o;29960:113::-;30007:7;-1:-1:-1;;;;;;;;;;;;;;;;30034:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;30034:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30034:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30034:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30034:31:0;;-1:-1:-1;29960:113:0;:::o;32200:268::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;32280:17;-1:-1:-1;;;;;;;;;;;;;;;;32309:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32309:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32309:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32309:23:0;;-1:-1:-1;;;;;;32344:16:0;;;32361;:14;:16::i;:::-;-1:-1:-1;;32344:43:0;;;;;;;;;;;;;-1:-1:-1;;;;;32344:43:0;-1:-1:-1;;;;;32344:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32344:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32344:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32410:16:0;;-1:-1:-1;32410:14:0;:16::i;:::-;-1:-1:-1;;;;;32398:46:0;;32445:14;32398:62;;;;;;;;;;;;;-1:-1:-1;;;;;32398:62:0;-1:-1:-1;;;;;32398:62:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32398:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32398:62:0;;;;19658:1;32200:268;:::o;31952:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13375:199::-;13433:7;13469:13;:11;:13::i;:::-;13461:5;:21;13453:78;;;;-1:-1:-1;;;13453:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13549:10;13560:5;13549:17;;;;;;;;;;;;;;;;13542:24;;13375:199;;;:::o;36447:316::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;20445:11;;-1:-1:-1;;;20445:11:0;;;;20437:55;;;;;-1:-1:-1;;;20437:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20503:11;:19;;-1:-1:-1;;;;20503:19:0;;;-1:-1:-1;;;20517:5:0;36566:31;:18;:31;;-1:-1:-1;;;;;;;;;;;36566:31:0;:42;-1:-1:-1;36566:42:0;36558:69;;;;;-1:-1:-1;;;36558:69:0;;;;;;;;;;;;-1:-1:-1;;;36558:69:0;;;;;;;;;;;;;;;-1:-1:-1;;;36672:31:0;;:18;:31;;-1:-1:-1;;;;;;;;;;;36672:31:0;:44;;36708:7;36672:44;:35;:44;:::i;:::-;-1:-1:-1;;;36638:31:0;;;;:18;:31;;-1:-1:-1;;;;;;;;;;;36638:78:0;;;;:31;36727:28;-1:-1:-1;;;;;36727:19:0;;;:28;;;;;36747:7;;36727:28;36638:31;36727:28;36747:7;36727:19;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20683:11:0;:18;;-1:-1:-1;;;;20683:18:0;-1:-1:-1;;;20683:18:0;;;-1:-1:-1;36447:316:0:o;6553:228::-;6608:7;6644:20;;;:11;:20;;;;;;-1:-1:-1;;;;;6644:20:0;6683:19;6675:73;;;;-1:-1:-1;;;6675:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34226:674;34298:7;37513:39;37532:10;37544:7;37513:18;:39::i;:::-;37505:73;;;;;-1:-1:-1;;;37505:73:0;;;;;;;;;;;;-1:-1:-1;;;37505:73:0;;;;;;;;;;;;;;;34328:15;;;;:6;:15;;;;;:31;;;;;34324:300;;;34376:17;34441:15;;;:6;:15;;;;;:23;;;34432:33;;:8;:33::i;:::-;-1:-1:-1;34408:57:0;;-1:-1:-1;34509:23:0;;-1:-1:-1;34503:30:0;;-1:-1:-1;;34503:30:0;;34488:45;;:11;:45;;;34480:132;;;;-1:-1:-1;;;34480:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34324:300;;34642:15;;;;:6;:15;;;;;:35;34680:15;-1:-1:-1;34634:82:0;;;;;-1:-1:-1;;;34634:82:0;;;;;;;;;;;;-1:-1:-1;;;34634:82:0;;;;;;;;;;;;;;;34737:12;34765:15;;;:6;:15;;;;;:23;;;34752:37;;:12;:37::i;:::-;34810:15;;;;:6;:15;;;;;;:31;;;:38;;-1:-1:-1;;34810:38:0;34844:4;34810:38;;;34859:23;;:33;;;;-1:-1:-1;;34226:674:0:o;17888:91::-;17963:8;17956:15;;;;;;;;-1:-1:-1;;17956:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17930:13;;17956:15;;17963:8;;17956:15;;17963:8;17956:15;;;;;;;;;;;;;;;;;;;;;;;;6336:211;6391:7;-1:-1:-1;;;;;6419:19:0;;6411:74;;;;-1:-1:-1;;;6411:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6505:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;19773:140::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;19856:6;;19835:40;;19872:1;;-1:-1:-1;;;;;19856:6:0;;19835:40;;19872:1;;19835:40;19886:6;:19;;-1:-1:-1;;;;;;19886:19:0;;;19773:140::o;32761:1453::-;33021:15;33039:12;;33052:1;33039:15;;;;;;;;;;;;;33021:33;;33065:18;33086:65;33140:10;33086:49;33131:3;33086:40;33115:10;33086:24;;:28;;:40;;;;:::i;:::-;:44;:49;:44;:49;:::i;:::-;:53;:65;:53;:65;:::i;:::-;33065:86;-1:-1:-1;;;;;;;;;;33166:22:0;;;33162:312;;;33226:13;33213:9;:26;33205:59;;;;;-1:-1:-1;;;33205:59:0;;;;;;;;;;;;-1:-1:-1;;;33205:59:0;;;;;;;;;;;;;;;33162:312;;;33297:12;33319:39;33344:13;33319:24;:39::i;:::-;33382:60;;;-1:-1:-1;;;33382:60:0;;33401:10;33382:60;;;;33421:4;33382:60;;;;;;;;;;;;33297:62;;-1:-1:-1;;;;;;33382:18:0;;;;;:60;;;;;;;;;;;;;;;-1:-1:-1;33382:18:0;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;33382:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33382:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33382:60:0;33374:88;;;;;-1:-1:-1;;;33374:88:0;;;;;;;;;;;;-1:-1:-1;;;33374:88:0;;;;;;;;;;;;;;;33162:312;;33494:12;33509:87;33519:22;33543:13;33558:12;;33509:87;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33572:11:0;;-1:-1:-1;33585:2:0;;-1:-1:-1;33589:2:0;;-1:-1:-1;33593:2:0;33509:9;:87::i;:::-;33494:102;-1:-1:-1;33643:68:0;33681:29;:13;33699:10;33681:29;:17;:29;:::i;:::-;-1:-1:-1;;;;;;33643:33:0;;;;;;:18;:33;;;;;;;:68;:37;:68;:::i;:::-;-1:-1:-1;;;;;;33607:33:0;;;;;;:18;:33;;;;;:104;;;;33777:17;:19;;;;;;;;;33834:76;33904:6;33890:20;;;;33834:76;33852:35;:33;:35::i;:::-;33834:15;:53;:76;33807:103;;33943:222;;;;;;;;33949:19;33943:222;;;;33981:13;-1:-1:-1;;;;;33943:222:0;;;;;;34007:12;;34020:1;34007:15;;;;;;;;;;;;;33943:222;;;;34035:12;;34048:1;34035:15;;;;;;;;;;;;;33943:222;;;;34063:12;;34076:1;34063:15;;;;;;;;;;;;;33943:222;;;;34091:12;;34104:1;34091:15;;;;;;;;;;;;;33943:222;;;;34119:12;;34132:1;34119:15;;;;;;;;;;;;;;;;33943:222;;-1:-1:-1;33943:222:0;;;;;;-1:-1:-1;33943:222:0;;;;;;;;;;;;;;33921:19;;;:6;:19;;;;;;:244;;;;;;;;33943:222;33921:244;;;;-1:-1:-1;;33921:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33921:244:0;;;;;;;;;;;;;;;;;;;;34176:30;34182:10;33921:19;34176:5;:30::i;:::-;32761:1453;;;;;;;;;;;;;:::o;37229:202::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;37295:13;37311:22;37326:6;37311:14;:22::i;:::-;-1:-1:-1;;;37378:31:0;;:18;:31;;-1:-1:-1;;;;;;;;;;;37378:31:0;37295:38;;-1:-1:-1;37378:45:0;;37295:38;37378:45;:35;:45;:::i;:::-;-1:-1:-1;;;37344:31:0;;:18;:31;;-1:-1:-1;;;;;;;;;;;37344:79:0;-1:-1:-1;;37229:202:0:o;19476:79::-;19541:6;;-1:-1:-1;;;;;19541:6:0;19476:79;:::o;19673:94::-;19753:6;;19713:4;;-1:-1:-1;;;;;19753:6:0;19737:12;:10;:12::i;:::-;-1:-1:-1;;;;;19737:22:0;;19730:29;;19673:94;:::o;36251:184::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;36338:15;36363:18;:16;:18::i;:::-;36338:44;;36393:8;-1:-1:-1;;;;;36393:16:0;;36410:8;36420:6;36393:34;;;;;;;;;;;;;-1:-1:-1;;;;;36393:34:0;-1:-1:-1;;;;;36393:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36393:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36393:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;36251:184:0:o;16921:89::-;16995:7;16988:14;;;;;;;;-1:-1:-1;;16988:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16962:13;;16988:14;;16995:7;;16988:14;;16995:7;16988:14;;;;;;;;;;;;;;;;;;;;;;;;7428:254;7514:12;:10;:12::i;:::-;-1:-1:-1;;;;;7508:18:0;:2;-1:-1:-1;;;;;7508:18:0;;;7500:56;;;;;-1:-1:-1;;;7500:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7608:8;7569:18;:32;7588:12;:10;:12::i;:::-;-1:-1:-1;;;;;7569:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;7569:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;7569:47:0;;;;;;;;;;;7647:12;:10;:12::i;:::-;7632:42;;;;;;;;;;-1:-1:-1;;;;;7632:42:0;;;;;;;;;;;;;;7428:254;;:::o;27297:92::-;-1:-1:-1;;;;;;;;;;;27297:92:0;:::o;8279:272::-;8394:41;8413:12;:10;:12::i;:::-;8427:7;8394:18;:41::i;:::-;8386:103;;;;-1:-1:-1;;;8386:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8500:43;8518:4;8524:2;8528:7;8537:5;8500:17;:43::i;:::-;8279:272;;;;:::o;17016:557::-;17074:13;17108:16;17116:7;17108;:16::i;:::-;17100:76;;;;-1:-1:-1;;;17100:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17215:19;;;;:10;:19;;;;;;;;;17189:45;;;;;;-1:-1:-1;;17189:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;17215:19;17189:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17351:9;17345:23;17372:1;17345:28;17341:225;;;-1:-1:-1;;17390:9:0;;;;;;;;;-1:-1:-1;17390:9:0;;;;17341:225;17533:8;17543:9;17516:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17516:37:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17516:37:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17516:37:0;;;17502:52;;;;;36002:237;36066:17;36151:15;;;:6;:15;;;;;:23;;;36066:17;;36142:33;;:8;:33::i;:::-;-1:-1:-1;36118:57:0;;-1:-1:-1;36204:27:0;;-1:-1:-1;36223:7:0;;-1:-1:-1;36204:18:0;;-1:-1:-1;36204:27:0:i;:::-;36186:45;;36002:237;;;:::o;32004:49::-;;;;;;;;;;;;;:::o;7688:147::-;-1:-1:-1;;;;;7792:25:0;;;7768:4;7792:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7688:147::o;19919:109::-;19601:9;:7;:9::i;:::-;19593:54;;;;;-1:-1:-1;;;19593:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19593:54:0;;;;;;;;;;;;;;;19992:28;20011:8;19992:18;:28::i;:::-;19919:109;:::o;8835:155::-;8892:4;8925:20;;;:11;:20;;;;;;-1:-1:-1;;;;;8925:20:0;8963:19;;;8835:155::o;86:98::-;166:10;86:98;:::o;1948:136::-;2006:7;2033:43;2037:1;2040;2033:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2026:50;1948:136;-1:-1:-1;;;1948:136:0:o;30862:211::-;30936:7;30956:11;-1:-1:-1;;;;;;;;;;;;;;;;30979:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;30979:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30979:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30979:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30979:31:0;31029:36;;;-1:-1:-1;;;31029:36:0;;-1:-1:-1;;;;;;31029:36:0;;;;;;;;30979:31;;-1:-1:-1;;;;;;31029:26:0;;;;;:36;;;;;30979:31;;31029:36;;;;;;;;:26;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;31029:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31029:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31029:36:0;;30862:211;-1:-1:-1;;;30862:211:0:o;8996:333::-;9081:4;9106:16;9114:7;9106;:16::i;:::-;9098:73;;;;-1:-1:-1;;;9098:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9182:13;9198:16;9206:7;9198;:16::i;:::-;9182:32;;9244:5;-1:-1:-1;;;;;9233:16:0;:7;-1:-1:-1;;;;;9233:16:0;;:51;;;;9277:7;-1:-1:-1;;;;;9253:31:0;:20;9265:7;9253:11;:20::i;:::-;-1:-1:-1;;;;;9253:31:0;;9233:51;:87;;;;9288:32;9305:5;9312:7;9288:16;:32::i;:::-;9225:96;8996:333;-1:-1:-1;;;;8996:333:0:o;13580:245::-;13666:38;13686:4;13692:2;13696:7;13666:19;:38::i;:::-;13717:47;13750:4;13756:7;13717:32;:47::i;:::-;13777:40;13805:2;13809:7;13777:27;:40::i;30085:362::-;30166:8;30185:12;30208:15;30234:18;30263:15;30297:27;-1:-1:-1;;;;;;;;;;;;;;;;30341:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;30341:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30341:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30341:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30341:31:0;30391:48;;;-1:-1:-1;;;30391:48:0;;;;;;;;;;30341:31;;-1:-1:-1;;;;;;30391:39:0;;;;;:48;;;;;;;;;;;;;;;:39;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;30391:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30391:48:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30391:48:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30391:48:0;-1:-1:-1;30391:48:0;;-1:-1:-1;30391:48:0;-1:-1:-1;30085:362:0;-1:-1:-1;;;30085:362:0:o;31426:375::-;31491:4;31508:14;31533:13;-1:-1:-1;;;;;;;;;;;;;;;;31556:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;31556:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31556:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31556:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31556:31:0;31618;;;-1:-1:-1;;;31618:31:0;;;;;;;;;;31556;;-1:-1:-1;;;;;;31618:22:0;;;;;:31;;;;;;;;;;;;;;;:22;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;31618:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31618:31:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;31618:31:0;;;;-1:-1:-1;31682:42:0;31667:6;:58;:126;;;-1:-1:-1;;31757:35:0;31742:51;;31660:133;-1:-1:-1;;31426:375:0:o;10371:92::-;10423:32;10429:16;10437:7;10429;:16::i;:::-;10447:7;10423:5;:32::i;35631:359::-;-1:-1:-1;;;;;;35719:28:0;;-1:-1:-1;;;35719:28:0;35715:268;;;35764:31;;:10;;:31;;;;;35784:10;;35764:31;;;;35784:10;35764;:31;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35764:31:0;35715:268;;;35828:12;35850:39;35875:13;35850:24;:39::i;:::-;35913:38;;;-1:-1:-1;;;35913:38:0;;35928:10;35913:38;;;;;;;;;;;;35828:62;;-1:-1:-1;;;;;;35913:14:0;;;;;:38;;;;;;;;;;;;;;;-1:-1:-1;35913:14:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;35913:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35913:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35913:38:0;35905:66;;;;;-1:-1:-1;;;35905:66:0;;;;;;;;;;;;-1:-1:-1;;;35905:66:0;;;;;;;;;;;;;;35715:268;35631:359;;:::o;29607:341::-;29661:4;29678:13;-1:-1:-1;;;;;;;;;;;;;;;;29701:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;29701:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29701:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29701:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29701:31:0;29744:27;;;-1:-1:-1;;;29744:27:0;;;;;;;;;;29701:31;;-1:-1:-1;;;;;;29744:18:0;;;;;:27;;;;;-1:-1:-1;;29744:27:0;;;;;;;;-1:-1:-1;29744:18:0;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;29744:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29744:27:0;;;;29788:21;-1:-1:-1;;;;;;;;;;;;;;;;29823:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;29823:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29823:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29823:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29823:31:0;29881:30;;;-1:-1:-1;;;29881:30:0;;;;29823:31;;-1:-1:-1;29866:12:0;;29914:1;;-1:-1:-1;;;;;29881:28:0;;;;;:30;;;;;29823:31;;29881:30;;;;;;;;:28;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29881:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29881:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29881:30:0;:34;;29607:341;-1:-1:-1;;;;;29607:341:0:o;4604:114::-;4696:14;;4604:114::o;2288:471::-;2346:7;2591:6;2587:47;;-1:-1:-1;2621:1:0;2614:8;;2587:47;2658:5;;;2662:1;2658;:5;:1;2682:5;;;;;:10;2674:56;;;;-1:-1:-1;;;2674:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2765:132;2823:7;2850:39;2854:1;2857;2850:39;;;;;;;;;;;;;;;;;:3;:39::i;1761:181::-;1819:7;1851:5;;;1875:6;;;;1867:46;;;;;-1:-1:-1;;;1867:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28371:1224;28614:12;28645:15;28663:12;28676:1;28663:15;;;;;;;;;;;;;;28645:33;;28689:11;-1:-1:-1;;;;;;;;;;;;;;;;28709:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;28709:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28709:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28709:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28709:31:0;;-1:-1:-1;;;;;;;;;;28756:22:0;;;28752:597;;;28795:5;-1:-1:-1;;;;;28795:20:0;;28822:10;28834:22;28858:13;28873:12;28887:11;28900:2;28904;28908;28795:116;;;;;;;;;;;;;-1:-1:-1;;;;;28795:116:0;-1:-1:-1;;;;;28795:116:0;;;;;;-1:-1:-1;;;;;28795:116:0;;-1:-1:-1;;;;;28795:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28795:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28795:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28795:116:0;;;;;28752:597;;;29051:31;;;-1:-1:-1;;;29051:31:0;;-1:-1:-1;;;29051:31:0;;;;;;28999:5;;28944:28;;-1:-1:-1;;;;;;;;;;;27346:42:0;29051:25;;:31;;;;;;;;;;;;;;27346:42;29051:31;;;5:2:-1;;;;30:1;27;20:12;5:2;29051:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29051:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29051:31:0;29120:47;;;-1:-1:-1;;;29120:47:0;;-1:-1:-1;;;;;;29120:47:0;;;;;;;;29051:31;;-1:-1:-1;29098:12:0;;-1:-1:-1;;;;;29120:32:0;;;;;:47;;;;;29051:31;;29120:47;;;;;;;:32;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;29120:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29120:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29120:47:0;29183:39;;;-1:-1:-1;;;29183:39:0;;-1:-1:-1;;;;;29183:39:0;;;;;;;;;;;;;;;29120:47;;-1:-1:-1;29183:13:0;;;;;;:39;;;;;29120:47;;29183:39;;;;;;;;-1:-1:-1;29183:13:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;29183:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29183:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29183:39:0;;;;;;;;;;;;;;;;;29237:5;-1:-1:-1;;;;;29237:22:0;;29260;29284:13;29299:12;29313:11;29326:2;29330;29334;29237:100;;;;;;;;;;;;;-1:-1:-1;;;;;29237:100:0;-1:-1:-1;;;;;29237:100:0;;;;;;-1:-1:-1;;;;;29237:100:0;;-1:-1:-1;;;;;29237:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29237:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29237:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29237:100:0;;;;28752:597;;;;29365:27;-1:-1:-1;;;;;;;;;;;;;;;;29409:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;29409:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29409:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29409:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29409:31:0;29550:30;;;-1:-1:-1;;;29550:30:0;;;;29409:31;;-1:-1:-1;29550:37:0;;29585:1;;-1:-1:-1;;;;;29550:28:0;;;;;:30;;;;;29409:31;;29550:30;;;;;;;;;:28;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29550:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29550:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29550:30:0;;:37;:34;:37;:::i;:::-;29540:47;28371:1224;-1:-1:-1;;;;;;;;;;;28371:1224:0:o;31085:208::-;31148:4;31165:19;-1:-1:-1;;;;;;;;;;;;;;;;31197:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;31197:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31197:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31197:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31197:31:0;31247:38;;;-1:-1:-1;;;31247:38:0;;;;31197:31;;-1:-1:-1;;;;;;31247:36:0;;;;;:38;;;;;31197:31;;31247:38;;;;;;;;;:36;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;31247:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31247:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31247:38:0;;-1:-1:-1;;31085:208:0;:::o;13831:202::-;13895:24;13907:2;13911:7;13895:11;:24::i;:::-;13932:40;13960:2;13964:7;13932:27;:40::i;:::-;13985;14017:7;13985:31;:40::i;30459:391::-;30514:13;30540:28;-1:-1:-1;;;;;;;;;;;;;;;;30571:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;30571:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30571:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30571:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30571:31:0;30689:23;;;-1:-1:-1;;;30689:23:0;;;;30571:31;;-1:-1:-1;30571:31:0;;30613:8;;-1:-1:-1;;;;;;;;;;;27346:42:0;30689:21;;:23;;;;;30571:31;;30689:23;;;;;;;;27346:42;30689:23;;;5:2:-1;;;;30:1;27;20:12;5:2;30689:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30689:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30689:23:0;30741:17;;;-1:-1:-1;;;30741:17:0;;;;;;;;;;30689:23;;-1:-1:-1;;;;;;30741:9:0;;;;;:17;;;;;30689:23;;30741:17;;;;;;;;:9;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;30741:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30741:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30741:17:0;30769:38;;;-1:-1:-1;;;30769:38:0;;-1:-1:-1;;;;;30769:38:0;;;;;;;;;;;;;;;30741:17;;-1:-1:-1;30769:16:0;;;;;;:38;;;;;30741:17;;30769:38;;;;;;;;-1:-1:-1;30769:16:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;30769:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30769:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;30818:24:0;;;-1:-1:-1;;;30818:24:0;;;;;;;;;;-1:-1:-1;;;;;30818:16:0;;;;;:24;;;;;30769:38;;30818:24;;;;;;;-1:-1:-1;30818:16:0;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;30818:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30818:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30459:391:0;;;-1:-1:-1;;;;;30459:391:0:o;31305:109::-;31356:7;-1:-1:-1;;;;;;;;;;;;;;;;31383:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;8557:272:0;8667:32;8681:4;8687:2;8691:7;8667:13;:32::i;:::-;8718:48;8741:4;8747:2;8751:7;8760:5;8718:22;:48::i;:::-;8710:111;;;;-1:-1:-1;;;8710:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20034:229;-1:-1:-1;;;;;20108:22:0;;20100:73;;;;-1:-1:-1;;;20100:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20210:6;;20189:38;;-1:-1:-1;;;;;20189:38:0;;;;20210:6;;20189:38;;20210:6;;20189:38;20238:6;:17;;-1:-1:-1;;;;;;20238:17:0;-1:-1:-1;;;;;20238:17:0;;;;;;;;;;20034:229::o;2090:192::-;2176:7;2212:12;2204:6;;;;2196:29;;;;-1:-1:-1;;;2196:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2196:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2248:5:0;;;2090:192::o;10469:459::-;10583:4;-1:-1:-1;;;;;10563:24:0;:16;10571:7;10563;:16::i;:::-;-1:-1:-1;;;;;10563:24:0;;10555:78;;;;-1:-1:-1;;;10555:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10652:16:0;;10644:65;;;;-1:-1:-1;;;10644:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10722:23;10737:7;10722:14;:23::i;:::-;-1:-1:-1;;;;;10758:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;10804:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;10850:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;10850:25:0;-1:-1:-1;;;;;10850:25:0;;;;;;;;;10893:27;;10850:20;;10893:27;;;;;;;10469:459;;;:::o;14911:591::-;-1:-1:-1;;;;;15028:18:0;;15003:22;15028:18;;;:12;:18;;;;;:25;:32;;15058:1;15028:32;:29;:32;:::i;:::-;15071:18;15092:26;;;:17;:26;;;;;;15003:57;;-1:-1:-1;15133:28:0;;;15129:328;;-1:-1:-1;;;;;15200:18:0;;15178:19;15200:18;;;:12;:18;;;;;:34;;15219:14;;15200:34;;;;;;;;;;;;;;15178:56;;15284:11;15251:12;:18;15264:4;-1:-1:-1;;;;;15251:18:0;-1:-1:-1;;;;;15251:18:0;;;;;;;;;;;;15270:10;15251:30;;;;;;;;;;;;;;;;;;;:44;;;;15368:30;;;:17;:30;;;;;:43;;;15129:328;-1:-1:-1;;;;;15467:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;15467:27:0;;;:::i;14549:186::-;-1:-1:-1;;;;;14663:16:0;;;;;;;:12;:16;;;;;;;;:23;;14634:26;;;:17;:26;;;;;:52;;;14697:16;;;39:1:-1;23:18;;45:23;;14697:30:0;;;;;;;;14549:186::o;17985:247::-;18052:27;18064:5;18071:7;18052:11;:27::i;:::-;18138:19;;;;:10;:19;;;;;18132:33;;-1:-1:-1;;18132:33:0;;;;;;;;;;;:38;18128:97;;18194:19;;;;:10;:19;;;;;18187:26;;;:::i;2903:345::-;2989:7;3091:12;3084:5;3076:28;;;;-1:-1:-1;;;3076:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3076:28:0;;3115:9;3131:1;3127;:5;;;;;;;2903:345;-1:-1:-1;;;;;2903:345:0:o;9691:335::-;-1:-1:-1;;;;;9763:16:0;;9755:61;;;;;-1:-1:-1;;;9755:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9836:16;9844:7;9836;:16::i;:::-;9835:17;9827:58;;;;;-1:-1:-1;;;9827:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9898:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;9898:25:0;-1:-1:-1;;;;;9898:25:0;;;;;;;;9934:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;9985;;10010:7;;-1:-1:-1;;;;;9985:33:0;;;10002:1;;9985:33;;10002:1;;9985:33;9691:335;;:::o;14741:164::-;14845:10;:17;;14818:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;14873:24:0;;;;;;;14741:164::o;10934:1079::-;11056:4;11083:15;:2;-1:-1:-1;;;;;11083:13:0;;:15::i;:::-;11078:60;;-1:-1:-1;11122:4:0;11115:11;;11078:60;11209:12;11223:23;-1:-1:-1;;;;;11250:7:0;;-1:-1:-1;;;11355:12:0;:10;:12::i;:::-;11382:4;11401:7;11423:5;11258:181;;;;;;-1:-1:-1;;;;;11258:181:0;-1:-1:-1;;;;;11258:181:0;;;;;;-1:-1:-1;;;;;11258:181:0;-1:-1:-1;;;;;11258:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;11258:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11258:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;11258:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;11258:181:0;;;179:29:-1;;;;160:49;;11250:190:0;;;11258:181;;11250:190;;-1:-1:-1;11250:190:0;;-1:-1:-1;25:18;-1:-1;11250:190:0;-1:-1:-1;11250:190:0;;-1:-1:-1;11250:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11250:190:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;11208:232:0;;;;11456:7;11451:555;;11484:17;;:21;11480:384;;11652:10;11646:17;11713:15;11700:10;11696:2;11692:19;11685:44;11600:148;11788:60;;-1:-1:-1;;;11788:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11451:555;11896:13;11923:10;11912:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11912:32:0;-1:-1:-1;;;;;;11967:26:0;-1:-1:-1;;;11967:26:0;;-1:-1:-1;11959:35:0;;-1:-1:-1;;;11959:35:0;12019:175;12119:1;12083:24;;;:15;:24;;;;;;-1:-1:-1;;;;;12083:24:0;:38;12079:108;;12173:1;12138:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;12138:37:0;;;12019:175::o;4915:110::-;4996:14;;:21;;5015:1;4996:21;:18;:21;:::i;:::-;4979:38;;4915:110::o;4726:181::-;4880:19;;4898:1;4880:19;;;4726:181::o;14039:372::-;14106:27;14118:5;14125:7;14106:11;:27::i;:::-;14146:48;14179:5;14186:7;14146:32;:48::i;:::-;14344:1;14315:26;;;:17;:26;;;;;:30;14358:45;14333:7;14358:36;:45::i;3586:374::-;3646:4;3869:20;;3712:66;3909:23;;;;;;:42;;-1:-1:-1;;3936:15:0;;;3586:374;-1:-1:-1;;3586:374:0:o;10032:333::-;10127:5;-1:-1:-1;;;;;10107:25:0;:16;10115:7;10107;:16::i;:::-;-1:-1:-1;;;;;10107:25:0;;10099:75;;;;-1:-1:-1;;;10099:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10187:23;10202:7;10187:14;:23::i;:::-;-1:-1:-1;;;;;10223:24:0;;;;;;:17;:24;;;;;:36;;:34;:36::i;:::-;10301:1;10270:20;;;:11;:20;;;;;;:33;;-1:-1:-1;;;;;;10270:33:0;;;10321:36;10282:7;;10301:1;-1:-1:-1;;;;;10321:36:0;;;;;10301:1;;10321:36;10032:333;;:::o;15508:516::-;15615:10;:17;15590:22;;15615:24;;15637:1;15615:24;:21;:24;:::i;:::-;15650:18;15671:24;;;:15;:24;;;;;;15728:10;:26;;15590:49;;-1:-1:-1;15671:24:0;;15590:49;;15728:26;;;;;;;;;;;;;;15706:48;;15792:11;15767:10;15778;15767:22;;;;;;;;;;;;;;;;;;;:36;;;;15872:28;;;:15;:28;;;;;;:41;;;15958:10;:19;;;;;-1:-1:-1;;15958:19:0;;;:::i;:::-;-1:-1:-1;;;16015:1:0;15988:24;;;-1:-1:-1;15988:15:0;:24;;;;;:28;15508:516::o;26730:10920::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://312e32093c56349129705a30aae4f77360f9511cf1ac62100928c7c7cfbadca8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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