ETH Price: $3,401.22 (+3.22%)

Contract

0xBBba5BA03d948d0A4cC010CA03D3b6E1b14f7098
 
Transaction Hash
Method
Block
From
To
Erc20Airdrop212244702024-11-19 21:28:353 days ago1732051715IN
Crypto Multisender
0 ETH0.0335662724.89062076
Erc20Airdrop211873112024-11-14 17:05:239 days ago1731603923IN
Crypto Multisender
0 ETH0.0305684635.74122591
Erc20Airdrop211199132024-11-05 7:19:4718 days ago1730791187IN
Crypto Multisender
0.00886666 ETH0.010543563.73526764
Erc20Airdrop211190092024-11-05 4:17:5918 days ago1730780279IN
Crypto Multisender
0 ETH0.001006495.6
Erc20Airdrop211149682024-11-04 14:45:3519 days ago1730731535IN
Crypto Multisender
0 ETH0.007497296.37440646
Airdrop Native C...210973382024-11-02 3:41:1121 days ago1730518871IN
Crypto Multisender
0.0018 ETH0.000351533.46210675
Erc20Airdrop210667162024-10-28 21:08:1125 days ago1730149691IN
Crypto Multisender
0 ETH0.0043321415.66128759
Airdrop Native C...210623242024-10-28 6:24:3526 days ago1730096675IN
Crypto Multisender
0.002 ETH0.000421624.47236338
Erc20Airdrop210433702024-10-25 14:56:5929 days ago1729868219IN
Crypto Multisender
0.00066666 ETH0.0042735612.29795305
Erc1155Airdrop210361302024-10-24 14:42:5930 days ago1729780979IN
Crypto Multisender
0 ETH0.0020224714.89796589
Erc1155Airdrop210359462024-10-24 14:05:5930 days ago1729778759IN
Crypto Multisender
0 ETH0.0021981714.38077808
Erc20Airdrop210357562024-10-24 13:27:5930 days ago1729776479IN
Crypto Multisender
0 ETH0.003624889.92001855
Airdrop Native C...209840112024-10-17 8:12:2337 days ago1729152743IN
Crypto Multisender
0.063 ETH0.0192652652.99338109
Airdrop Native C...209839412024-10-17 7:58:2337 days ago1729151903IN
Crypto Multisender
0.022 ETH0.0062129939.01803413
Airdrop Native C...209839002024-10-17 7:49:4737 days ago1729151387IN
Crypto Multisender
0.055 ETH0.0153587832.44136441
Erc20Airdrop209754982024-10-16 3:40:4738 days ago1729050047IN
Crypto Multisender
0.00019999 ETH0.001919411.78740099
Erc20Airdrop209677232024-10-15 1:35:5939 days ago1728956159IN
Crypto Multisender
0 ETH0.0356095514.06855585
Erc20Airdrop209359272024-10-10 14:52:1144 days ago1728571931IN
Crypto Multisender
0.00139999 ETH0.0177953825.63655927
Erc20Airdrop208977532024-10-05 7:10:3549 days ago1728112235IN
Crypto Multisender
0.00833333 ETH0.014955725.60630601
Erc20Airdrop208937872024-10-04 17:54:4750 days ago1728064487IN
Crypto Multisender
0 ETH0.012884836.9170105
Airdrop Native C...208720132024-10-01 17:03:4753 days ago1727802227IN
Crypto Multisender
0.00594999 ETH0.0027805827.37851482
Erc20Airdrop208678122024-10-01 2:59:2353 days ago1727751563IN
Crypto Multisender
0 ETH0.001311036.5
Airdrop Native C...208644782024-09-30 15:50:4754 days ago1727711447IN
Crypto Multisender
0.01806666 ETH0.002087420.62207066
Erc20Airdrop208642852024-09-30 15:12:1154 days ago1727709131IN
Crypto Multisender
0.00086666 ETH0.0105600825.33365547
Erc20Airdrop208427922024-09-27 15:15:3557 days ago1727450135IN
Crypto Multisender
0.00239999 ETH0.0157627826.24056462
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
211199132024-11-05 7:19:4718 days ago1730791187
Crypto Multisender
0.00886666 ETH
210973382024-11-02 3:41:1121 days ago1730518871
Crypto Multisender
0.0018 ETH
210623242024-10-28 6:24:3526 days ago1730096675
Crypto Multisender
0.002 ETH
210433702024-10-25 14:56:5929 days ago1729868219
Crypto Multisender
0.00066666 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209840112024-10-17 8:12:2337 days ago1729152743
Crypto Multisender
0.007 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839412024-10-17 7:58:2337 days ago1729151903
Crypto Multisender
0.002 ETH
209839002024-10-17 7:49:4737 days ago1729151387
Crypto Multisender
0.005 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-16
*/

pragma solidity ^0.8.0;
 

contract Ownable {
    
    address public owner;
    
    event OwnershipTransferred(address indexed from, address indexed to);
    
    /**
     * Constructor assigns ownership to the address used to deploy the contract.
     * */
    constructor() {
        owner = msg.sender;
    }

    function getOwner() public view returns(address) {
        return owner;
    }

    /**
     * Any function with this modifier in its method signature can only be executed by
     * the owner of the contract. Any attempt made by any other account to invoke the 
     * functions with this modifier will result in a loss of gas and the contract's state
     * will remain untampered.
     * */
    modifier onlyOwner {
        require(msg.sender == owner, "Function restricted to owner of contract");
        _;
    }

    /**
     * Allows for the transfer of ownership to another address;
     * 
     * @param _newOwner The address to be assigned new ownership.
     * */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(
            _newOwner != address(0)
            && _newOwner != owner 
        );
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}



abstract contract DeprecatedMultisenderSC {
    function isPremiumMember(address _who) external virtual view returns(bool);
}

/**
 * Contract acts as an interface between the Crypto Multisender contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERC20Interface {
    function transferFrom(address _from, address _to, uint256 _value) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function allowance(address owner, address spender)  public view virtual returns (uint256);
    function transfer(address to, uint256 value) public virtual returns(bool);
    function gasOptimizedAirdrop(address[] calldata _addrs, uint256[] calldata _values) external virtual; 
}

/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC721 compliant
 * tokens. 
 * */
abstract contract ERC721Interface {
    function transferFrom(address _from, address _to, uint256 _tokenId) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds) external virtual;
}


/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC1155 compliant
 * tokens. 
 * */
abstract contract ERC1155Interface {
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory data) public virtual;
    function balanceOf(address _who, uint256 _id)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds, uint256[] calldata _amounts) external virtual;
}



contract CryptoMultisender is Ownable {
 
    mapping (address => uint256) public tokenTrialDrops;
    mapping (address => uint256) public userTrialDrops;

    mapping (address => uint256) public premiumMembershipDiscount;
    mapping (address => uint256) public membershipExpiryTime;

    mapping (address => bool) public isGrantedPremiumMember;

    mapping (address => bool) public isListedToken;
    mapping (address => uint256) public tokenListingFeeDiscount;

    mapping (address => bool) public isGrantedListedToken;

    mapping (address => bool) public isAffiliate;
    mapping (string => address) public affiliateCodeToAddr;
    mapping (string => bool) public affiliateCodeExists;
    mapping (address => string) public affiliateCodeOfAddr;
    mapping (address => string) public isAffiliatedWith;
    mapping (string => uint256) public commissionPercentage;

    uint256 public oneDayMembershipFee;
    uint256 public sevenDayMembershipFee;
    uint256 public oneMonthMembershipFee;
    uint256 public lifetimeMembershipFee;
    uint256 public tokenListingFee;
    uint256 public rate;
    uint256 public dropUnitPrice;
    address public deprecatedMultisenderAddress;

    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);
    event NftAirdrop(address indexed by, address indexed nftAddress, uint256 totalTransfers);
    event RateChanged(uint256 from, uint256 to);
    event RefundIssued(address indexed to, uint256 totalWei);
    event ERC20TokensWithdrawn(address token, address sentTo, uint256 value);
    event CommissionPaid(address indexed to, uint256 value);
    event NewPremiumMembership(address indexed premiumMember);
    event NewAffiliatePartnership(address indexed newAffiliate, string indexed affiliateCode);
    event AffiliatePartnershipRevoked(address indexed affiliate, string indexed affiliateCode);
    
    constructor() {
        rate = 3000;
        dropUnitPrice = 333333333333333; 
        oneDayMembershipFee = 9e17;
        sevenDayMembershipFee = 125e16;
        oneMonthMembershipFee = 2e18;
        lifetimeMembershipFee = 25e17;
        tokenListingFee = 5e18;
        deprecatedMultisenderAddress=address(0xF521007C7845590C6c5ae46833DEFa0A68883CD4);
    }

    /**
     * Allows the owner of this contract to change the fees for users to become premium members.
     * 
     * @param _oneDayFee Fee for single day membership.
     * @param _sevenDayFee Fee for one week membership.
     * @param _oneMonthFee Fee for one month membership.
     * @param _lifetimeFee Fee for lifetime membership.
     * 
     * @return success True if the fee is changed successfully. False otherwise.
     * */
    function setMembershipFees(uint256 _oneDayFee, uint256 _sevenDayFee, uint256 _oneMonthFee, uint256 _lifetimeFee) public onlyOwner returns(bool success) {
        require(_oneDayFee>0 && _oneDayFee<_sevenDayFee && _sevenDayFee<_oneMonthFee && _oneMonthFee<_lifetimeFee);
        oneDayMembershipFee = _oneDayFee;
        sevenDayMembershipFee = _sevenDayFee;
        oneMonthMembershipFee = _oneMonthFee;
        lifetimeMembershipFee = _lifetimeFee;
        return true;
    }

    /**
     * Allows for the conversion of an unsigned integer to a string value. 
     * 
     * @param _i The value of the unsigned integer
     * 
     * @return _uintAsString The string value of the unsigned integer.
     * */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /**
    * Used to give change to users who accidentally send too much ETH to payable functions. 
    *
    * @param _price The service fee the user has to pay for function execution. 
    **/
    function giveChange(uint256 _price) internal {
        if(msg.value > _price) {
            uint256 change = msg.value - _price;
            payable(msg.sender).transfer(change);
        }
    }
    
    /**
    * Ensures that the correct affiliate code is used and also ensures that affiliate partners
    * are not able to 'jack' commissions from existing users who they are not affiliated with. 
    *
    * @param _afCode The affiliate code provided by the user.
    *
    * @return code The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory code) {
        if(stringsAreEqual(isAffiliatedWith[msg.sender], "void") || !isAffiliate[affiliateCodeToAddr[_afCode]]) {
            isAffiliatedWith[msg.sender] = "void";
            return "void";
        }
        if(!stringsAreEqual(_afCode, "") && stringsAreEqual(isAffiliatedWith[msg.sender],"") 
                                                                && affiliateCodeExists[_afCode]) {
            if(affiliateCodeToAddr[_afCode] == msg.sender) {
                return "void";
            }
            isAffiliatedWith[msg.sender] = _afCode;
        }
        if(stringsAreEqual(_afCode,"") && !stringsAreEqual(isAffiliatedWith[msg.sender],"")) {
            _afCode = isAffiliatedWith[msg.sender];
        } 
        if(stringsAreEqual(_afCode,"") || !affiliateCodeExists[_afCode]) {
            isAffiliatedWith[msg.sender] = "void";
            _afCode = "void";
        }
        return _afCode;
    }

    /**
     * Allows users to check if a user is a premium member or not. 
     * 
     * @param _addr The address of the user. 
     * 
     * @return isMember True if the user is a premium member, false otherwise.
     * */
    function checkIsPremiumMember(address _addr) public view returns(bool isMember) {
        return membershipExpiryTime[_addr] >= block.timestamp || isGrantedPremiumMember[_addr];
    }

    /**
    * Allows the owner of this contract to grant users with premium membership.
    *
    * @param _addr The address of the user who is being granted premium membership.
    *
    * @return success True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(checkIsPremiumMember(_addr) != true, "Is already premiumMember member");
        isGrantedPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }

    /**
    * Allows the owner of this contract to revoke a granted membership.
    *
    * @param _addr The address of the user whos membership is being revoked.
    *
    * @return success True if membership is revoked successfully. False otherwise. 
    **/
    function revokeGrantedPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(isGrantedPremiumMember[_addr], "Not a granted membership");
        isGrantedPremiumMember[_addr] = false;
        return true;
    }

    /**
     * Allows the owner of the contract to grant a premium membership discount for a specified user.
     * 
     * @param _addr The address of the user.
     * @param _discount The discount being granted.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setPremiumMembershipDiscount(address _addr, uint256 _discount) public onlyOwner returns(bool success) {
        premiumMembershipDiscount[_addr] = _discount;
        return true;
    }

    /**
     * Allows users to check VIP membership fees for a specific address. This is useful for validating if a discount
     * has been granted for the specified user. 
     * 
     * @param _addr The address of the user.
     * @param _fee The default fee. 
     * 
     * @return fee The membership fee for the specified user. 
     * 
     * */
    function getPremiumMembershipFeeOfUser(address _addr, uint256 _fee) public view returns(uint256 fee) {
        if(premiumMembershipDiscount[_addr] > 0) {
            return _fee * premiumMembershipDiscount[_addr] / 100;
        }
        return _fee;
    }



    /**
     * Allows the owner of the contract to set the contract address of the old multisender SC.
     * 
     * @param _addr The updated address.
     * */
    function setDeprecatedMultisenderAddress(address _addr) public onlyOwner {
        deprecatedMultisenderAddress = _addr;
    }


    /**
     * This function checks if a user address has a membership on the old SC.
     * 
     * @param _who The address of the user.
     * 
     * @return True if the user is a member on the old SC, false otherwise.
     * */
    function isMemberOfOldMultisender(address _who) public view returns(bool) {
        DeprecatedMultisenderSC oldMultisender = DeprecatedMultisenderSC(deprecatedMultisenderAddress);
        return oldMultisender.isPremiumMember(_who);
    }


    /**
     * Allows users to transfer their membership from the old SC to this SC. 
     * 
     * @return True if there is a membership to be transferred, false otherwise. 
     * */
    function transferMembership() public returns(bool) {
        require(isMemberOfOldMultisender(msg.sender), "No membership to transfer");
        membershipExpiryTime[msg.sender] = block.timestamp + (36500 * 1 days);
        return true;
    }
    

    /**
     * This function is invoked internally the functions for purchasing memberships.
     * 
     * @param _days The number of days that the membership will be valid for. 
     * @param _fee The fee that is to be paid. 
     * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
     * an affiliate code so the partner gets commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function assignMembership(uint256 _days, uint256 _fee, string memory _afCode) internal returns(bool success) {
        require(checkIsPremiumMember(msg.sender) != true, "Is already premiumMember member");
        uint256 fee = getPremiumMembershipFeeOfUser(msg.sender, _fee);
        require(
            msg.value >= fee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(fee), ". Not enough funds sent. ", uint2str(msg.value)
            ))
        );
        membershipExpiryTime[msg.sender] = block.timestamp + (_days * 1 days);
        _afCode = processAffiliateCode(_afCode);
        giveChange(fee);
        distributeCommission(fee, _afCode);
        emit NewPremiumMembership(msg.sender);
        return true; 
    }

    /**
    * Allows users to become lifetime members.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeLifetimeMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(36500, lifetimeMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 day.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneDayMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(1, oneDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 7 days.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneWeekMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(7, sevenDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 month
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneMonthMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(31, oneMonthMembershipFee, _afCode);
        return true;
    }


    /**
     * Allows users to check whether or not a token is listed.
     * 
     * @param _tokenAddr The address of the token to query.
     * 
     * @return isListed True if the token is listed, false otherwise. 
     * */
    function checkIsListedToken(address _tokenAddr) public view returns(bool isListed) {
        return isListedToken[_tokenAddr] || isGrantedListedToken[_tokenAddr];
    }


    /**
     * Allows the owner of the contract to set a listing discount for a specified token.
     * 
     * @param _tokenAddr The address of the token that will receive the discount. 
     * @param _discount The discount that will be applied. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFeeDiscount(address _tokenAddr, uint256 _discount) public onlyOwner returns(bool success) {
        tokenListingFeeDiscount[_tokenAddr] = _discount;
        return true;
    }

    /**
     * Allows users to query the listing fee for a token. This is useful to verify that a discount has been set. 
     * 
     * @param _tokenAddr The address of the token. 
     * 
     * @return fee The listing fee for the token. 
     * */
    function getListingFeeForToken(address _tokenAddr) public view returns(uint256 fee) {
        if(tokenListingFeeDiscount[_tokenAddr] > 0) {
            return tokenListingFee * tokenListingFeeDiscount[_tokenAddr] / 100;
        }
        return tokenListingFee;
    }

    /**
     * Allows users to list a token of their choosing. 
     * 
     * @param _tokenAddr The address of the token that will be listed. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function purchaseTokenListing(address _tokenAddr, string memory _afCode) public payable returns(bool success) {
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        _afCode = processAffiliateCode(_afCode);
        uint256 fee = getListingFeeForToken(_tokenAddr);
        require(msg.value >= fee, "Not enough funds sent for listing");
        isListedToken[_tokenAddr] = true;
        giveChange(fee);
        distributeCommission(fee, _afCode);
        return true;
    }

    /**
     * Allows the owner of the contract to revoke a granted token listing. 
     * 
     * @param _tokenAddr The address of the token that is being delisted. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function revokeGrantedTokenListing(address _tokenAddr) public onlyOwner returns(bool success) {
        require(checkIsListedToken(_tokenAddr), "Is not listed token");
        isGrantedListedToken[_tokenAddr] = false;
        return  true;
    }


    /**
     * Allows the owner of the contract to grant a token a free listing. 
     * 
     * @param _tokenAddr The address of the token being listed.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function grantTokenListing(address _tokenAddr) public onlyOwner returns(bool success){
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        isGrantedListedToken[_tokenAddr] = true;
        return true;
    }

    /**
     * Allows the owner of the contract to modify the token listing fee. 
     * 
     * @param _newFee The new fee for token listings. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFee(uint256 _newFee) public onlyOwner returns(bool success){
        tokenListingFee = _newFee;
        return true;
    }
    
    /**
    * Allows the owner of this contract to add an affiliate partner.
    *
    * @param _addr The address of the new affiliate partner.
    * @param _code The affiliate code.
    * 
    * @return success True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code, uint256 _percentage) public onlyOwner returns(bool success) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0), "0x00 address not allowed");
        require(!affiliateCodeExists[_code], "Affiliate code already exists!");
        require(_percentage <= 100 && _percentage > 0, "Percentage must be > 0 && <= 100");
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        commissionPercentage[_code] = _percentage;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }


    /**
     * Allows the owner of the contract to set a customised commission percentage for a given affiliate partner.
     * 
     * @param _addressOfAffiliate The wallet address of the affiliate partner.
     * @param _percentage The commission percentage the affiliate will receive.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function changeAffiliatePercentage(address _addressOfAffiliate, uint256 _percentage) public onlyOwner returns(bool success) { 
        require(isAffiliate[_addressOfAffiliate]);
        string storage affCode = affiliateCodeOfAddr[_addressOfAffiliate];
        commissionPercentage[affCode] = _percentage;
        return true;
    }

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return success True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool success) {
        require(isAffiliate[_addr]);
        isAffiliate[_addr] = false;
        affiliateCodeToAddr[affiliateCodeOfAddr[_addr]] = address(0);
        emit AffiliatePartnershipRevoked(_addr, affiliateCodeOfAddr[_addr]);
        affiliateCodeOfAddr[_addr] = "No longer an affiliate partner";
        return true;
    }
    
    /**
     * Checks whether or not an ERC20 token has used its free trial of 100 drops. This is a constant 
     * function which does not alter the state of the contract and therefore does not require any gas 
     * or a signature to be executed. 
     * 
     * @param _addressOfToken The address of the token being queried.
     * 
     * @return hasFreeTrial true if the token being queried has not used its 100 first free trial drops, false
     * otherwise.
     * */
    function tokenHasFreeTrial(address _addressOfToken) public view returns(bool hasFreeTrial) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }


    /**
     * Checks whether or not a user has a free trial. 
     * 
     * @param _addressOfUser The address of the user being queried.
     * 
     * @return hasFreeTrial true if the user address being queried has not used the first 100 free trial drops, false
     * otherwise.
     * */
    function userHasFreeTrial(address _addressOfUser) public view returns(bool hasFreeTrial) {
        return userTrialDrops[_addressOfUser] < 100;
    }
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a token.
     * */
    function getRemainingTokenTrialDrops(address _addressOfToken) public view returns(uint256 remainingTrialDrops) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - tokenTrialDrops[_addressOfToken];
        } 
        return 0;
    }

    /**
     * Checks how many remaining free trial drops a user has.
     * 
     * @param _addressOfUser the address of the user being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a user.
     * */
    function getRemainingUserTrialDrops(address _addressOfUser) public view returns(uint256 remainingTrialDrops) {
        if(userHasFreeTrial(_addressOfUser)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - userTrialDrops[_addressOfUser];
        }
        return 0;
    }
    
    /**
     * Allows for the price of drops to be changed by the owner of the contract. Any attempt made by 
     * any other account to invoke the function will result in a loss of gas and the price will remain 
     * untampered.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool success) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth / rate;
        return true;
    }
    
    /**
     * Allows for the allowance of a token from its owner to this contract to be queried. 
     * 
     * As part of the ERC20 standard all tokens which fall under this category have an allowance 
     * function which enables owners of tokens to allow (or give permission) to another address 
     * to spend tokens on behalf of the owner. This contract uses this as part of its protocol.
     * Users must first give permission to the contract to transfer tokens on their behalf, however,
     * this does not mean that the tokens will ever be transferrable without the permission of the 
     * owner. This is a security feature which was implemented on this contract. It is not possible
     * for the owner of this contract or anyone else to transfer the tokens which belong to others. 
     * 
     * @param _addr The address of the token's owner.
     * @param _addressOfToken The contract address of the ERC20 token.
     * 
     * @return allowance The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256 allowance) {
        ERC20Interface token = ERC20Interface(_addressOfToken);
        return token.allowance(_addr, address(this));
    }
    
    fallback() external payable {
        revert();
    }

    receive() external payable {
        revert();
    }
    
    /**
    * Checks if two strings are the same.
    *
    * @param _a String 1
    * @param _b String 2
    *
    * @return areEqual True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool areEqual) {
        bytes32 hashA = keccak256(abi.encodePacked(_a));
        bytes32 hashB = keccak256(abi.encodePacked(_b));
        return hashA == hashB;
    }
    
    /**
     * Allows for the distribution of Ether to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding amounts that the recipients will receive 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function airdropNativeCurrency(address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 totalEthValue = _totalToSend;
        uint256 price = _recipients.length * dropUnitPrice;
        uint256 totalCost = totalEthValue + price;
        bool userHasTrial = userHasFreeTrial(msg.sender);
        bool isVIP = checkIsPremiumMember(msg.sender) == true;
        require(
            msg.value >= totalCost || isVIP || userHasTrial, 
            "Not enough funds sent with transaction!"
        );
        _afCode = processAffiliateCode(_afCode);
        if(!isVIP && !userHasTrial) {
            distributeCommission(price, _afCode);
        }
        if((isVIP || userHasTrial) && msg.value > _totalToSend) {
            payable(msg.sender).transfer((msg.value) - _totalToSend);
        } else {
            giveChange(totalCost);
        }
        for(uint i = 0; i < _recipients.length; i++) {
            payable(_recipients[i]).transfer(_values[i]);
        }
        if(userHasTrial) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        emit EthAirdrop(msg.sender, _recipients.length, totalEthValue);
        return true;
    }

    /**
     * Allows for the distribution of an ERC20 token to be transferred to multiple recipients at 
     * a time. This function facilitates batch transfers of differing values (i.e., all recipients
     * can receive different amounts of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding values of tokens which each address will receive.
     * @param _optimized Should only be enabled for tokens with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */    
    function erc20Airdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, bool _isDeflationary, bool _optimized, string memory _afCode) public payable returns(bool success) {
        string memory afCode = processAffiliateCode(_afCode);
        ERC20Interface token = ERC20Interface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfToken);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfToken) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || userHasFreeTrial(msg.sender) || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }

        if(_optimized) {
            token.transferFrom(msg.sender, address(this), _totalToSend);
            token.gasOptimizedAirdrop(_recipients,_values);
        } else {
            if(!_isDeflationary) {
                token.transferFrom(msg.sender, address(this), _totalToSend);
                for(uint i = 0; i < _recipients.length; i++) {
                    token.transfer(_recipients[i], _values[i]);
                }
                if(token.balanceOf(address(this)) > 0) {
                    token.transfer(msg.sender,token.balanceOf(address(this)));
                }
            } else {
                for(uint i=0; i < _recipients.length; i++) {
                    token.transferFrom(msg.sender, _recipients[i], _values[i]);
                }
            }
        }

        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }


    /**
     * Allows for the distribution of ERC721 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC721 token collection.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _tokenIds The corresponding IDs of the NFT collection which each address will receive.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc721Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _tokenIds, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _tokenIds.length, "Total number of recipients and total number of NFT IDs are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC721Interface erc721 = ERC721Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc721.gasOptimizedAirdrop(msg.sender,_recipients,_tokenIds);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc721.transferFrom(msg.sender, _recipients[i], _tokenIds[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }

    /**
     * Allows for the distribution of ERC1155 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC1155 token contract.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _ids The corresponding IDs of the token collection which each address will receive.
     * @param _amounts The amount of tokens to send from each token type.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc1155Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _ids, uint256[] memory _amounts, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _ids.length, "Total number of recipients and total number of NFT IDs are not the same");
        require(_recipients.length == _amounts.length, "Total number of recipients and total number of amounts are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC1155Interface erc1155 = ERC1155Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc1155.gasOptimizedAirdrop(msg.sender,_recipients,_ids,_amounts);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc1155.safeTransferFrom(msg.sender, _recipients[i], _ids[i], _amounts[i], "");
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }


    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _profits, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 commission = _profits * commissionPercentage[_afCode] / 100;
            payable(owner).transfer(_profits - commission);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(_profits);
        }
    }


    /**
     * Allows the owner of the contract to withdraw any funds that may reside on the contract address.
     * */
    function withdrawFunds() public onlyOwner returns(bool success) {
        payable(owner).transfer(address(this).balance);
        return true;
    }

    /**
     * Allows for any ERC20 tokens which have been mistakenly  sent to this contract to be returned 
     * to the original sender by the owner of the contract. Any attempt made by any other account 
     * to invoke the function will result in a loss of gas and no tokens will be transferred out.
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipient The address which will receive tokens. 
     * @param _value The amount of tokens to refund.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool success){
        ERC20Interface token = ERC20Interface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"AffiliatePartnershipRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"sentTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethValue","type":"uint256"}],"name":"EthAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAffiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"NewAffiliatePartnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"premiumMember","type":"address"}],"name":"NewPremiumMembership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"NftAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalWei","type":"uint256"}],"name":"RefundIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"TokenAirdrop","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_code","type":"string"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateCodeOfAddr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeToAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"airdropNativeCurrency","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeLifetimeMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneDayMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneMonthMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneWeekMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfAffiliate","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"changeAffiliatePercentage","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"checkIsListedToken","outputs":[{"internalType":"bool","name":"isListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkIsPremiumMember","outputs":[{"internalType":"bool","name":"isMember","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"commissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deprecatedMultisenderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc1155Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"bool","name":"_isDeflationary","type":"bool"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc20Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc721Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getListingFeeForToken","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"getPremiumMembershipFeeOfUser","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTokenTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"getRemainingUserTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getTokenAllowance","outputs":[{"internalType":"uint256","name":"allowance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"grantTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliatedWith","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isMemberOfOldMultisender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"membershipExpiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonthMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"premiumMembershipDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"purchaseTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"revokeGrantedPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"revokeGrantedTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDeprecatedMultisenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneDayFee","type":"uint256"},{"internalType":"uint256","name":"_sevenDayFee","type":"uint256"},{"internalType":"uint256","name":"_oneMonthFee","type":"uint256"},{"internalType":"uint256","name":"_lifetimeFee","type":"uint256"}],"name":"setMembershipFees","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setPremiumMembershipDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTokenListingFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setTokenListingFeeDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sevenDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenListingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenListingFeeDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"userHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03199081163317909155610bb860145566012f2a36ecd555601555670c7d713b49da0000600f55671158e460913d0000601055671bc16d674ec800006011556722b1c8c1227a0000601255674563918244f400006013556016805490911673f521007c7845590c6c5ae46833defa0a68883cd4179055614287806100a16000396000f3fe60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122035c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a64736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122035c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a64736f6c634300080d0033

Deployed Bytecode Sourcemap

3411:37217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;27326:8;;;3411:37217;27264:8;;;16446:183;;;;;;:::i;:::-;;:::i;:::-;;;1454:14:1;;1447:22;1429:41;;1417:2;1402:18;16446:183:0;;;;;;;;3826:59;;;;;;;;;;-1:-1:-1;3826:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1996:25:1;;;1984:2;1969:18;3826:59:0;1850:177:1;19857:243:0;;;;;;;;;;-1:-1:-1;19857:243:0;;;;;:::i;:::-;;:::i;4245:55::-;;;;;;;;;;-1:-1:-1;4245:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:272;;;;;;;;;;-1:-1:-1;17876:272:0;;;;;:::i;:::-;;:::i;3709:55::-;;;;;;;;;;-1:-1:-1;3709:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9585:185;;;;;;;;;;-1:-1:-1;9585:185:0;;;;;:::i;:::-;;:::i;4479:30::-;;;;;;;;;;;;;;;;23463:155;;;;;;;;;;-1:-1:-1;23463:155:0;;;;;:::i;:::-;;:::i;39509:151::-;;;;;;;;;;;;;:::i;11786:261::-;;;;;;;;;;-1:-1:-1;11786:261:0;;;;;:::i;:::-;;:::i;4516:19::-;;;;;;;;;;;;;;;;4577:43;;;;;;;;;;-1:-1:-1;4577:43:0;;;;-1:-1:-1;;;;;4577:43:0;;;;;;-1:-1:-1;;;;;2455:32:1;;;2437:51;;2425:2;2410:18;4577:43:0;2291:203:1;25581:332:0;;;;;;;;;;-1:-1:-1;25581:332:0;;;;;:::i;:::-;;:::i;36666:2081::-;;;;;;:::i;:::-;;:::i;33922:1906::-;;;;;;:::i;:::-;;:::i;4436:36::-;;;;;;;;;;;;;;;;22559:405;;;;;;;;;;-1:-1:-1;22559:405:0;;;;;:::i;:::-;;:::i;4068:51::-;;;;;;;;;;-1:-1:-1;4068:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:61;;;;;;;;;;-1:-1:-1;3576:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;19339:249;;;;;;;;;;-1:-1:-1;19339:249:0;;;;;:::i;:::-;;:::i;15931:181::-;;;;;;:::i;:::-;;:::i;4126:54::-;;;;;;;;;;-1:-1:-1;4126:54:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30639:2515::-;;;;;;:::i;:::-;;:::i;3956:44::-;;;;;;;;;;-1:-1:-1;3956:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28351:1424;;;;;;:::i;:::-;;:::i;4007:54::-;;;;;;;;;;-1:-1:-1;4007:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4007:54:0;;;23929:151;;;;;;;;;;-1:-1:-1;23929:151:0;;;;;:::i;:::-;;:::i;3773:46::-;;;;;;;;;;-1:-1:-1;3773:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3459:51;;;;;;;;;;-1:-1:-1;3459:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;15419:178;;;;;;:::i;:::-;;:::i;21958:337::-;;;;;;;;;;-1:-1:-1;21958:337:0;;;;;:::i;:::-;;:::i;13045:246::-;;;;;;;;;;;;;:::i;12603:241::-;;;;;;;;;;-1:-1:-1;12603:241:0;;;;;:::i;:::-;;:::i;335:80::-;;;;;;;;;;-1:-1:-1;375:7:0;402:5;-1:-1:-1;;;;;402:5:0;335:80;;6248:483;;;;;;;;;;-1:-1:-1;6248:483:0;;;;;:::i;:::-;;:::i;3517:50::-;;;;;;;;;;-1:-1:-1;3517:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;20358:149;;;;;;;;;;-1:-1:-1;20358:149:0;;;;;:::i;:::-;;:::i;60:20::-;;;;;;;;;;-1:-1:-1;60:20:0;;;;-1:-1:-1;;;;;60:20:0;;;16874:170;;;;;;;;;;-1:-1:-1;16874:170:0;;;;;:::i;:::-;;:::i;24350:313::-;;;;;;;;;;-1:-1:-1;24350:313:0;;;;;:::i;:::-;;:::i;12226:128::-;;;;;;;;;;-1:-1:-1;12226:128:0;;;;;:::i;:::-;;:::i;:::-;;4542:28;;;;;;;;;;;;;;;;14900:186;;;;;;:::i;:::-;;:::i;17408:202::-;;;;;;;;;;-1:-1:-1;17408:202:0;;;;;:::i;:::-;;:::i;24925:306::-;;;;;;;;;;-1:-1:-1;24925:306:0;;;;;:::i;:::-;;:::i;4187:51::-;;;;;;;;;;-1:-1:-1;4187:51:0;;;;;:::i;:::-;;:::i;4350:36::-;;;;;;;;;;;;;;;;40281:342;;;;;;;;;;-1:-1:-1;40281:342:0;;;;;:::i;:::-;;:::i;3894:53::-;;;;;;;;;;-1:-1:-1;3894:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11219:196;;;;;;;;;;-1:-1:-1;11219:196:0;;;;;:::i;:::-;;:::i;10642:249::-;;;;;;;;;;-1:-1:-1;10642:249:0;;;;;:::i;:::-;;:::i;4393:36::-;;;;;;;;;;;;;;;;20816:738;;;;;;;;;;-1:-1:-1;20816:738:0;;;;;:::i;:::-;;:::i;4309:34::-;;;;;;;;;;;;;;;;26979:234;;;;;;;;;;-1:-1:-1;26979:234:0;;;;;:::i;:::-;;:::i;1033:256::-;;;;;;;;;;-1:-1:-1;1033:256:0;;;;;:::i;:::-;;:::i;3644:56::-;;;;;;;;;;-1:-1:-1;3644:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;18546:513;;;;;;:::i;:::-;;:::i;10069:297::-;;;;;;;;;;-1:-1:-1;10069:297:0;;;;;:::i;:::-;;:::i;16446:183::-;16522:12;16547:52;16564:2;16568:21;;16591:7;16547:16;:52::i;:::-;-1:-1:-1;16617:4:0;;16446:183;-1:-1:-1;;16446:183:0:o;19857:243::-;19929:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;;;;;;;;;19962:30:::1;19981:10;19962:18;:30::i;:::-;19961:31;19953:67;;;::::0;-1:-1:-1;;;19953:67:0;;11843:2:1;19953:67:0::1;::::0;::::1;11825:21:1::0;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;19953:67:0::1;11641:347:1::0;19953:67:0::1;-1:-1:-1::0;;;;;;20031:32:0;::::1;;::::0;;;:20:::1;:32;::::0;;;;:39;;-1:-1:-1;;20031:39:0::1;20066:4;20031:39:::0;;::::1;::::0;;;855:1:::1;19857:243:::0;;;:::o;17876:272::-;-1:-1:-1;;;;;17974:35:0;;17947:11;17974:35;;;:23;:35;;;;;;:39;17971:137;;-1:-1:-1;;;;;18055:35:0;;;;;;:23;:35;;;;;;18037:15;;18093:3;;18037:53;;;:::i;:::-;:59;;;;:::i;:::-;18030:66;17876:272;-1:-1:-1;;17876:272:0:o;17971:137::-;-1:-1:-1;;18125:15:0;;;17876:272::o;9585:185::-;-1:-1:-1;;;;;9683:27:0;;9650:13;9683:27;;;:20;:27;;;;;;9714:15;-1:-1:-1;9683:46:0;;:79;;-1:-1:-1;;;;;;;9733:29:0;;;;;:22;:29;;;;;;;;;9585:185::o;23463:155::-;-1:-1:-1;;;;;23572:32:0;23535:17;23572:32;;;:15;:32;;;;;;23607:3;-1:-1:-1;23572:38:0;23463:155::o;39509:151::-;39559:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;39592:5:::1;::::0;;39584:46:::1;::::0;-1:-1:-1;;;;;39592:5:0;;::::1;::::0;39608:21:::1;39584:46:::0;::::1;;;::::0;39608:21;;39584:46;39592:5;39584:46;39608:21;39592:5;39584:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39648:4;39641:11;;39509:151:::0;:::o;11786:261::-;-1:-1:-1;;;;;11901:32:0;;11874:11;11901:32;;;:25;:32;;;;;;:36;11898:120;;-1:-1:-1;;;;;11968:32:0;;;;;;:25;:32;;;;;;12003:3;;11961:39;;:4;:39;:::i;:::-;:45;;;;:::i;:::-;11954:52;;;;11898:120;-1:-1:-1;12035:4:0;11786:261;-1:-1:-1;11786:261:0:o;25581:332::-;25641:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;25700:4:::1;;25688:8;:16;;:46;;;;;25733:1;25722:8;:12;25688:46;25666:79;;;::::0;::::1;;25773:4;::::0;25761:27:::1;::::0;;12694:25:1;;;12750:2;12735:18;;12728:34;;;25761:27:0::1;::::0;12667:18:1;25761:27:0::1;;;;;;;25799:4;:15:::0;;;25839:7:::1;25873:10;25806:8:::0;25839:7;25873:10:::1;:::i;:::-;25857:13;:26:::0;-1:-1:-1;25901:4:0::1;::::0;25581:332;-1:-1:-1;;25581:332:0:o;36666:2081::-;36856:12;36911:4;:11;36889;:18;:33;36881:117;;;;-1:-1:-1;;;36881:117:0;;;;;;;:::i;:::-;37039:8;:15;37017:11;:18;:37;37009:121;;;;-1:-1:-1;;;37009:121:0;;13455:2:1;37009:121:0;;;13437:21:1;13494:2;13474:18;;;13467:30;13533:34;13513:18;;;13506:62;13604:34;13584:18;;;13577:62;-1:-1:-1;;;13655:19:1;;;13648:38;13703:19;;37009:121:0;13253:475:1;37009:121:0;37141:20;37164:29;37185:7;37164:20;:29::i;:::-;37310:13;;37289:18;;37141:52;;-1:-1:-1;37248:13:0;;37204:24;;37289:34;;;:::i;:::-;37273:50;;37334:22;37359:32;37380:10;37359:20;:32::i;:::-;:69;;;;37395:33;37414:13;37395:18;:33::i;:::-;37334:94;;37439:25;37467:32;37485:13;37467:17;:32::i;:::-;:64;;;;;37503:28;37520:10;37503:16;:28::i;:::-;37439:92;;37577:5;37564:9;:18;;:42;;;;37586:20;37564:42;:63;;;;37610:17;37564:63;37542:152;;;;-1:-1:-1;;;37542:152:0;;;;;;;:::i;:::-;37709:20;:41;;;;37733:17;37709:41;37708:60;;;;;37767:1;37755:9;:13;37708:60;37705:181;;;37785:39;;37793:10;;37814:9;37785:39;;;;;;;;;37814:9;37793:10;37785:39;;;;;;;;;;;;;;;;;;;;;37705:181;;;37857:17;37868:5;37857:10;:17::i;:::-;37899:10;37896:296;;;37925:65;;-1:-1:-1;;;37925:65:0;;-1:-1:-1;;;;;37925:27:0;;;;;:65;;37953:10;;37964:11;;37976:4;;37981:8;;37925:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37896:296;;;38027:6;38023:158;38043:11;:18;38039:1;:22;38023:158;;;38087:7;-1:-1:-1;;;;;38087:24:0;;38112:10;38124:11;38136:1;38124:14;;;;;;;;:::i;:::-;;;;;;;38140:4;38145:1;38140:7;;;;;;;;:::i;:::-;;;;;;;38149:8;38158:1;38149:11;;;;;;;;:::i;:::-;;;;;;;;;;;38087:78;;-1:-1:-1;;;;;;38087:78:0;;;;;;;-1:-1:-1;;;;;16303:15:1;;;38087:78:0;;;16285:34:1;16355:15;;;;16335:18;;;16328:43;16387:18;;;16380:34;16430:18;;;16423:34;16265:3;16473:19;;;16466:32;-1:-1:-1;16514:19:1;;;16507:30;16554:19;;38087:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38063:3;;;;;:::i;:::-;;;;38023:158;;;;37896:296;38205:32;38223:13;38205:17;:32::i;:::-;38202:148;;;38320:18;;-1:-1:-1;;;;;38287:30:0;;;;;;:15;:30;;;;;;:51;;38320:18;38287:51;:::i;:::-;-1:-1:-1;;;;;38254:30:0;;;;;;:15;:30;;;;;:84;38202:148;38363:28;38380:10;38363:16;:28::i;:::-;38360:136;;;38466:18;;38452:10;38437:26;;;;:14;:26;;;;;;:47;;38466:18;38437:47;:::i;:::-;38423:10;38408:26;;;;:14;:26;;;;;:76;38360:136;38510:20;38509:21;:43;;;;;38535:17;38534:18;38509:43;38506:139;;;38569:64;38611:13;;38590:11;:18;:34;;;;:::i;:::-;38626:6;38569:20;:64::i;:::-;38683:13;-1:-1:-1;;;;;38660:57:0;38671:10;-1:-1:-1;;;;;38660:57:0;;38698:11;:18;38660:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;38660:57:0;;;;;;;;-1:-1:-1;38735:4:0;;36666:2081;-1:-1:-1;;;;;;;;;;;36666:2081:0:o;33922:1906::-;34089:12;34144:9;:16;34122:11;:18;:38;34114:122;;;;-1:-1:-1;;;34114:122:0;;;;;;;:::i;:::-;34247:20;34270:29;34291:7;34270:20;:29::i;:::-;34413:13;;34392:18;;34247:52;;-1:-1:-1;34351:13:0;;34310:22;;34392:34;;;:::i;:::-;34376:50;;34437:22;34462:32;34483:10;34462:20;:32::i;:::-;:69;;;;34498:33;34517:13;34498:18;:33::i;:::-;34437:94;;34542:25;34570:32;34588:13;34570:17;:32::i;:::-;:64;;;;;34606:28;34623:10;34606:16;:28::i;:::-;34542:92;;34680:5;34667:9;:18;;:42;;;;34689:20;34667:42;:63;;;;34713:17;34667:63;34645:152;;;;-1:-1:-1;;;34645:152:0;;;;;;;:::i;:::-;34812:20;:41;;;;34836:17;34812:41;34811:60;;;;;34870:1;34858:9;:13;34811:60;34808:181;;;34888:39;;34896:10;;34917:9;34888:39;;;;;;;;;34917:9;34896:10;34888:39;;;;;;;;;;;;;;;;;;;;;34808:181;;;34960:17;34971:5;34960:10;:17::i;:::-;35002:10;34999:274;;;35028:60;;-1:-1:-1;;;35028:60:0;;-1:-1:-1;;;;;35028:26:0;;;;;:60;;35055:10;;35066:11;;35078:9;;35028:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34999:274;;;35125:6;35121:141;35141:11;:18;35137:1;:22;35121:141;;;35185:6;-1:-1:-1;;;;;35185:19:0;;35205:10;35217:11;35229:1;35217:14;;;;;;;;:::i;:::-;;;;;;;35233:9;35243:1;35233:12;;;;;;;;:::i;:::-;;;;;;;35185:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35161:3;;;;;:::i;:::-;;;;35121:141;;;;34999:274;35286:32;35304:13;35286:17;:32::i;:::-;35283:148;;;35401:18;;-1:-1:-1;;;;;35368:30:0;;;;;;:15;:30;;;;;;:51;;35401:18;35368:51;:::i;:::-;-1:-1:-1;;;;;35335:30:0;;;;;;:15;:30;;;;;:84;35283:148;35444:28;35461:10;35444:16;:28::i;:::-;35441:136;;;35547:18;;35533:10;35518:26;;;;:14;:26;;;;;;:47;;35547:18;35518:47;:::i;:::-;35504:10;35489:26;;;;:14;:26;;;;;:76;35441:136;35591:20;35590:21;:43;;;;;35616:17;35615:18;35590:43;35587:139;;;35650:64;35692:13;;35671:11;:18;:34;;;;:::i;35650:64::-;35764:13;-1:-1:-1;;;;;35741:57:0;35752:10;-1:-1:-1;;;;;35741:57:0;;35779:11;:18;35741:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;35741:57:0;;;;;;;;-1:-1:-1;35816:4:0;;33922:1906;-1:-1:-1;;;;;;;;;;33922:1906:0:o;22559:405::-;22624:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22657:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;22649:27;;;::::0;::::1;;-1:-1:-1::0;;;;;22687:18:0;::::1;22708:5;22687:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;22687:26:0::1;::::0;;22744:19:::1;:26:::0;;;;;;22724:47;;:19:::1;::::0;:47:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;22724:60:0::1;-1:-1:-1::0;;;;;22724:60:0;;::::1;;::::0;;22835:26;;::::1;-1:-1:-1::0;22835:26:0;;;:19:::1;:26:::0;;;;;22800:62:::1;::::0;::::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;22800:62:0;::::1;::::0;::::1;::::0;;;::::1;22873:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;22873:26:0;::::1;-1:-1:-1::0;22873:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;19339:249::-:0;19419:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;19452:30:::1;19471:10;19452:18;:30::i;:::-;19444:62;;;::::0;-1:-1:-1;;;19444:62:0;;19580:2:1;19444:62:0::1;::::0;::::1;19562:21:1::0;19619:2;19599:18;;;19592:30;-1:-1:-1;;;19638:18:1;;;19631:49;19697:18;;19444:62:0::1;19378:343:1::0;19444:62:0::1;-1:-1:-1::0;;;;;;19517:32:0::1;19552:5;19517:32:::0;;;:20:::1;:32;::::0;;;;:40;;-1:-1:-1;;19517:40:0::1;::::0;;-1:-1:-1;;19339:249:0:o;15931:181::-;16006:12;16031:51;16048:1;16051:21;;16074:7;16031:16;:51::i;4126:54::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30639:2515::-;30850:12;30875:20;30898:29;30919:7;30898:20;:29::i;:::-;31033:14;;31011:18;;30875:52;;-1:-1:-1;30976:15:0;;31011:36;31003:100;;;;-1:-1:-1;;;31003:100:0;;;;;;;:::i;:::-;31114:13;31151;;31130:11;:18;:34;;;;:::i;:::-;31114:50;;31175:22;31200:32;31221:10;31200:20;:32::i;:::-;:71;;;;31236:35;31255:15;31236:18;:35::i;:::-;31175:96;;31282:25;31310:34;31328:15;31310:17;:34::i;:::-;:66;;;;;31348:28;31365:10;31348:16;:28::i;:::-;31282:94;;31422:5;31409:9;:18;;:56;;;;31431:34;31449:15;31431:17;:34::i;:::-;31409:88;;;;31469:28;31486:10;31469:16;:28::i;:::-;31409:109;;;;31501:17;31409:109;31387:198;;;;-1:-1:-1;;;31387:198:0;;;;;;;:::i;:::-;31600:20;:41;;;;31624:17;31600:41;31599:60;;;;;31658:1;31646:9;:13;31599:60;31596:181;;;31676:39;;31684:10;;31705:9;31676:39;;;;;;;;;31705:9;31684:10;31676:39;;;;;;;;;;;;;;;;;;;;;31596:181;;;31748:17;31759:5;31748:10;:17::i;:::-;31792:10;31789:798;;;31819:59;;-1:-1:-1;;;31819:59:0;;-1:-1:-1;;;;;31819:18:0;;;;;:59;;31838:10;;31858:4;;31865:12;;31819:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31893:46:0;;-1:-1:-1;;;31893:46:0;;-1:-1:-1;;;;;31893:25:0;;;-1:-1:-1;31893:25:0;;-1:-1:-1;31893:46:0;;31919:11;;31931:7;;31893:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:798;;;31976:15;31972:604;;32012:59;;-1:-1:-1;;;32012:59:0;;-1:-1:-1;;;;;32012:18:0;;;;;:59;;32031:10;;32051:4;;32058:12;;32012:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32094:6;32090:130;32110:11;:18;32106:1;:22;32090:130;;;32158:5;-1:-1:-1;;;;;32158:14:0;;32173:11;32185:1;32173:14;;;;;;;;:::i;:::-;;;;;;;32189:7;32197:1;32189:10;;;;;;;;:::i;:::-;;;;;;;32158:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;20808:32:1;;;;20790:51;;20872:2;20857:18;;20850:34;20778:2;20763:18;;20616:274;32158:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32130:3:0;;;;:::i;:::-;;;;32090:130;;;-1:-1:-1;32241:30:0;;-1:-1:-1;;;32241:30:0;;32265:4;32241:30;;;2437:51:1;32274:1:0;;-1:-1:-1;;;;;32241:15:0;;;;;2410:18:1;;32241:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;32238:139;;;32326:30;;-1:-1:-1;;;32326:30:0;;32350:4;32326:30;;;2437:51:1;-1:-1:-1;;;;;32300:14:0;;;;;32315:10;;32300:14;;32326:15;;2410:18:1;;32326:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32300:57;;-1:-1:-1;;;;;;32300:57:0;;;;;;;-1:-1:-1;;;;;20808:32:1;;;32300:57:0;;;20790:51:1;20857:18;;;20850:34;20763:18;;32300:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32238:139;31972:604;;;32421:6;32417:144;32435:11;:18;32431:1;:22;32417:144;;;32483:5;-1:-1:-1;;;;;32483:18:0;;32502:10;32514:11;32526:1;32514:14;;;;;;;;:::i;:::-;;;;;;;32530:7;32538:1;32530:10;;;;;;;;:::i;:::-;;;;;;;32483:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32455:3;;;;;:::i;:::-;;;;32417:144;;;;31972:604;32602:34;32620:15;32602:17;:34::i;:::-;32599:154;;;32723:18;;-1:-1:-1;;;;;32688:32:0;;;;;;:15;:32;;;;;;:53;;32723:18;32688:53;:::i;:::-;-1:-1:-1;;;;;32653:32:0;;;;;;:15;:32;;;;;:88;32599:154;32766:28;32783:10;32766:16;:28::i;:::-;32763:136;;;32869:18;;32855:10;32840:26;;;;:14;:26;;;;;;:47;;32869:18;32840:47;:::i;:::-;32826:10;32811:26;;;;:14;:26;;;;;:76;32763:136;32913:20;32912:21;:43;;;;;32938:17;32937:18;32912:43;32909:139;;;32972:64;33014:13;;32993:11;:18;:34;;;;:::i;32972:64::-;33088:15;-1:-1:-1;;;;;33063:61:0;33076:10;-1:-1:-1;;;;;33063:61:0;;33105:11;:18;33063:61;;;;1996:25:1;;1984:2;1969:18;;1850:177;33063:61:0;;;;;;;;-1:-1:-1;33142:4:0;;30639:2515;-1:-1:-1;;;;;;;;;;;;30639:2515:0:o;28351:1424::-;28506:12;28561:7;:14;28539:11;:18;:36;28531:100;;;;-1:-1:-1;;;28531:100:0;;;;;;;:::i;:::-;28726:13;;28705:18;;28666:12;;28642:21;;28705:34;;28726:13;28705:34;:::i;:::-;28689:50;-1:-1:-1;28750:17:0;28770:21;28689:50;28770:13;:21;:::i;:::-;28750:41;;28802:17;28822:28;28839:10;28822:16;:28::i;:::-;28802:48;;28861:10;28874:32;28895:10;28874:20;:32::i;:::-;:40;;28910:4;28874:40;;;28861:53;;28960:9;28947;:22;;:31;;;;28973:5;28947:31;:47;;;;28982:12;28947:47;28925:137;;;;-1:-1:-1;;;28925:137:0;;;;;;;:::i;:::-;29083:29;29104:7;29083:20;:29::i;:::-;29073:39;;29127:5;29126:6;:23;;;;;29137:12;29136:13;29126:23;29123:91;;;29166:36;29187:5;29194:7;29166:20;:36::i;:::-;29228:5;:21;;;;29237:12;29228:21;29227:51;;;;;29266:12;29254:9;:24;29227:51;29224:193;;;29303:10;29295:56;29324:26;29338:12;29325:9;29324:26;:::i;:::-;29295:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29224:193;;;29384:21;29395:9;29384:10;:21::i;:::-;29431:6;29427:116;29447:11;:18;29443:1;:22;29427:116;;;29495:11;29507:1;29495:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29487:32:0;:44;29520:7;29528:1;29520:10;;;;;;;;:::i;:::-;;;;;;;29487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29467:3:0;;;;:::i;:::-;;;;29427:116;;;;29556:12;29553:120;;;29643:18;;29629:10;29614:26;;;;:14;:26;;;;;;:47;;29643:18;29614:47;:::i;:::-;29600:10;29585:26;;;;:14;:26;;;;;:76;29553:120;29711:18;;29688:57;;;12694:25:1;;;12750:2;12735:18;;12728:34;;;29699:10:0;;29688:57;;12667:18:1;29688:57:0;;;;;;;-1:-1:-1;29763:4:0;;28351:1424;-1:-1:-1;;;;;;;;;28351:1424:0:o;23929:151::-;-1:-1:-1;;;;;24036:30:0;23999:17;24036:30;;;:14;:30;;;;;;24069:3;-1:-1:-1;24036:36:0;23929:151::o;15419:178::-;15493:12;15518:49;15535:1;15538:19;;15559:7;15518:16;:49::i;21958:337::-;22068:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22102:32:0;::::1;;::::0;;;:11:::1;:32;::::0;;;;;::::1;;22094:41;;;::::0;::::1;;-1:-1:-1::0;;;;;22171:40:0;::::1;22146:22;22171:40:::0;;;:19:::1;:40;::::0;;;;;;22222:29;;22254:11;;22222:20:::1;::::0;:29:::1;::::0;22171:40;;22222:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:43;-1:-1:-1;22283:4:0::1;::::0;-1:-1:-1;21958:337:0;;;;:::o;13045:246::-;13090:4;13115:36;13140:10;13115:24;:36::i;:::-;13107:74;;;;-1:-1:-1;;;13107:74:0;;21872:2:1;13107:74:0;;;21854:21:1;21911:2;21891:18;;;21884:30;21950:27;21930:18;;;21923:55;21995:18;;13107:74:0;21670:349:1;13107:74:0;13227:34;:15;13246:14;13227:34;:::i;:::-;13213:10;13192:32;;;;:20;:32;;;;;:69;-1:-1:-1;13279:4:0;;13045:246::o;12603:241::-;12753:28;;12800:36;;-1:-1:-1;;;12800:36:0;;-1:-1:-1;;;;;2455:32:1;;;12800:36:0;;;2437:51:1;12671:4:0;;12753:28;;;;12800:30;;2410:18:1;;12800:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12793:43;12603:241;-1:-1:-1;;;12603:241:0:o;6248:483::-;6386:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;6430:1:::1;6419:10;:12;:39;;;;;6446:12;6435:10;:23;6419:39;:68;;;;;6475:12;6462;:25;6419:68;:97;;;;;6504:12;6491;:25;6419:97;6411:106;;;::::0;::::1;;-1:-1:-1::0;6528:19:0::1;:32:::0;;;;6571:21:::1;:36:::0;;;;6618:21:::1;:36:::0;6665:21:::1;:36:::0;6719:4:::1;::::0;6248:483::o;20358:149::-;20428:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;20452:15:0::1;:25:::0;20495:4:::1;::::0;20358:149::o;16874:170::-;-1:-1:-1;;;;;16975:25:0;;16942:13;16975:25;;;:13;:25;;;;;;;;;:61;;-1:-1:-1;;;;;;;17004:32:0;;;;;:20;:32;;;;;;;;;16874:170::o;24350:313::-;24432:27;24475:34;24493:15;24475:17;:34::i;:::-;24472:164;;;-1:-1:-1;;;;;24592:32:0;;24526:21;24592:32;;;:15;:32;;;;;;24551:3;;24576:48;;24551:3;24576:48;:::i;24472:164::-;-1:-1:-1;24654:1:0;;24350:313;-1:-1:-1;24350:313:0:o;12226:128::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;12310:28:::1;:36:::0;;-1:-1:-1;;;;;;12310:36:0::1;-1:-1:-1::0;;;;;12310:36:0;;;::::1;::::0;;;::::1;::::0;;12226:128::o;14900:186::-;14976:12;15001:55;15018:5;15025:21;;15048:7;15001:16;:55::i;17408:202::-;17508:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;17533:35:0;;;::::1;;::::0;;;:23:::1;:35;::::0;;;;:47;17598:4:::1;::::0;17408:202::o;24925:306::-;25005:27;25048:32;25065:14;25048:16;:32::i;:::-;25045:160;;;-1:-1:-1;;;;;25163:30:0;;25097:21;25163:30;;;:14;:30;;;;;;25122:3;;25147:46;;25122:3;25147:46;:::i;4187:51::-;;;;;;;;;;;;;;;;:::i;40281:342::-;40397:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;40486:34:::1;::::0;-1:-1:-1;;;40486:34:0;;-1:-1:-1;;;;;20808:32:1;;;40486:34:0::1;::::0;::::1;20790:51:1::0;20857:18;;;20850:34;;;40459:15:0;;40486:14;;::::1;::::0;::::1;::::0;20763:18:1;;40486:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40536:57;40557:15;40574:10;40586:6;40536:57;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40611:4:0::1;::::0;40281:342;-1:-1:-1;;;;40281:342:0:o;11219:196::-;11316:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;11341:32:0;;;::::1;;::::0;;;:25:::1;:32;::::0;;;;:44;11403:4:::1;::::0;11219:196::o;10642:249::-;10722:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10755:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;::::1;;10747:66;;;::::0;-1:-1:-1;;;10747:66:0;;22226:2:1;10747:66:0::1;::::0;::::1;22208:21:1::0;22265:2;22245:18;;;22238:30;22304:26;22284:18;;;22277:54;22348:18;;10747:66:0::1;22024:348:1::0;10747:66:0::1;-1:-1:-1::0;;;;;;10824:29:0::1;10856:5;10824:29:::0;;;:22:::1;:29;::::0;;;;:37;;-1:-1:-1;;10824:37:0::1;::::0;;-1:-1:-1;;10642:249:0:o;20816:738::-;20920:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20954:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;20953:19;20945:64;;;::::0;-1:-1:-1;;;20945:64:0;;22579:2:1;20945:64:0::1;::::0;::::1;22561:21:1::0;;;22598:18;;;22591:30;22657:34;22637:18;;;22630:62;22709:18;;20945:64:0::1;22377:356:1::0;20945:64:0::1;-1:-1:-1::0;;;;;21028:19:0;::::1;21020:56;;;::::0;-1:-1:-1;;;21020:56:0;;22940:2:1;21020:56:0::1;::::0;::::1;22922:21:1::0;22979:2;22959:18;;;22952:30;23018:26;22998:18;;;22991:54;23062:18;;21020:56:0::1;22738:348:1::0;21020:56:0::1;21096:19;21116:5;21096:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;21095:27;21087:70;;;::::0;-1:-1:-1;;;21087:70:0;;23574:2:1;21087:70:0::1;::::0;::::1;23556:21:1::0;23613:2;23593:18;;;23586:30;23652:32;23632:18;;;23625:60;23702:18;;21087:70:0::1;23372:354:1::0;21087:70:0::1;21191:3;21176:11;:18;;:37;;;;;21212:1;21198:11;:15;21176:37;21168:82;;;::::0;-1:-1:-1;;;21168:82:0;;23933:2:1;21168:82:0::1;::::0;::::1;23915:21:1::0;;;23952:18;;;23945:30;24011:34;23991:18;;;23984:62;24063:18;;21168:82:0::1;23731:356:1::0;21168:82:0::1;21290:4;21261:19;21281:5;21261:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:33;;;::::1;;-1:-1:-1::0;;21261:33:0;;::::1;;::::0;;-1:-1:-1;;;;;21305:18:0;::::1;21261:26;21305:18:::0;;;:11:::1;:18:::0;;;;:25;;;;::::1;21261:33:::0;21305:25:::1;::::0;;;21317:5;;21341:19:::1;::::0;:26:::1;::::0;21361:5;;21341:26:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;21341:34:0::1;-1:-1:-1::0;;;;;21341:34:0;;::::1;;::::0;;21386:26;;::::1;-1:-1:-1::0;21386:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;21461:11;21431:20;21452:5;21431:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;;;21488:36:::1;::::0;21518:5;;21488:36:::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;21488:36:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;21542:4:0::1;20816:738:::0;;;;;:::o;26979:234::-;27168:37;;-1:-1:-1;;;27168:37:0;;-1:-1:-1;;;;;24322:15:1;;;27168:37:0;;;24304:34:1;27199:4:0;24354:18:1;;;24347:43;27066:17:0;;27134:15;;27168;;;;;24239:18:1;;27168:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27161:44;26979:234;-1:-1:-1;;;;26979:234:0:o;1033:256::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1129:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;1182:5:0::1;::::0;-1:-1:-1;;;;;1169:18:0;;::::1;1182:5:::0;::::1;1169:18;;1129:58;1107:92;;;::::0;::::1;;1236:5;::::0;;1215:38:::1;::::0;-1:-1:-1;;;;;1215:38:0;;::::1;::::0;1236:5;::::1;::::0;1215:38:::1;::::0;::::1;1264:5;:17:::0;;-1:-1:-1;;;;;;1264:17:0::1;-1:-1:-1::0;;;;;1264:17:0;;;::::1;::::0;;;::::1;::::0;;1033:256::o;18546:513::-;18642:12;18676:30;18695:10;18676:18;:30::i;:::-;18675:31;18667:67;;;;-1:-1:-1;;;18667:67:0;;11843:2:1;18667:67:0;;;11825:21:1;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;18667:67:0;11641:347:1;18667:67:0;18755:29;18776:7;18755:20;:29::i;:::-;18745:39;;18795:11;18809:33;18831:10;18809:21;:33::i;:::-;18795:47;;18874:3;18861:9;:16;;18853:62;;;;-1:-1:-1;;;18853:62:0;;24603:2:1;18853:62:0;;;24585:21:1;24642:2;24622:18;;;24615:30;24681:34;24661:18;;;24654:62;-1:-1:-1;;;24732:18:1;;;24725:31;24773:19;;18853:62:0;24401:397:1;18853:62:0;-1:-1:-1;;;;;18926:25:0;;;;;;:13;:25;;;;;:32;;-1:-1:-1;;18926:32:0;18954:4;18926:32;;;18969:15;18980:3;18969:10;:15::i;:::-;18995:34;19016:3;19021:7;18995:20;:34::i;:::-;-1:-1:-1;19047:4:0;;18546:513;-1:-1:-1;;;18546:513:0:o;10069:297::-;10141:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;10174:27:::1;10195:5;10174:20;:27::i;:::-;:35;;10205:4;10174:35:::0;10166:79:::1;;;::::0;-1:-1:-1;;;10166:79:0;;25005:2:1;10166:79:0::1;::::0;::::1;24987:21:1::0;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;10166:79:0::1;24803:355:1::0;10166:79:0::1;-1:-1:-1::0;;;;;10256:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;:36;;-1:-1:-1;;10256:36:0::1;10288:4;10256:36;::::0;;10308:27;::::1;::::0;10256:29;10308:27:::1;-1:-1:-1::0;10353:4:0::1;10069:297:::0;;;:::o;13792:778::-;13887:12;13920:32;13941:10;13920:20;:32::i;:::-;:40;;13956:4;13920:40;13912:84;;;;-1:-1:-1;;;13912:84:0;;25005:2:1;13912:84:0;;;24987:21:1;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;13912:84:0;24803:355:1;13912:84:0;14007:11;14021:47;14051:10;14063:4;14021:29;:47::i;:::-;14007:61;;14114:3;14101:9;:16;;14200:13;14209:3;14200:8;:13::i;:::-;14244:19;14253:9;14244:8;:19::i;:::-;14139:139;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14079:211;;;;;-1:-1:-1;;;14079:211:0;;;;;;;;:::i;:::-;-1:-1:-1;14355:14:0;:5;14363:6;14355:14;:::i;:::-;14336:34;;:15;:34;:::i;:::-;14322:10;14301:32;;;;:20;:32;;;;;:69;14391:29;14412:7;14391:20;:29::i;:::-;14381:39;;14431:15;14442:3;14431:10;:15::i;:::-;14457:34;14478:3;14483:7;14457:20;:34::i;:::-;14507:32;;14528:10;;14507:32;;;;;-1:-1:-1;14557:4:0;;13792:778;-1:-1:-1;;;;13792:778:0:o;8315:1028::-;8452:10;8435:28;;;;:16;:28;;;;;8419:53;;8385:18;;8419:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8419:53:0;;;:15;:53::i;:::-;:99;;;;8477:11;:41;8489:19;8509:7;8489:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8489:28:0;8477:41;;;;;;;;;;-1:-1:-1;8477:41:0;;;;8476:42;8419:99;8416:196;;;8535:37;;;;;;;;;;;-1:-1:-1;;;8535:37:0;;;;;;;8552:10;-1:-1:-1;8535:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;8587:13:0;;;;;;;;;;;;-1:-1:-1;;;8587:13:0;;;;;8315:1028;-1:-1:-1;8315:1028:0:o;8416:196::-;8626:28;8642:7;8626:28;;;;;;;;;;;;:15;:28::i;:::-;8625:29;:81;;;;-1:-1:-1;8691:10:0;8674:28;;;;:16;:28;;;;;8658:48;;;;8674:28;8658:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;8625:179;;;;;8776:19;8796:7;8776:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8625:179;8622:358;;;8856:10;-1:-1:-1;;;;;8824:42:0;:19;8844:7;8824:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;8824:28:0;:42;8821:95;;-1:-1:-1;;8887:13:0;;;;;;;;;;;;-1:-1:-1;;;8887:13:0;;;;;8315:1028::o;8821:95::-;8947:10;8930:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;8622:358;8993:27;9009:7;8993:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;9058:10:0;9041:28;;;;:16;:28;;;;;9025:48;;;;9041:28;9025:48;;;:::i;:::-;9024:49;8993:80;8990:150;;;9117:10;9100:28;;;;:16;:28;;;;;9090:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:150;9154:27;9170:7;9154:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;9186:19;9206:7;9186:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9185:29;9154:60;9151:160;;;9231:37;;;;;;;;;;;-1:-1:-1;;;9231:37:0;;;;;;;9248:10;-1:-1:-1;9231:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;9283:16;;;;;;;;;;;;;-1:-1:-1;;;9283:16:0;;;;;9151:160;-1:-1:-1;9328:7:0;8315:1028::o;7760:199::-;7831:6;7819:9;:18;7816:136;;;7854:14;7871:18;7883:6;7871:9;:18;:::i;:::-;7904:36;;7854:35;;-1:-1:-1;7912:10:0;;7904:36;;;;;7854:35;;7904:36;;;;7854:35;7912:10;7904:36;;;;;;;;;;;;;;;;;;;;;7839:113;7816:136;7760:199;:::o;38825:550::-;38920:31;38936:7;38920:31;;;;;;;;;;;;;-1:-1:-1;;;38920:31:0;;;:15;:31::i;:::-;38919:32;:77;;;;;38955:11;:41;38967:19;38987:7;38967:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38967:28:0;38955:41;;;;;;;;;;-1:-1:-1;38955:41:0;;;;38919:77;38916:452;;;39013:18;39077:3;39045:20;39066:7;39045:29;;;;;;:::i;:::-;;;;;;;;;;;;;;39034:8;:40;;;;:::i;:::-;:46;;;;:::i;:::-;39103:5;;39013:67;;-1:-1:-1;;;;;;39103:5:0;39095:46;39119:21;39013:67;39119:8;:21;:::i;:::-;39095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:19;39184:7;39164:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;39164:28:0;;39156:58;;;;;39203:10;;39164:28;;;;39203:10;39164:28;39156:58;;;;;;;;;;;;;;;;;;;;;39249:19;39269:7;39249:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1996:25:1;;;-1:-1:-1;;;;;39249:28:0;;39234:56;;1969:18:1;39234:56:0;;;;;;;38998:304;38825:550;;:::o;38916:452::-;39331:5;;;39323:33;;-1:-1:-1;;;;;39331:5:0;;;;39323:33;;;;;39347:8;;39323:33;39331:5;39323:33;39347:8;39331:5;39323:33;;;;;;;;;;;;;;;;;;;6978:573;7028:27;7072:2;7078:1;7072:7;7068:50;;-1:-1:-1;;7096:10:0;;;;;;;;;;;;-1:-1:-1;;;7096:10:0;;;;;6978:573::o;7068:50::-;7137:2;7128:6;7169:69;7176:6;;7169:69;;7199:5;;;;:::i;:::-;;-1:-1:-1;7219:7:0;;-1:-1:-1;7224:2:0;7219:7;;:::i;:::-;;;7169:69;;;7248:17;7278:3;7268:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:14:0;-1:-1:-1;7248:34:0;-1:-1:-1;7302:3:0;7316:198;7323:7;;7316:198;;7351:3;7353:1;7351;:3;:::i;:::-;7347:7;-1:-1:-1;7369:10:0;7399:7;7404:2;7399;:7;:::i;:::-;:12;;7409:2;7399:12;:::i;:::-;7394:17;;:2;:17;:::i;:::-;7383:29;;:2;:29;:::i;:::-;7369:44;;7428:9;7447:4;7440:12;;7428:24;;7477:2;7467:4;7472:1;7467:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;7467:12:0;;;;;;;;-1:-1:-1;7494:8:0;7500:2;7494:8;;:::i;:::-;;;7332:182;;7316:198;;;-1:-1:-1;7538:4:0;6978:573;-1:-1:-1;;;;6978:573:0:o;27558:254::-;27641:13;27667;27710:2;27693:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;27683:31;;;;;;27667:47;;27725:13;27768:2;27751:20;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27751:20:0;;;;;;;;;27741:31;;27751:20;27741:31;;;;27790:14;;;;;27558:254;-1:-1:-1;;;;27558:254:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:531::-;469:5;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;576:6;563:20;602:18;598:2;595:26;592:52;;;624:18;;:::i;:::-;668:55;711:2;692:13;;-1:-1:-1;;688:27:1;717:4;684:38;668:55;:::i;:::-;748:2;739:7;732:19;794:3;787:4;782:2;774:6;770:15;766:26;763:35;760:55;;;811:1;808;801:12;760:55;876:2;869:4;861:6;857:17;850:4;841:7;837:18;824:55;924:1;899:16;;;917:4;895:27;888:38;;;;903:7;426:531;-1:-1:-1;;;426:531:1:o;962:322::-;1031:6;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;1173:18;1165:6;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1228;1270:7;1261:6;1250:9;1246:22;1228:50;:::i;1481:173::-;1549:20;;-1:-1:-1;;;;;1598:31:1;;1588:42;;1578:70;;1644:1;1641;1634:12;1659:186;1718:6;1771:2;1759:9;1750:7;1746:23;1742:32;1739:52;;;1787:1;1784;1777:12;1739:52;1810:29;1829:9;1810:29;:::i;2032:254::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;2276:2;2261:18;;;;2248:32;;-1:-1:-1;;;2032:254:1:o;2499:180::-;2558:6;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;-1:-1:-1;2650:23:1;;2499:180;-1:-1:-1;2499:180:1:o;2684:183::-;2744:4;2777:18;2769:6;2766:30;2763:56;;;2799:18;;:::i;:::-;-1:-1:-1;2844:1:1;2840:14;2856:4;2836:25;;2684:183::o;2872:668::-;2926:5;2979:3;2972:4;2964:6;2960:17;2956:27;2946:55;;2997:1;2994;2987:12;2946:55;3033:6;3020:20;3059:4;3083:60;3099:43;3139:2;3099:43;:::i;:::-;3083:60;:::i;:::-;3177:15;;;3263:1;3259:10;;;;3247:23;;3243:32;;;3208:12;;;;3287:15;;;3284:35;;;3315:1;3312;3305:12;3284:35;3351:2;3343:6;3339:15;3363:148;3379:6;3374:3;3371:15;3363:148;;;3445:23;3464:3;3445:23;:::i;:::-;3433:36;;3489:12;;;;3396;;3363:148;;;-1:-1:-1;3529:5:1;2872:668;-1:-1:-1;;;;;;2872:668:1:o;3545:662::-;3599:5;3652:3;3645:4;3637:6;3633:17;3629:27;3619:55;;3670:1;3667;3660:12;3619:55;3706:6;3693:20;3732:4;3756:60;3772:43;3812:2;3772:43;:::i;3756:60::-;3850:15;;;3936:1;3932:10;;;;3920:23;;3916:32;;;3881:12;;;;3960:15;;;3957:35;;;3988:1;3985;3978:12;3957:35;4024:2;4016:6;4012:15;4036:142;4052:6;4047:3;4044:15;4036:142;;;4118:17;;4106:30;;4156:12;;;;4069;;4036:142;;4212:118;4298:5;4291:13;4284:21;4277:5;4274:32;4264:60;;4320:1;4317;4310:12;4335:128;4400:20;;4429:28;4400:20;4429:28;:::i;4468:1166::-;4654:6;4662;4670;4678;4686;4694;4747:3;4735:9;4726:7;4722:23;4718:33;4715:53;;;4764:1;4761;4754:12;4715:53;4787:29;4806:9;4787:29;:::i;:::-;4777:39;;4867:2;4856:9;4852:18;4839:32;4890:18;4931:2;4923:6;4920:14;4917:34;;;4947:1;4944;4937:12;4917:34;4970:61;5023:7;5014:6;5003:9;4999:22;4970:61;:::i;:::-;4960:71;;5084:2;5073:9;5069:18;5056:32;5040:48;;5113:2;5103:8;5100:16;5097:36;;;5129:1;5126;5119:12;5097:36;5152:63;5207:7;5196:8;5185:9;5181:24;5152:63;:::i;:::-;5142:73;;5268:2;5257:9;5253:18;5240:32;5224:48;;5297:2;5287:8;5284:16;5281:36;;;5313:1;5310;5303:12;5281:36;5336:63;5391:7;5380:8;5369:9;5365:24;5336:63;:::i;:::-;5326:73;;5418:36;5449:3;5438:9;5434:19;5418:36;:::i;:::-;5408:46;;5507:3;5496:9;5492:19;5479:33;5463:49;;5537:2;5527:8;5524:16;5521:36;;;5553:1;5550;5543:12;5521:36;;5576:52;5620:7;5609:8;5598:9;5594:24;5576:52;:::i;:::-;5566:62;;;4468:1166;;;;;;;;:::o;5639:1000::-;5791:6;5799;5807;5815;5823;5876:3;5864:9;5855:7;5851:23;5847:33;5844:53;;;5893:1;5890;5883:12;5844:53;5916:29;5935:9;5916:29;:::i;:::-;5906:39;;5996:2;5985:9;5981:18;5968:32;6019:18;6060:2;6052:6;6049:14;6046:34;;;6076:1;6073;6066:12;6046:34;6099:61;6152:7;6143:6;6132:9;6128:22;6099:61;:::i;:::-;6089:71;;6213:2;6202:9;6198:18;6185:32;6169:48;;6242:2;6232:8;6229:16;6226:36;;;6258:1;6255;6248:12;6226:36;6281:63;6336:7;6325:8;6314:9;6310:24;6281:63;:::i;:::-;6271:73;;6394:2;6383:9;6379:18;6366:32;6353:45;;6407:28;6429:5;6407:28;:::i;:::-;6454:5;;-1:-1:-1;6512:3:1;6497:19;;6484:33;;6529:16;;;6526:36;;;6558:1;6555;6548:12;6526:36;;6581:52;6625:7;6614:8;6603:9;6599:24;6581:52;:::i;:::-;6571:62;;;5639:1000;;;;;;;;:::o;6644:258::-;6716:1;6726:113;6740:6;6737:1;6734:13;6726:113;;;6816:11;;;6810:18;6797:11;;;6790:39;6762:2;6755:10;6726:113;;;6857:6;6854:1;6851:13;6848:48;;;6892:1;6883:6;6878:3;6874:16;6867:27;6848:48;;6644:258;;;:::o;6907:383::-;7056:2;7045:9;7038:21;7019:4;7088:6;7082:13;7131:6;7126:2;7115:9;7111:18;7104:34;7147:66;7206:6;7201:2;7190:9;7186:18;7181:2;7173:6;7169:15;7147:66;:::i;:::-;7274:2;7253:15;-1:-1:-1;;7249:29:1;7234:45;;;;7281:2;7230:54;;6907:383;-1:-1:-1;;6907:383:1:o;7295:1205::-;7462:6;7470;7478;7486;7494;7502;7510;7563:3;7551:9;7542:7;7538:23;7534:33;7531:53;;;7580:1;7577;7570:12;7531:53;7603:29;7622:9;7603:29;:::i;:::-;7593:39;;7683:2;7672:9;7668:18;7655:32;7706:18;7747:2;7739:6;7736:14;7733:34;;;7763:1;7760;7753:12;7733:34;7786:61;7839:7;7830:6;7819:9;7815:22;7786:61;:::i;:::-;7776:71;;7900:2;7889:9;7885:18;7872:32;7856:48;;7929:2;7919:8;7916:16;7913:36;;;7945:1;7942;7935:12;7913:36;7968:63;8023:7;8012:8;8001:9;7997:24;7968:63;:::i;:::-;7958:73;;8078:2;8067:9;8063:18;8050:32;8040:42;;8132:3;8121:9;8117:19;8104:33;8091:46;;8146:28;8168:5;8146:28;:::i;:::-;8193:5;;-1:-1:-1;8250:3:1;8235:19;;8222:33;;8264:30;8222:33;8264:30;:::i;:::-;8313:7;;-1:-1:-1;8373:3:1;8358:19;;8345:33;;8390:16;;;8387:36;;;8419:1;8416;8409:12;8387:36;;8442:52;8486:7;8475:8;8464:9;8460:24;8442:52;:::i;:::-;8432:62;;;7295:1205;;;;;;;;;;:::o;8505:864::-;8651:6;8659;8667;8675;8728:3;8716:9;8707:7;8703:23;8699:33;8696:53;;;8745:1;8742;8735:12;8696:53;8785:9;8772:23;8814:18;8855:2;8847:6;8844:14;8841:34;;;8871:1;8868;8861:12;8841:34;8894:61;8947:7;8938:6;8927:9;8923:22;8894:61;:::i;:::-;8884:71;;9008:2;8997:9;8993:18;8980:32;8964:48;;9037:2;9027:8;9024:16;9021:36;;;9053:1;9050;9043:12;9021:36;9076:63;9131:7;9120:8;9109:9;9105:24;9076:63;:::i;:::-;9066:73;;9186:2;9175:9;9171:18;9158:32;9148:42;;9243:2;9232:9;9228:18;9215:32;9199:48;;9272:2;9262:8;9259:16;9256:36;;;9288:1;9285;9278:12;9256:36;;9311:52;9355:7;9344:8;9333:9;9329:24;9311:52;:::i;:::-;9301:62;;;8505:864;;;;;;;:::o;9374:385::-;9460:6;9468;9476;9484;9537:3;9525:9;9516:7;9512:23;9508:33;9505:53;;;9554:1;9551;9544:12;9505:53;-1:-1:-1;;9577:23:1;;;9647:2;9632:18;;9619:32;;-1:-1:-1;9698:2:1;9683:18;;9670:32;;9749:2;9734:18;9721:32;;-1:-1:-1;9374:385:1;-1:-1:-1;9374:385:1:o;9764:328::-;9841:6;9849;9857;9910:2;9898:9;9889:7;9885:23;9881:32;9878:52;;;9926:1;9923;9916:12;9878:52;9949:29;9968:9;9949:29;:::i;:::-;9939:39;;9997:38;10031:2;10020:9;10016:18;9997:38;:::i;:::-;9987:48;;10082:2;10071:9;10067:18;10054:32;10044:42;;9764:328;;;;;:::o;10097:464::-;10184:6;10192;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10292:29;10311:9;10292:29;:::i;:::-;10282:39;;10372:2;10361:9;10357:18;10344:32;10399:18;10391:6;10388:30;10385:50;;;10431:1;10428;10421:12;10385:50;10454;10496:7;10487:6;10476:9;10472:22;10454:50;:::i;:::-;10444:60;;;10551:2;10540:9;10536:18;10523:32;10513:42;;10097:464;;;;;:::o;10566:260::-;10634:6;10642;10695:2;10683:9;10674:7;10670:23;10666:32;10663:52;;;10711:1;10708;10701:12;10663:52;10734:29;10753:9;10734:29;:::i;:::-;10724:39;;10782:38;10816:2;10805:9;10801:18;10782:38;:::i;:::-;10772:48;;10566:260;;;;;:::o;10831:396::-;10909:6;10917;10970:2;10958:9;10949:7;10945:23;10941:32;10938:52;;;10986:1;10983;10976:12;10938:52;11009:29;11028:9;11009:29;:::i;:::-;10999:39;;11089:2;11078:9;11074:18;11061:32;11116:18;11108:6;11105:30;11102:50;;;11148:1;11145;11138:12;11102:50;11171;11213:7;11204:6;11193:9;11189:22;11171:50;:::i;:::-;11161:60;;;10831:396;;;;;:::o;11232:404::-;11434:2;11416:21;;;11473:2;11453:18;;;11446:30;11512:34;11507:2;11492:18;;11485:62;-1:-1:-1;;;11578:2:1;11563:18;;11556:38;11626:3;11611:19;;11232:404::o;11993:127::-;12054:10;12049:3;12045:20;12042:1;12035:31;12085:4;12082:1;12075:15;12109:4;12106:1;12099:15;12125:168;12165:7;12231:1;12227;12223:6;12219:14;12216:1;12213:21;12208:1;12201:9;12194:17;12190:45;12187:71;;;12238:18;;:::i;:::-;-1:-1:-1;12278:9:1;;12125:168::o;12298:217::-;12338:1;12364;12354:132;;12408:10;12403:3;12399:20;12396:1;12389:31;12443:4;12440:1;12433:15;12471:4;12468:1;12461:15;12354:132;-1:-1:-1;12500:9:1;;12298:217::o;12773:475::-;12975:2;12957:21;;;13014:2;12994:18;;;12987:30;13053:34;13048:2;13033:18;;13026:62;13124:34;13119:2;13104:18;;13097:62;-1:-1:-1;;;13190:3:1;13175:19;;13168:38;13238:3;13223:19;;12773:475::o;13733:403::-;13935:2;13917:21;;;13974:2;13954:18;;;13947:30;14013:34;14008:2;13993:18;;13986:62;-1:-1:-1;;;14079:2:1;14064:18;;14057:37;14126:3;14111:19;;13733:403::o;14141:461::-;14194:3;14232:5;14226:12;14259:6;14254:3;14247:19;14285:4;14314:2;14309:3;14305:12;14298:19;;14351:2;14344:5;14340:14;14372:1;14382:195;14396:6;14393:1;14390:13;14382:195;;;14461:13;;-1:-1:-1;;;;;14457:39:1;14445:52;;14517:12;;;;14552:15;;;;14493:1;14411:9;14382:195;;;-1:-1:-1;14593:3:1;;14141:461;-1:-1:-1;;;;;14141:461:1:o;14607:435::-;14660:3;14698:5;14692:12;14725:6;14720:3;14713:19;14751:4;14780:2;14775:3;14771:12;14764:19;;14817:2;14810:5;14806:14;14838:1;14848:169;14862:6;14859:1;14856:13;14848:169;;;14923:13;;14911:26;;14957:12;;;;14992:15;;;;14884:1;14877:9;14848:169;;15047:768;-1:-1:-1;;;;;15410:32:1;;15392:51;;15479:3;15474:2;15459:18;;15452:31;;;-1:-1:-1;;15506:57:1;;15543:19;;15535:6;15506:57;:::i;:::-;15611:9;15603:6;15599:22;15594:2;15583:9;15579:18;15572:50;15645:44;15682:6;15674;15645:44;:::i;:::-;15631:58;;15737:9;15729:6;15725:22;15720:2;15709:9;15705:18;15698:50;15765:44;15802:6;15794;15765:44;:::i;:::-;15757:52;15047:768;-1:-1:-1;;;;;;;15047:768:1:o;15820:127::-;15881:10;15876:3;15872:20;15869:1;15862:31;15912:4;15909:1;15902:15;15936:4;15933:1;15926:15;16584:135;16623:3;16644:17;;;16641:43;;16664:18;;:::i;:::-;-1:-1:-1;16711:1:1;16700:13;;16584:135::o;16724:128::-;16764:3;16795:1;16791:6;16788:1;16785:13;16782:39;;;16801:18;;:::i;:::-;-1:-1:-1;16837:9:1;;16724:128::o;16857:562::-;-1:-1:-1;;;;;17142:32:1;;17124:51;;17211:2;17206;17191:18;;17184:30;;;-1:-1:-1;;17237:56:1;;17274:18;;17266:6;17237:56;:::i;:::-;17341:9;17333:6;17329:22;17324:2;17313:9;17309:18;17302:50;17369:44;17406:6;17398;17369:44;:::i;:::-;17361:52;16857:562;-1:-1:-1;;;;;;16857:562:1:o;17424:375::-;-1:-1:-1;;;;;17682:15:1;;;17664:34;;17734:15;;;;17729:2;17714:18;;17707:43;17781:2;17766:18;;17759:34;;;;17614:2;17599:18;;17424:375::o;17804:380::-;17883:1;17879:12;;;;17926;;;17947:61;;18001:4;17993:6;17989:17;17979:27;;17947:61;18054:2;18046:6;18043:14;18023:18;18020:38;18017:161;;18100:10;18095:3;18091:20;18088:1;18081:31;18135:4;18132:1;18125:15;18163:4;18160:1;18153:15;18189:982;18274:12;;18239:3;;18329:1;18349:18;;;;18402;;;;18429:61;;18483:4;18475:6;18471:17;18461:27;;18429:61;18509:2;18557;18549:6;18546:14;18526:18;18523:38;18520:161;;18603:10;18598:3;18594:20;18591:1;18584:31;18638:4;18635:1;18628:15;18666:4;18663:1;18656:15;18520:161;18697:18;18724:104;;;;18842:1;18837:328;;;;18690:475;;18724:104;-1:-1:-1;;18757:24:1;;18745:37;;18802:16;;;;-1:-1:-1;18724:104:1;;18837:328;18868:5;18865:1;18858:16;18915:2;18912:1;18902:16;18940:1;18954:165;18968:6;18965:1;18962:13;18954:165;;;19046:14;;19033:11;;;19026:35;19089:16;;;;18983:10;;18954:165;;;18958:3;;19148:6;19143:3;19139:16;19132:23;;18690:475;;;;;;;18189:982;;;;:::o;19176:197::-;19304:3;19329:38;19363:3;19355:6;19329:38;:::i;19726:415::-;19928:2;19910:21;;;19967:2;19947:18;;;19940:30;20006:34;20001:2;19986:18;;19979:62;-1:-1:-1;;;20072:2:1;20057:18;;20050:49;20131:3;20116:19;;19726:415::o;20146:465::-;20403:2;20392:9;20385:21;20366:4;20429:56;20481:2;20470:9;20466:18;20458:6;20429:56;:::i;:::-;20533:9;20525:6;20521:22;20516:2;20505:9;20501:18;20494:50;20561:44;20598:6;20590;20561:44;:::i;:::-;20553:52;20146:465;-1:-1:-1;;;;;20146:465:1:o;20895:245::-;20962:6;21015:2;21003:9;20994:7;20990:23;20986:32;20983:52;;;21031:1;21028;21021:12;20983:52;21063:9;21057:16;21082:28;21104:5;21082:28;:::i;21145:184::-;21215:6;21268:2;21256:9;21247:7;21243:23;21239:32;21236:52;;;21284:1;21281;21274:12;21236:52;-1:-1:-1;21307:16:1;;21145:184;-1:-1:-1;21145:184:1:o;21334:125::-;21374:4;21402:1;21399;21396:8;21393:34;;;21407:18;;:::i;:::-;-1:-1:-1;21444:9:1;;21334:125::o;23091:276::-;23222:3;23260:6;23254:13;23276:53;23322:6;23317:3;23310:4;23302:6;23298:17;23276:53;:::i;:::-;23345:16;;;;;23091:276;-1:-1:-1;;23091:276:1:o;25163:793::-;-1:-1:-1;;;25569:3:1;25562:37;25544:3;25628:6;25622:13;25644:62;25699:6;25694:2;25689:3;25685:12;25678:4;25670:6;25666:17;25644:62;:::i;:::-;25770:27;25765:2;25725:16;;;25757:11;;;25750:48;25823:13;;25845:63;25823:13;25894:2;25886:11;;25879:4;25867:17;;25845:63;:::i;:::-;25928:17;25947:2;25924:26;;25163:793;-1:-1:-1;;;;25163:793:1:o;25961:204::-;25999:3;26035:4;26032:1;26028:12;26067:4;26064:1;26060:12;26102:3;26096:4;26092:14;26087:3;26084:23;26081:49;;;26110:18;;:::i;:::-;26146:13;;25961:204;-1:-1:-1;;;25961:204:1:o

Swarm Source

ipfs://35c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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