ETH Price: $3,494.90 (-0.24%)
Gas: 2 Gwei

Contract

0xc06926e80a7Bf49B1363B93C88d70CaCb1F8CEc9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040110700612020-10-17 0:01:491373 days ago1602892909IN
 Create: Mystic
0 ETH0.1251412723.36

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Mystic

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-17
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.6.12;

interface IERC20 { // brief interface for erc20 token tx
    function balanceOf(address account) external view returns (uint256);
    
    function transfer(address recipient, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface IWETH { // brief interface for canonical ether token wrapper 
    function deposit() external payable;
    
    function transfer(address dst, uint wad) external returns (bool);
}

library Address { // helper for address type - see openzeppelin-contracts/blob/master/contracts/utils/Address.sol
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
}

library SafeERC20 { // wrapper around erc20 token tx for non-standard contract - see openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

   function _callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        (bool success, bytes memory returnData) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returnData.length > 0) { // return data is optional
            require(abi.decode(returnData, (bool)), "SafeERC20: erc20 operation did not succeed");
        }
    }
}

library SafeMath { // arithmetic wrapper for unit under/overflow check
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0);
        uint256 c = a / b;

        return c;
    }
}

contract ReentrancyGuard { // call wrapper for reentrancy check
    bool private _notEntered;

    function _initReentrancyGuard () internal {
        _notEntered = true;
    }

    modifier nonReentrant() {
        require(_notEntered, "reentrant");

        _notEntered = false;

        _;

        _notEntered = true;
    }
}

contract Mystic is ReentrancyGuard { 
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    /***************
    GLOBAL CONSTANTS
    ***************/
    address public depositToken; // deposit token contract reference - default = wETH
    address public stakeToken; // stake token contract reference for guild voting shares 
    address public constant wETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // canonical ether token wrapper contract reference 
    
    uint256 public proposalDeposit; // default = 10 deposit token 
    uint256 public processingReward; // default = 0.1 - amount of deposit token to give to whoever processes a proposal
    uint256 public periodDuration; // default = 17280 = 4.8 hours in seconds (5 periods per day)
    uint256 public votingPeriodLength; // default = 35 periods (7 days)
    uint256 public gracePeriodLength; // default = 35 periods (7 days)
    uint256 public dilutionBound; // default = 3 - maximum multiplier a YES voter will be obligated to pay in case of mass ragequit
    uint256 public summoningTime; // needed to determine the current period
    bool private initialized; // internally tracks token deployment under eip-1167 proxy pattern
    
    // HARD-CODED LIMITS
    // These numbers are quite arbitrary; they are small enough to avoid overflows when doing calculations
    // with periods or shares, yet big enough to not limit reasonable use cases.
    uint256 constant MAX_GUILD_BOUND = 10**36; // maximum bound for guild accounting
    uint256 constant MAX_TOKEN_WHITELIST_COUNT = 400; // maximum number of whitelisted tokens
    uint256 constant MAX_TOKEN_GUILDBANK_COUNT = 200; // maximum number of tokens with non-zero balance in guildbank

    // GUILD TOKEN DETAILS
    uint8 public constant decimals = 18;
    string public constant name = "MYSTIC DAO";
    string public constant symbol = "MXDAO";

    // **************
    // EVENT TRACKING
    // **************
    event SubmitProposal(address indexed applicant, uint256 sharesRequested, uint256 lootRequested, uint256 tributeOffered, address tributeToken, uint256 paymentRequested, address paymentToken, bytes32 details, uint8[7] flags, bytes data, uint256 proposalId, address indexed delegateKey, address indexed memberAddress);
    event CancelProposal(uint256 indexed proposalId, address applicantAddress);
    event SponsorProposal(address indexed delegateKey, address indexed memberAddress, uint256 proposalId, uint256 proposalIndex, uint256 startingPeriod);
    event SubmitVote(uint256 proposalId, uint256 indexed proposalIndex, address indexed delegateKey, address indexed memberAddress, uint8 uintVote);
    event ProcessProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessActionProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessWhitelistProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessGuildKickProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event UpdateDelegateKey(address indexed memberAddress, address newDelegateKey);
    event Approval(address indexed owner, address indexed spender, uint256 amount); // guild token (loot) allowance tracking
    event Transfer(address indexed sender, address indexed recipient, uint256 amount); // guild token mint, burn & (loot) transfer tracking
    event Ragequit(address indexed memberAddress, uint256 sharesToBurn, uint256 lootToBurn);
    event TokensCollected(address indexed token, uint256 amountToCollect);
    event Withdraw(address indexed memberAddress, address token, uint256 amount);
    event ClaimShares(address indexed memberAddress, uint256 amount);
    event ConvertSharesToLoot(address indexed memberAddress, uint256 amount);
    
    // *******************
    // INTERNAL ACCOUNTING
    // *******************
    address public constant GUILD = address(0xdead);
    address public constant ESCROW = address(0xdeaf);
    address public constant TOTAL = address(0xdeed);
    
    uint256 public proposalCount; // total proposals submitted
    uint256 public totalShares; // total shares across all members
    uint256 public totalLoot; // total loot across all members
    uint256 public totalGuildBankTokens; // total tokens with non-zero balance in guild bank

    mapping(uint256 => bytes) public actions; // proposalId => action data
    mapping(address => uint256) public balanceOf; // guild token balances
    mapping(address => mapping(address => uint256)) public allowance; // guild token (loot) allowances
    mapping(address => mapping(address => uint256)) private userTokenBalances; // userTokenBalances[userAddress][tokenAddress]

    enum Vote {
        Null, // default value, counted as abstention
        Yes,
        No
    }
    
    struct Member {
        address delegateKey; // the key responsible for submitting proposals & voting - defaults to member address unless updated
        uint8 exists; // always true (1) once a member has been created
        uint256 shares; // the # of voting shares assigned to this member
        uint256 loot; // the loot amount available to this member (combined with shares on ragekick) - transferable by guild token
        uint256 highestIndexYesVote; // highest proposal index # on which the member voted YES
        uint256 jailed; // set to proposalIndex of a passing guild kick proposal for this member, prevents voting on & sponsoring proposals
    }
    
    struct Proposal {
        address applicant; // the applicant who wishes to become a member - this key will be used for withdrawals (doubles as target for alt. proposals)
        address proposer; // the account that submitted the proposal (can be non-member)
        address sponsor; // the member that sponsored the proposal (moving it into the queue)
        address tributeToken; // tribute token contract reference
        address paymentToken; // payment token contract reference
        uint8[7] flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action]
        uint256 sharesRequested; // the # of shares the applicant is requesting
        uint256 lootRequested; // the amount of loot the applicant is requesting
        uint256 paymentRequested; // amount of tokens requested as payment
        uint256 tributeOffered; // amount of tokens offered as tribute
        uint256 startingPeriod; // the period in which voting can start for this proposal
        uint256 yesVotes; // the total number of YES votes for this proposal
        uint256 noVotes; // the total number of NO votes for this proposal
        uint256 maxTotalSharesAndLootAtYesVote; // the maximum # of total shares encountered at a yes vote on this proposal
        bytes32 details; // proposal details to add context for members 
        mapping(address => Vote) votesByMember; // the votes on this proposal by each member
    }
    
    address[] public approvedTokens;
    mapping(address => bool) public tokenWhitelist;
    
    uint256[] public proposalQueue;
    mapping(uint256 => Proposal) public proposals;

    mapping(address => bool) public proposedToWhitelist;
    mapping(address => bool) public proposedToKick;
    
    mapping(address => Member) public members;
    mapping(address => address) public memberAddressByDelegateKey;
    
    modifier onlyDelegate {
        require(members[memberAddressByDelegateKey[msg.sender]].shares > 0, "!delegate");
        _;
    }

    function init(
        address _depositToken,
        address _stakeToken,
        address[] calldata _summoner,
        uint256[] calldata _summonerShares,
        uint256 _summonerDeposit,
        uint256 _proposalDeposit,
        uint256 _processingReward,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _dilutionBound
    ) external {
        require(!initialized, "initialized");
        require(_depositToken != _stakeToken, "depositToken = stakeToken");
        require(_summoner.length == _summonerShares.length, "summoner != summonerShares");
        require(_proposalDeposit >= _processingReward, "_processingReward > _proposalDeposit");
        
        for (uint256 i = 0; i < _summoner.length; i++) {
            registerMember(_summoner[i], _summonerShares[i]);
            mintGuildToken(_summoner[i], _summonerShares[i]);
            totalShares = totalShares.add(_summonerShares[i]);
        }
        
        require(totalShares <= MAX_GUILD_BOUND, "guild maxed");
        
        tokenWhitelist[_depositToken] = true;
        approvedTokens.push(_depositToken);
        
        if (_summonerDeposit > 0) {
            totalGuildBankTokens += 1;
            unsafeAddToBalance(GUILD, _depositToken, _summonerDeposit);
        }
        
        depositToken = _depositToken;
        stakeToken = _stakeToken;
        proposalDeposit = _proposalDeposit;
        processingReward = _processingReward;
        periodDuration = _periodDuration;
        votingPeriodLength = _votingPeriodLength;
        gracePeriodLength = _gracePeriodLength;
        dilutionBound = _dilutionBound;
        summoningTime = now;
        initialized = true;
        _initReentrancyGuard();
    }
    
    /*****************
    PROPOSAL FUNCTIONS
    *****************/
    function submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        bytes32 details
    ) external nonReentrant payable returns (uint256 proposalId) {
        require(sharesRequested.add(lootRequested) <= MAX_GUILD_BOUND, "guild maxed");
        require(tokenWhitelist[tributeToken], "tributeToken != whitelist");
        require(tokenWhitelist[paymentToken], "paymentToken != whitelist");
        require(applicant != GUILD && applicant != ESCROW && applicant != TOTAL, "applicant unreservable");
        require(members[applicant].jailed == 0, "applicant jailed");

        if (tributeOffered > 0 && userTokenBalances[GUILD][tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, "guildbank maxed");
        }
        
        // collect tribute from proposer & store it in the Mystic until the proposal is processed - if ether, wrap into wETH
        if (tributeToken == wETH && msg.value > 0) {
            require(msg.value == tributeOffered, "!ethBalance");
            IWETH(wETH).deposit();
            (bool success, ) = wETH.call{value: msg.value}("");
            require(success, "!ethCall");
            IWETH(wETH).transfer(address(this), msg.value);
        } else {
            IERC20(tributeToken).safeTransferFrom(msg.sender, address(this), tributeOffered);
        }
        
        unsafeAddToBalance(ESCROW, tributeToken, tributeOffered);

        uint8[7] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action]

        _submitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, "");
        
        return proposalCount - 1; // return proposalId - contracts calling submit might want it
    }
    
    function submitActionProposal( // stages arbitrary function calls for member vote - based on Raid Guild 'Minion'
        address actionTo,
        address actionToken,
        uint256 actionTokenAmount,
        uint256 actionValue,
        bytes32 details,
        bytes calldata data
    ) external returns (uint256 proposalId) {
        
        uint8[7] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action]
        flags[6] = 1; // guild action
        
        _submitProposal(actionTo, 0, 0, actionValue, address(0), actionTokenAmount, actionToken, details, flags, data);
        
        return proposalCount - 1;
    }
    
    function submitWhitelistProposal(address tokenToWhitelist, bytes32 details) external returns (uint256 proposalId) {
        require(tokenToWhitelist != address(0), "!token");
        require(tokenToWhitelist != stakeToken, "tokenToWhitelist = stakeToken");
        require(!tokenWhitelist[tokenToWhitelist], "whitelisted");
        require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "whitelist maxed");

        uint8[7] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action]
        flags[4] = 1; // whitelist

        _submitProposal(address(0), 0, 0, 0, tokenToWhitelist, 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
    
    function submitGuildKickProposal(address memberToKick, bytes32 details) external returns (uint256 proposalId) {
        Member memory member = members[memberToKick];

        require(member.shares > 0 || member.loot > 0, "!share||loot");
        require(members[memberToKick].jailed == 0, "jailed");

        uint8[7] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action]
        flags[5] = 1; // guild kick

        _submitProposal(memberToKick, 0, 0, 0, address(0), 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
    
    function _submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        bytes32 details,
        uint8[7] memory flags,
        bytes memory data
    ) internal {
        Proposal memory proposal = Proposal({
            applicant : applicant,
            proposer : msg.sender,
            sponsor : address(0),
            tributeToken : tributeToken,
            paymentToken : paymentToken,
            flags : flags,
            sharesRequested : sharesRequested,
            lootRequested : lootRequested,
            paymentRequested : paymentRequested,
            tributeOffered : tributeOffered,
            startingPeriod : 0,
            yesVotes : 0,
            noVotes : 0,
            maxTotalSharesAndLootAtYesVote : 0,
            details : details
        });
        
        if (proposal.flags[6] == 1) {
            actions[proposalCount] = data;
        }
        
        proposals[proposalCount] = proposal;
        address memberAddress = memberAddressByDelegateKey[msg.sender];
        // NOTE: argument order matters, avoid stack too deep
        emit SubmitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, data, proposalCount, msg.sender, memberAddress);
        
        proposalCount += 1;
    }

    function sponsorProposal(uint256 proposalId) external nonReentrant onlyDelegate {
        // collect proposal deposit from sponsor & store it in the Mystic until the proposal is processed
        IERC20(depositToken).safeTransferFrom(msg.sender, address(this), proposalDeposit);
        unsafeAddToBalance(ESCROW, depositToken, proposalDeposit);

        Proposal storage proposal = proposals[proposalId];

        require(proposal.proposer != address(0), "!proposed");
        require(proposal.flags[0] == 0, "sponsored");
        require(proposal.flags[3] == 0, "cancelled");
        require(members[proposal.applicant].jailed == 0, "applicant jailed");

        if (proposal.tributeOffered > 0 && userTokenBalances[GUILD][proposal.tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, "guildbank maxed");
        }

        // whitelist proposal
        if (proposal.flags[4] == 1) {
            require(!tokenWhitelist[address(proposal.tributeToken)], "whitelisted");
            require(!proposedToWhitelist[address(proposal.tributeToken)], "whitelist proposed");
            require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "whitelist maxed");
            proposedToWhitelist[address(proposal.tributeToken)] = true;

        // guild kick proposal
        } else if (proposal.flags[5] == 1) {
            require(!proposedToKick[proposal.applicant], "kick proposed");
            proposedToKick[proposal.applicant] = true;
        }

        // compute startingPeriod for proposal
        uint256 startingPeriod = max(
            getCurrentPeriod(),
            proposalQueue.length == 0 ? 0 : proposals[proposalQueue[proposalQueue.length - 1]].startingPeriod
        ) + 1;

        proposal.startingPeriod = startingPeriod;

        address memberAddress = memberAddressByDelegateKey[msg.sender];
        proposal.sponsor = memberAddress;

        proposal.flags[0] = 1; // sponsored

        // append proposal to the queue
        proposalQueue.push(proposalId);
        
        emit SponsorProposal(msg.sender, memberAddress, proposalId, proposalQueue.length - 1, startingPeriod);
    }

    // NOTE: In Mystic, proposalIndex != proposalId
    function submitVote(uint256 proposalIndex, uint8 uintVote) external nonReentrant onlyDelegate {
        address memberAddress = memberAddressByDelegateKey[msg.sender];
        Member storage member = members[memberAddress];

        require(proposalIndex < proposalQueue.length, "!proposed");
        Proposal storage proposal = proposals[proposalQueue[proposalIndex]];

        require(uintVote < 3, "!<3");
        Vote vote = Vote(uintVote);

        require(getCurrentPeriod() >= proposal.startingPeriod, "pending");
        require(!hasVotingPeriodExpired(proposal.startingPeriod), "expired");
        require(proposal.votesByMember[memberAddress] == Vote.Null, "voted");
        require(vote == Vote.Yes || vote == Vote.No, "!Yes||No");

        proposal.votesByMember[memberAddress] = vote;

        if (vote == Vote.Yes) {
            proposal.yesVotes += member.shares;

            // set highest index (latest) yes vote - must be processed for member to ragequit
            if (proposalIndex > member.highestIndexYesVote) {
                member.highestIndexYesVote = proposalIndex;
            }

            // set maximum of total shares encountered at a yes vote - used to bound dilution for yes voters
            if (totalSupply() > proposal.maxTotalSharesAndLootAtYesVote) {
                proposal.maxTotalSharesAndLootAtYesVote = totalSupply();
            }

        } else if (vote == Vote.No) {
            proposal.noVotes += member.shares;
        }
     
        // NOTE: subgraph indexes by proposalId not proposalIndex since proposalIndex isn't set until it's been sponsored but proposal is created on submission
        emit SubmitVote(proposalQueue[proposalIndex], proposalIndex, msg.sender, memberAddress, uintVote);
    }

    function processProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);

        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];

        require(proposal.flags[4] == 0 && proposal.flags[5] == 0 && proposal.flags[6] == 0, "!standard");

        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);

        // Make the proposal fail if the new total number of shares & loot exceeds the limit
        if (totalSupply().add(proposal.sharesRequested).add(proposal.lootRequested) > MAX_GUILD_BOUND) {
            didPass = false;
        }

        // Make the proposal fail if it is requesting more tokens as payment than the available guild bank balance
        if (proposal.paymentRequested > userTokenBalances[GUILD][proposal.paymentToken]) {
            didPass = false;
        }

        // Make the proposal fail if it would result in too many tokens with non-zero balance in guild bank
        if (proposal.tributeOffered > 0 && userTokenBalances[GUILD][proposal.tributeToken] == 0 && totalGuildBankTokens >= MAX_TOKEN_GUILDBANK_COUNT) {
            didPass = false;
        }

        // PROPOSAL PASSED
        if (didPass) {
            proposal.flags[2] = 1; // didPass

            // if the applicant is already a member, add to their existing shares & loot
            if (members[proposal.applicant].exists == 1) {
                members[proposal.applicant].shares = members[proposal.applicant].shares.add(proposal.sharesRequested);
                members[proposal.applicant].loot = members[proposal.applicant].loot.add(proposal.lootRequested);

            // if the applicant is a new member, create a new record for them
            } else {
                registerMember(proposal.applicant, proposal.sharesRequested);
            }

            // mint new guild token, shares & loot 
            mintGuildToken(proposal.applicant, proposal.sharesRequested.add(proposal.lootRequested));
            totalShares = totalShares.add(proposal.sharesRequested);
            totalLoot = totalLoot.add(proposal.lootRequested);

            // if the proposal tribute is the first token of its kind to make it into the guild bank, increment total guild bank tokens
            if (userTokenBalances[GUILD][proposal.tributeToken] == 0 && proposal.tributeOffered > 0) {
                totalGuildBankTokens += 1;
            }

            unsafeInternalTransfer(ESCROW, GUILD, proposal.tributeToken, proposal.tributeOffered);
            unsafeInternalTransfer(GUILD, proposal.applicant, proposal.paymentToken, proposal.paymentRequested);

            // if the proposal spends 100% of guild bank balance for a token, decrement total guild bank tokens
            if (userTokenBalances[GUILD][proposal.paymentToken] == 0 && proposal.paymentRequested > 0) {
                totalGuildBankTokens -= 1;
            }

        // PROPOSAL FAILED
        } else {
            // return all tokens to the proposer (not the applicant, because funds come from proposer)
            unsafeInternalTransfer(ESCROW, proposal.proposer, proposal.tributeToken, proposal.tributeOffered);
        }

        _returnDeposit(proposal.sponsor);
        
        emit ProcessProposal(proposalIndex, proposalId, didPass);
    }
    
    function processActionProposal(uint256 proposalIndex) external nonReentrant returns (bool, bytes memory) {
        _validateProposalForProcessing(proposalIndex);
        
        uint256 proposalId = proposalQueue[proposalIndex];
        bytes storage action = actions[proposalId];
        Proposal storage proposal = proposals[proposalId];
        
        require(proposal.flags[6] == 1, "!action");

        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);
        
        // Make the proposal fail if it is requesting more stake tokens than the available local balance
        if (proposal.paymentToken == stakeToken && proposal.paymentRequested > IERC20(stakeToken).balanceOf(address(this))) {
            didPass = false;
        }
        
        // Make the proposal fail if it is requesting more tokens than the available guild bank balance
        if (tokenWhitelist[proposal.paymentToken] && proposal.paymentRequested > userTokenBalances[GUILD][proposal.paymentToken]) {
            didPass = false;
        }
        
        // Make the proposal fail if it is requesting more ether than the available local balance
        if (proposal.tributeOffered > address(this).balance) {
            didPass = false;
        }

        if (didPass) {
            proposal.flags[2] = 1; // didPass
            (bool success, bytes memory returnData) = proposal.applicant.call{value: proposal.tributeOffered}(action);
            if (tokenWhitelist[proposal.paymentToken]) {
                unsafeSubtractFromBalance(GUILD, proposal.paymentToken, proposal.paymentRequested);
                // if the action proposal spends 100% of guild bank balance for a token, decrement total guild bank tokens
                if (userTokenBalances[GUILD][proposal.paymentToken] == 0 && proposal.paymentRequested > 0) {totalGuildBankTokens -= 1;}
            }
            return (success, returnData);
        }
        
        emit ProcessActionProposal(proposalIndex, proposalId, didPass);
    }

    function processWhitelistProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);

        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];

        require(proposal.flags[4] == 1, "!whitelist");

        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);

        if (approvedTokens.length >= MAX_TOKEN_WHITELIST_COUNT) {
            didPass = false;
        }

        if (didPass) {
            proposal.flags[2] = 1; // didPass
            tokenWhitelist[address(proposal.tributeToken)] = true;
            approvedTokens.push(proposal.tributeToken);
        }

        proposedToWhitelist[address(proposal.tributeToken)] = false;

        _returnDeposit(proposal.sponsor);
        
        emit ProcessWhitelistProposal(proposalIndex, proposalId, didPass);
    }

    function processGuildKickProposal(uint256 proposalIndex) external nonReentrant {
        _validateProposalForProcessing(proposalIndex);

        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];

        require(proposal.flags[5] == 1, "!kick");

        proposal.flags[1] = 1; // processed

        bool didPass = _didPass(proposalIndex);

        if (didPass) {
            proposal.flags[2] = 1; // didPass
            Member storage member = members[proposal.applicant];
            member.jailed = proposalIndex;

            // transfer shares to loot
            member.loot = member.loot.add(member.shares);
            totalShares = totalShares.sub(member.shares);
            totalLoot = totalLoot.add(member.shares);
            member.shares = 0; // revoke all shares
        }

        proposedToKick[proposal.applicant] = false;

        _returnDeposit(proposal.sponsor);
        
        emit ProcessGuildKickProposal(proposalIndex, proposalId, didPass);
    }

    function _didPass(uint256 proposalIndex) internal view returns (bool didPass) {
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];
        
        if (proposal.yesVotes > proposal.noVotes) {
            didPass = true;
        }
        
        // Make the proposal fail if the dilutionBound is exceeded
        if ((totalSupply().mul(dilutionBound)) < proposal.maxTotalSharesAndLootAtYesVote) {
            didPass = false;
        }

        // Make the proposal fail if the applicant is jailed
        // - for standard proposals, we don't want the applicant to get any shares/loot/payment
        // - for guild kick proposals, we should never be able to propose to kick a jailed member (or have two kick proposals active), so it doesn't matter
        if (members[proposal.applicant].jailed != 0) {
            didPass = false;
        }

        return didPass;
    }

    function _validateProposalForProcessing(uint256 proposalIndex) internal view {
        require(proposalIndex < proposalQueue.length, "!proposal");
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];

        require(getCurrentPeriod() >= proposal.startingPeriod.add(votingPeriodLength).add(gracePeriodLength), "!ready");
        require(proposal.flags[1] == 0, "processed");
        require(proposalIndex == 0 || proposals[proposalQueue[proposalIndex - 1]].flags[1] == 1, "prior !processed");
    }

    function _returnDeposit(address sponsor) internal {
        unsafeInternalTransfer(ESCROW, msg.sender, depositToken, processingReward);
        unsafeInternalTransfer(ESCROW, sponsor, depositToken, proposalDeposit - processingReward);
    }

    function ragequit(uint256 sharesToBurn, uint256 lootToBurn) external nonReentrant {
        require(members[msg.sender].exists == 1, "!member");
        
        _ragequit(msg.sender, sharesToBurn, lootToBurn);
    }

    function _ragequit(address memberAddress, uint256 sharesToBurn, uint256 lootToBurn) internal {
        uint256 initialTotalSharesAndLoot = totalSupply();

        Member storage member = members[memberAddress];

        require(member.shares >= sharesToBurn, "!shares");
        require(member.loot >= lootToBurn, "!loot");
        require(canRagequit(member.highestIndexYesVote), "!ragequit until highest index proposal member voted YES processes");

        uint256 sharesAndLootToBurn = sharesToBurn.add(lootToBurn);

        // burn guild token, shares & loot
        burnGuildToken(memberAddress, sharesAndLootToBurn);
        member.shares = member.shares.sub(sharesToBurn);
        member.loot = member.loot.sub(lootToBurn);
        totalShares = totalShares.sub(sharesToBurn);
        totalLoot = totalLoot.sub(lootToBurn);

        for (uint256 i = 0; i < approvedTokens.length; i++) {
            uint256 amountToRagequit = fairShare(userTokenBalances[GUILD][approvedTokens[i]], sharesAndLootToBurn, initialTotalSharesAndLoot);
            if (amountToRagequit > 0) { // gas optimization to allow a higher maximum token limit
                // deliberately not using safemath here to keep overflows from preventing the function execution (which would break ragekicks)
                // if a token overflows, it is because the supply was artificially inflated to oblivion, so we probably don't care about it anyways
                userTokenBalances[GUILD][approvedTokens[i]] -= amountToRagequit;
                userTokenBalances[memberAddress][approvedTokens[i]] += amountToRagequit;
            }
        }

        emit Ragequit(memberAddress, sharesToBurn, lootToBurn);
    }

    function ragekick(address memberToKick) external nonReentrant onlyDelegate {
        Member storage member = members[memberToKick];

        require(member.jailed != 0, "!jailed");
        require(member.loot > 0, "!loot"); // note - should be impossible for jailed member to have shares
        require(canRagequit(member.highestIndexYesVote), "!ragequit until highest index proposal member voted YES processes");

        _ragequit(memberToKick, 0, member.loot);
    }
    
    function withdrawBalance(address token, uint256 amount) external nonReentrant {
        _withdrawBalance(token, amount);
    }

    function withdrawBalances(address[] calldata tokens, uint256[] calldata amounts, bool max) external nonReentrant {
        require(tokens.length == amounts.length, "tokens != amounts");

        for (uint256 i=0; i < tokens.length; i++) {
            uint256 withdrawAmount = amounts[i];
            if (max) { // withdraw the maximum balance
                withdrawAmount = userTokenBalances[msg.sender][tokens[i]];
            }

            _withdrawBalance(tokens[i], withdrawAmount);
        }
    }
    
    function _withdrawBalance(address token, uint256 amount) internal {
        require(userTokenBalances[msg.sender][token] >= amount, "!balance");
        
        IERC20(token).safeTransfer(msg.sender, amount);
        unsafeSubtractFromBalance(msg.sender, token, amount);
        
        emit Withdraw(msg.sender, token, amount);
    }

    function collectTokens(address token) external nonReentrant onlyDelegate {
        uint256 amountToCollect = IERC20(token).balanceOf(address(this)).sub(userTokenBalances[TOTAL][token]);
        // only collect if 1) there are tokens to collect & 2) token is whitelisted
        require(amountToCollect > 0, "!amount");
        require(tokenWhitelist[token], "!whitelisted");
        
        if (userTokenBalances[GUILD][token] == 0 && totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT) {totalGuildBankTokens += 1;}
        unsafeAddToBalance(GUILD, token, amountToCollect);

        emit TokensCollected(token, amountToCollect);
    }

    // NOTE: requires that delegate key which sent the original proposal cancels, msg.sender = proposal.proposer
    function cancelProposal(uint256 proposalId) external nonReentrant {
        Proposal storage proposal = proposals[proposalId];
        require(proposal.flags[0] == 0, "sponsored");
        require(proposal.flags[3] == 0, "cancelled");
        require(msg.sender == proposal.proposer, "!proposer");

        proposal.flags[3] = 1; // cancelled
        
        unsafeInternalTransfer(ESCROW, proposal.proposer, proposal.tributeToken, proposal.tributeOffered);
        
        emit CancelProposal(proposalId, msg.sender);
    }

    function updateDelegateKey(address newDelegateKey) external nonReentrant {
        require(members[msg.sender].shares > 0, "caller !shareholder");
        require(newDelegateKey != address(0), "newDelegateKey = 0");

        // skip checks if member is setting the delegate key to their member address
        if (newDelegateKey != msg.sender) {
            require(members[newDelegateKey].exists == 0, "!overwrite members");
            require(members[memberAddressByDelegateKey[newDelegateKey]].exists == 0, "!overwrite keys");
        }

        Member storage member = members[msg.sender];
        memberAddressByDelegateKey[member.delegateKey] = address(0);
        memberAddressByDelegateKey[newDelegateKey] = msg.sender;
        member.delegateKey = newDelegateKey;

        emit UpdateDelegateKey(msg.sender, newDelegateKey);
    }
    
    // can only ragequit if the latest proposal you voted YES on has been processed
    function canRagequit(uint256 highestIndexYesVote) public view returns (bool) {
        require(highestIndexYesVote < proposalQueue.length, "!proposal");
        
        return proposals[proposalQueue[highestIndexYesVote]].flags[1] == 1;
    }

    function hasVotingPeriodExpired(uint256 startingPeriod) public view returns (bool) {
        return getCurrentPeriod() >= startingPeriod.add(votingPeriodLength);
    }
    
    /***************
    GETTER FUNCTIONS
    ***************/
    function max(uint256 x, uint256 y) internal pure returns (uint256) {
        return x >= y ? x : y;
    }
    
    function getCurrentPeriod() public view returns (uint256) {
        return now.sub(summoningTime).div(periodDuration);
    }
    
    function getMemberProposalVote(address memberAddress, uint256 proposalIndex) external view returns (Vote) {
        require(members[memberAddress].exists == 1, "!member");
        require(proposalIndex < proposalQueue.length, "!proposed");
        
        return proposals[proposalQueue[proposalIndex]].votesByMember[memberAddress];
    }

    function getProposalFlags(uint256 proposalId) external view returns (uint8[7] memory) {
        return proposals[proposalId].flags;
    }
    
    function getProposalQueueLength() external view returns (uint256) {
        return proposalQueue.length;
    }
    
    function getTokenCount() external view returns (uint256) {
        return approvedTokens.length;
    }

    function getUserTokenBalance(address user, address token) external view returns (uint256) {
        return userTokenBalances[user][token];
    }
    
    /***************
    HELPER FUNCTIONS
    ***************/
    receive() external payable {}
    
    function fairShare(uint256 balance, uint256 shares, uint256 totalSharesAndLoot) internal pure returns (uint256) {
        require(totalSharesAndLoot != 0);

        if (balance == 0) { return 0; }

        uint256 prod = balance * shares;

        if (prod / balance == shares) { // no overflow in multiplication above?
            return prod / totalSharesAndLoot;
        }

        return (balance / totalSharesAndLoot) * shares;
    }
    
    function registerMember(address newMember, uint256 shares) internal {
        // if new member is already taken by a member's delegateKey, reset it to their member address
        if (members[memberAddressByDelegateKey[newMember]].exists == 1) {
            address memberToOverride = memberAddressByDelegateKey[newMember];
            memberAddressByDelegateKey[memberToOverride] = memberToOverride;
            members[memberToOverride].delegateKey = memberToOverride;
        }
        
        members[newMember] = Member({
            delegateKey : newMember,
            exists : 1, // 'true'
            shares : shares,
            loot : 0,
            highestIndexYesVote : 0,
            jailed : 0
        });

        memberAddressByDelegateKey[newMember] = newMember;
    }
    
    function unsafeAddToBalance(address user, address token, uint256 amount) internal {
        userTokenBalances[user][token] += amount;
        userTokenBalances[TOTAL][token] += amount;
    }
    
    function unsafeInternalTransfer(address from, address to, address token, uint256 amount) internal {
        unsafeSubtractFromBalance(from, token, amount);
        unsafeAddToBalance(to, token, amount);
    }

    function unsafeSubtractFromBalance(address user, address token, uint256 amount) internal {
        userTokenBalances[user][token] -= amount;
        userTokenBalances[TOTAL][token] -= amount;
    }
    
    /********************
    GUILD TOKEN FUNCTIONS
    ********************/
    function approve(address spender, uint256 amount) external returns (bool) {
        require(amount == 0 || allowance[msg.sender][spender] == 0);
        
        allowance[msg.sender][spender] = amount;
        
        emit Approval(msg.sender, spender, amount);
        
        return true;
    }
    
    function burnGuildToken(address memberAddress, uint256 amount) internal {
        balanceOf[memberAddress] = balanceOf[memberAddress].sub(amount);
        emit Transfer(memberAddress, address(0), amount);
    }
    
    function claimShares(uint256 amount) external nonReentrant {
        IERC20(stakeToken).safeTransferFrom(msg.sender, address(this), amount); // deposit stake token & claim shares (1:1)
        
        // if the sender is already a member, add to their existing shares 
        if (members[msg.sender].exists == 1) {
            members[msg.sender].shares = members[msg.sender].shares.add(amount);

        // if the sender is a new member, create a new record for them
        } else {
            registerMember(msg.sender, amount);
        }

        // mint new guild token & shares 
        mintGuildToken(msg.sender, amount);
        totalShares = totalShares.add(amount);
            
        require(totalShares <= MAX_GUILD_BOUND, "guild maxed");
        
        emit ClaimShares(msg.sender, amount);
    }
    
    function convertSharesToLoot(uint256 sharesToLoot) external nonReentrant {
        members[msg.sender].shares = members[msg.sender].shares.sub(sharesToLoot);
        members[msg.sender].loot = members[msg.sender].loot.add(sharesToLoot);
        
        totalShares = totalShares.sub(sharesToLoot);
        totalLoot = totalLoot.add(sharesToLoot);
        
        emit ConvertSharesToLoot(msg.sender, sharesToLoot);
    }
    
    function mintGuildToken(address memberAddress, uint256 amount) internal {
        balanceOf[memberAddress] = balanceOf[memberAddress].add(amount);
        emit Transfer(address(0), memberAddress, amount);
    }
    
    function totalSupply() public view returns (uint256) { 
        return totalShares.add(totalLoot);
    }

    function transfer(address recipient, uint256 lootToTransfer) external returns (bool) {
        members[msg.sender].loot = members[msg.sender].loot.sub(lootToTransfer);
        members[recipient].loot = members[recipient].loot.add(lootToTransfer);
        
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(lootToTransfer);
        balanceOf[recipient] = balanceOf[recipient].add(lootToTransfer);
        
        emit Transfer(msg.sender, recipient, lootToTransfer);
        
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 lootToTransfer) external returns (bool) {
        allowance[sender][msg.sender] = allowance[sender][msg.sender].sub(lootToTransfer);
        members[sender].loot = members[sender].loot.sub(lootToTransfer);
        members[recipient].loot = members[recipient].loot.add(lootToTransfer);
        
        balanceOf[sender] = balanceOf[sender].sub(lootToTransfer);
        balanceOf[recipient] = balanceOf[recipient].add(lootToTransfer);
        
        emit Transfer(sender, recipient, lootToTransfer);
        
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"applicantAddress","type":"address"}],"name":"CancelProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ConvertSharesToLoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessActionProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessGuildKickProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessWhitelistProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"Ragequit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"SponsorProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"applicant","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"indexed":false,"internalType":"address","name":"tributeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"indexed":false,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"bytes32","name":"details","type":"bytes32"},{"indexed":false,"internalType":"uint8[7]","name":"flags","type":"uint8[7]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"}],"name":"SubmitProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"uintVote","type":"uint8"}],"name":"SubmitVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountToCollect","type":"uint256"}],"name":"TokensCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newDelegateKey","type":"address"}],"name":"UpdateDelegateKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ESCROW","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GUILD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"actions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"}],"name":"canRagequit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"collectTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesToLoot","type":"uint256"}],"name":"convertSharesToLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dilutionBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"memberAddress","type":"address"},{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"getMemberProposalVote","outputs":[{"internalType":"enum Mystic.Vote","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalFlags","outputs":[{"internalType":"uint8[7]","name":"","type":"uint8[7]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalQueueLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getUserTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"hasVotingPeriodExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address[]","name":"_summoner","type":"address[]"},{"internalType":"uint256[]","name":"_summonerShares","type":"uint256[]"},{"internalType":"uint256","name":"_summonerDeposit","type":"uint256"},{"internalType":"uint256","name":"_proposalDeposit","type":"uint256"},{"internalType":"uint256","name":"_processingReward","type":"uint256"},{"internalType":"uint256","name":"_periodDuration","type":"uint256"},{"internalType":"uint256","name":"_votingPeriodLength","type":"uint256"},{"internalType":"uint256","name":"_gracePeriodLength","type":"uint256"},{"internalType":"uint256","name":"_dilutionBound","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"memberAddressByDelegateKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"members","outputs":[{"internalType":"address","name":"delegateKey","type":"address"},{"internalType":"uint8","name":"exists","type":"uint8"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"loot","type":"uint256"},{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"},{"internalType":"uint256","name":"jailed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processActionProposal","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processGuildKickProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processWhitelistProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"address","name":"applicant","type":"address"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"address","name":"tributeToken","type":"address"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"internalType":"uint256","name":"lootRequested","type":"uint256"},{"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"internalType":"uint256","name":"startingPeriod","type":"uint256"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"uint256","name":"maxTotalSharesAndLootAtYesVote","type":"uint256"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToKick","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"memberToKick","type":"address"}],"name":"ragekick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"ragequit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"sponsorProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actionTo","type":"address"},{"internalType":"address","name":"actionToken","type":"address"},{"internalType":"uint256","name":"actionTokenAmount","type":"uint256"},{"internalType":"uint256","name":"actionValue","type":"uint256"},{"internalType":"bytes32","name":"details","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitActionProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"memberToKick","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitGuildKickProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"applicant","type":"address"},{"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"internalType":"uint256","name":"lootRequested","type":"uint256"},{"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"internalType":"address","name":"tributeToken","type":"address"},{"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"uint8","name":"uintVote","type":"uint8"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenToWhitelist","type":"address"},{"internalType":"bytes32","name":"details","type":"bytes32"}],"name":"submitWhitelistProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"summoningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuildBankTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lootToTransfer","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lootToTransfer","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDelegateKey","type":"address"}],"name":"updateDelegateKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingPeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool","name":"max","type":"bool"}],"name":"withdrawBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50615ff180620000216000396000f3fe6080604052600436106103bc5760003560e01c80637a609641116101f2578063b2643aab1161010d578063e1780345116100a0578063ea7b6ffd1161006f578063ea7b6ffd146110a1578063f2428621146110f6578063f5d54c771461110b578063ff82cc6c14611120576103c3565b8063e178034514611005578063e1a0e3fa14611038578063e63bc62d14611062578063e681c4aa1461108c576103c3565b8063da35c664116100dc578063da35c66414610f58578063dd62ed3e14610f6d578063dfdd369e14610fa8578063e0a8f6f514610fdb576103c3565b8063b2643aab14610ea2578063b470aade14610f04578063c68e45b714610f19578063c89039c514610f43576103c3565b80639746d94011610185578063a42e01c111610154578063a42e01c114610d12578063a4d2d9ec14610e1b578063a9059cbb14610e54578063afe5475f14610e8d576103c3565b80639746d94014610c7657806399653fbe14610ca05780639d1722cb14610cd3578063a3dc380014610ce8576103c3565b806388fbe1e1116101c157806388fbe1e114610b7b5780638b15a60514610c225780639425a47614610c3757806395d89b4114610c61576103c3565b80637a60964114610afd5780637d5b6c7214610b2757806383240f8314610b3c5780638340bbce14610b66576103c3565b80633793ab3c116102e2578063635e99aa1161027557806373f8fd4b1161024457806373f8fd4b14610a65578063753d756314610aa057806378a8956714610ad3578063797daf7014610ae8576103c3565b8063635e99aa146109cf57806363858f2d146109e45780636d4475eb146109f957806370a0823114610a32576103c3565b8063402c1794116102b1578063402c1794146108875780634482394b146108ba57806351ed6a301461098757806359999b411461099c576103c3565b80633793ab3c146107eb5780633a98ef39146108155780633b214a741461082a5780633fc24bba14610854576103c3565b80630cf20cc91161035a57806323b872dd1161032957806323b872dd146107355780632582bf2a1461077857806327efc086146107ab578063313ce567146107c0576103c3565b80630cf20cc91461066f57806315eb349e146106aa57806318160ddd146106da5780631dafede0146106ef576103c3565b806306fdde031161039657806306fdde0314610511578063086146d21461059b57806308ae4b0c146105b0578063095ea7b314610622576103c3565b8063013cf08b146103c857806303e32fa114610490578063044a0ca8146104b7576103c3565b366103c357005b600080fd5b3480156103d457600080fd5b506103f2600480360360208110156103eb57600080fd5b50356111cb565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b34801561049c57600080fd5b506104a561124a565b60408051918252519081900360200190f35b3480156104c357600080fd5b506104f0600480360360408110156104da57600080fd5b506001600160a01b038135169060200135611250565b6040518082600281111561050057fe5b815260200191505060405180910390f35b34801561051d57600080fd5b50610526611343565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610560578181015183820152602001610548565b50505050905090810190601f16801561058d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105a757600080fd5b506104a5611369565b3480156105bc57600080fd5b506105e3600480360360208110156105d357600080fd5b50356001600160a01b0316611391565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561062e57600080fd5b5061065b6004803603604081101561064557600080fd5b506001600160a01b0381351690602001356113d1565b604080519115158252519081900360200190f35b34801561067b57600080fd5b506106a86004803603604081101561069257600080fd5b506001600160a01b038135169060200135611471565b005b3480156106b657600080fd5b506106a8600480360360408110156106cd57600080fd5b50803590602001356114d9565b3480156106e657600080fd5b506104a5611586565b3480156106fb57600080fd5b506107196004803603602081101561071257600080fd5b503561159f565b604080516001600160a01b039092168252519081900360200190f35b34801561074157600080fd5b5061065b6004803603606081101561075857600080fd5b506001600160a01b038135811691602081013590911690604001356115c6565b34801561078457600080fd5b506106a86004803603602081101561079b57600080fd5b50356001600160a01b031661171f565b3480156107b757600080fd5b50610719611999565b3480156107cc57600080fd5b506107d561199f565b6040805160ff9092168252519081900360200190f35b3480156107f757600080fd5b506106a86004803603602081101561080e57600080fd5b50356119a4565b34801561082157600080fd5b506104a5611bb9565b34801561083657600080fd5b506104a56004803603602081101561084d57600080fd5b5035611bbf565b34801561086057600080fd5b5061065b6004803603602081101561087757600080fd5b50356001600160a01b0316611bdd565b34801561089357600080fd5b50610719600480360360208110156108aa57600080fd5b50356001600160a01b0316611bf2565b3480156108c657600080fd5b506106a8600480360360608110156108dd57600080fd5b810190602081018135600160201b8111156108f757600080fd5b82018360208201111561090957600080fd5b803590602001918460208302840111600160201b8311171561092a57600080fd5b919390929091602081019035600160201b81111561094757600080fd5b82018360208201111561095957600080fd5b803590602001918460208302840111600160201b8311171561097a57600080fd5b9193509150351515611c0d565b34801561099357600080fd5b50610719611d5d565b3480156109a857600080fd5b506106a8600480360360208110156109bf57600080fd5b50356001600160a01b0316611d6c565b3480156109db57600080fd5b506104a5612006565b3480156109f057600080fd5b506104a561200c565b348015610a0557600080fd5b506104a560048036036040811015610a1c57600080fd5b506001600160a01b038135169060200135612012565b348015610a3e57600080fd5b506104a560048036036020811015610a5557600080fd5b50356001600160a01b0316612174565b348015610a7157600080fd5b506104a560048036036040811015610a8857600080fd5b506001600160a01b0381358116916020013516612186565b348015610aac57600080fd5b5061065b60048036036020811015610ac357600080fd5b50356001600160a01b03166121b1565b348015610adf57600080fd5b506104a56121c6565b348015610af457600080fd5b506104a56121cc565b348015610b0957600080fd5b506106a860048036036020811015610b2057600080fd5b50356121d2565b348015610b3357600080fd5b506104a56122d7565b348015610b4857600080fd5b5061052660048036036020811015610b5f57600080fd5b50356122dd565b348015610b7257600080fd5b506104a5612378565b348015610b8757600080fd5b506104a5600480360360c0811015610b9e57600080fd5b6001600160a01b0382358116926020810135909116916040820135916060810135916080820135919081019060c0810160a0820135600160201b811115610be457600080fd5b820183602082011115610bf657600080fd5b803590602001918460018302840111600160201b83111715610c1757600080fd5b50909250905061237e565b348015610c2e57600080fd5b506104a56123fc565b348015610c4357600080fd5b5061065b60048036036020811015610c5a57600080fd5b5035612402565b348015610c6d57600080fd5b50610526612429565b348015610c8257600080fd5b506106a860048036036020811015610c9957600080fd5b503561244a565b348015610cac57600080fd5b506106a860048036036040811015610cc357600080fd5b508035906020013560ff16612a3f565b348015610cdf57600080fd5b506104a5612e6a565b348015610cf457600080fd5b5061065b60048036036020811015610d0b57600080fd5b5035612e70565b348015610d1e57600080fd5b506106a86004803603610160811015610d3657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610d6957600080fd5b820183602082011115610d7b57600080fd5b803590602001918460208302840111600160201b83111715610d9c57600080fd5b919390929091602081019035600160201b811115610db957600080fd5b820183602082011115610dcb57600080fd5b803590602001918460208302840111600160201b83111715610dec57600080fd5b919350915080359060208101359060408101359060608101359060808101359060a08101359060c00135612f11565b348015610e2757600080fd5b506104a560048036036040811015610e3e57600080fd5b506001600160a01b038135169060200135613283565b348015610e6057600080fd5b5061065b60048036036040811015610e7757600080fd5b506001600160a01b038135169060200135613419565b348015610e9957600080fd5b506104a5613516565b348015610eae57600080fd5b50610ecc60048036036020811015610ec557600080fd5b503561351c565b604051808260e080838360005b83811015610ef1578181015183820152602001610ed9565b5050505090500191505060405180910390f35b348015610f1057600080fd5b506104a5613584565b348015610f2557600080fd5b506106a860048036036020811015610f3c57600080fd5b503561358a565b348015610f4f57600080fd5b50610719613703565b348015610f6457600080fd5b506104a5613717565b348015610f7957600080fd5b506104a560048036036040811015610f9057600080fd5b506001600160a01b038135811691602001351661371d565b348015610fb457600080fd5b506106a860048036036020811015610fcb57600080fd5b50356001600160a01b031661373a565b348015610fe757600080fd5b506106a860048036036020811015610ffe57600080fd5b50356138db565b34801561101157600080fd5b5061065b6004803603602081101561102857600080fd5b50356001600160a01b0316613a9b565b34801561104457600080fd5b506106a86004803603602081101561105b57600080fd5b5035613ab0565b34801561106e57600080fd5b506106a86004803603602081101561108557600080fd5b5035613ca0565b34801561109857600080fd5b5061071961413b565b6104a560048036036101008110156110b857600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e00135614141565b34801561110257600080fd5b5061071961469c565b34801561111757600080fd5b506107196146b4565b34801561112c57600080fd5b5061114a6004803603602081101561114357600080fd5b50356146ba565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561118f578181015183820152602001611177565b50505050905090810190601f1680156111bc5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6015602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60035481565b6001600160a01b038216600090815260186020526040812054600160a01b900460ff166001146112b1576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60145482106112f3576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b601560006014848154811061130457fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6040518060400160405280600a8152602001694d59535449432044414f60b01b81525081565b600061138c60045461138660085442614aa690919063ffffffff16565b90614abb565b905090565b601860205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b600081158061140157503360009081526010602090815260408083206001600160a01b0387168452909152902054155b61140a57600080fd5b3360008181526010602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60005460ff166114b4576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556114c88282614add565b50506000805460ff19166001179055565b60005460ff1661151c576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff1916815533815260186020526040902054600160a01b900460ff1660011461157b576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b6114c8338383614ba6565b600061138c600c54600b54614e6c90919063ffffffff16565b601281815481106115ac57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03831660009081526010602090815260408083203384529091528120546115f49083614aa6565b6001600160a01b0385166000818152601060209081526040808320338452825280832094909455918152601890915220600201546116329083614aa6565b6001600160a01b0380861660009081526018602052604080822060029081019490945591861681522001546116679083614e6c565b6001600160a01b038085166000908152601860209081526040808320600201949094559187168152600f90915220546116a09083614aa6565b6001600160a01b038086166000908152600f602052604080822093909355908516815220546116cf9083614e6c565b6001600160a01b038085166000818152600f60209081526040918290209490945580518681529051919392881692600080516020615f4e83398151915292918290030190a35060015b9392505050565b60005460ff16611762576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601860205260409020600101546117c3576040805162461bcd60e51b815260206004820152601360248201527231b0b63632b91010b9b430b932b437b63232b960691b604482015290519081900360640190fd5b6001600160a01b038116611813576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b0381163314611903576001600160a01b038116600090815260186020526040902054600160a01b900460ff161561188d576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601960209081526040808320549093168252601890522054600160a01b900460ff1615611903576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b33600081815260186020908152604080832080546001600160a01b0390811685526019845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506000805460ff19166001179055565b61deed81565b601281565b60005460ff166119e7576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556119fa81614e7e565b600060148281548110611a0957fe5b60009182526020808320919091015480835260159091526040909120600581015491925090600160201b900460ff16600114611a79576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611a9584615149565b60125490915061019011611aa7575060005b8015611b385760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601360205260408120805460ff1916600190811790915592546012805494850181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601660205260409020805460ff191690556002830154611b6d91166152e6565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a350506000805460ff191660011790555050565b600b5481565b60148181548110611bcc57fe5b600091825260209091200154905081565b60176020526000908152604090205460ff1681565b6019602052600090815260409020546001600160a01b031681565b60005460ff16611c50576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055838214611ca2576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611d48576000848483818110611cbb57fe5b9050602002013590508215611d1a5733600090815260116020526040812090888885818110611ce657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611d3f878784818110611d2957fe5b905060200201356001600160a01b031682614add565b50600101611ca5565b50506000805460ff1916600117905550505050565b6001546001600160a01b031681565b60005460ff16611daf576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b031683526018909152902060010154611e1c576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c623602090815260408083205481516370a0823160e01b815230600482015291519394611ec894919390926370a082319260248083019392829003018186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d6020811015611ec057600080fd5b505190614aa6565b905060008111611f09576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526013602052604090205460ff16611f65576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615f2e8339815191526020526040902054158015611f9a575060c8600d54105b15611fa957600d805460010190555b611fb661dead8383615337565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506000805460ff19166001179055565b600c5481565b60065481565b600061201c615cd1565b506001600160a01b03838116600090815260186020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a0830152151580612094575060008160600151115b6120d4576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601860205260409020600401541561212b576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b612133615d13565b600160a08201526040805160208101909152600080825261216491879190819081908190819081908c908a90615395565b5050600a54600019019392505050565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b60136020526000908152604090205460ff1681565b60125490565b60145490565b60005460ff16612215576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601860205260409020600101546122399082614aa6565b33600090815260186020526040902060018101919091556002015461225e9082614e6c565b33600090815260186020526040902060020155600b5461227e9082614aa6565b600b55600c5461228e9082614e6c565b600c5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506000805460ff19166001179055565b60085481565b600e6020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156123705780601f1061234557610100808354040283529160200191612370565b820191906000526020600020905b81548152906001019060200180831161235357829003601f168201915b505050505081565b60055481565b6000612388615d13565b6001816006602002019060ff16908160ff16815250506123e8896000808960008c8e8c898d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061539592505050565b5050600a5460001901979650505050505050565b60025481565b600061241960055483614e6c90919063ffffffff16565b612421611369565b101592915050565b604051806040016040528060058152602001644d5844414f60d81b81525081565b60005460ff1661248d576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b0316835260189091529020600101546124fa576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b60025460005461251d916101009091046001600160a01b0316903390309061570c565b61254161deaf600060019054906101000a90046001600160a01b0316600254615337565b600081815260156020526040902060018101546001600160a01b031661259a576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff16156125e0576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff161561262d576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601860205260409020600401541561268f576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b600081600901541180156126ca575060038101546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054155b156127185760c8600d5410612718576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff166001141561286c5760038101546001600160a01b031660009081526013602052604090205460ff161561278f576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526016602052604090205460ff16156127f6576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60125461019011612840576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601660205260409020805460ff19166001179055612909565b600581015465010000000000900460ff16600114156129095780546001600160a01b031660009081526017602052604090205460ff16156128e4576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601760205260409020805460ff191660011790555b6000612960612916611369565b601454156129585760148054601591600091600019810190811061293657fe5b90600052602060002001548152602001908152602001600020600a015461295b565b60005b61576c565b6001908101600a8401819055336000818152601960209081526040808320546002890180546001600160a01b0319166001600160a01b03909216918217905560058901805460ff191688179055601480549788018155938490527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9096018990559154825189815260001990910191810191909152808201849052905192945083927f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a350506000805460ff191660011790555050565b60005460ff16612a82576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b031683526018909152902060010154612aef576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601960209081526040808320546001600160a01b031680845260189092529091206014548410612b58576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60006015600060148781548110612b6b57fe5b90600052602060002001548152602001908152602001600020905060038460ff1610612bc4576040805162461bcd60e51b8152602060048201526003602482015262213c3360e81b604482015290519081900360640190fd5b60008460ff166002811115612bd557fe5b905081600a0154612be4611369565b1015612c21576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612c2e82600a0154612402565b15612c6a576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f8301602052604081205460ff166002811115612c9357fe5b14612ccd576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612cdb57fe5b1480612cf257506002816002811115612cf057fe5b145b612d2e576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f830160205260409020805482919060ff19166001836002811115612d5f57fe5b02179055506001816002811115612d7257fe5b1415612dc2576001830154600b8301805490910190556003830154861115612d9c57600383018690555b81600d0154612da9611586565b1115612dbd57612db7611586565b600d8301555b612de7565b6002816002811115612dd057fe5b1415612de7576001830154600c8301805490910190555b836001600160a01b0316336001600160a01b0316877f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a2060148a81548110612e2a57fe5b906000526020600020015489604051808381526020018260ff1681526020019250505060405180910390a450506000805460ff1916600117905550505050565b600d5481565b6014546000908210612eb5576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b6015600060148481548110612ec657fe5b90600052602060002001548152602001908152602001600020600501600160078110612eee57fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b60095460ff1615612f57576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b8b6001600160a01b03168d6001600160a01b03161415612fbe576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b898814613012576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b848610156130515760405162461bcd60e51b8152600401808060200182810382526024815260200180615f6e6024913960400191505060405180910390fd5b60005b8a8110156130fc576130938c8c8381811061306b57fe5b905060200201356001600160a01b03168b8b8481811061308757fe5b90506020020135615783565b6130ca8c8c838181106130a257fe5b905060200201356001600160a01b03168b8b848181106130be57fe5b905060200201356158b5565b6130f18a8a838181106130d957fe5b90506020020135600b54614e6c90919063ffffffff16565b600b55600101613054565b506ec097ce7bc90715b34b9f1000000000600b541115613151576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038d166000818152601360205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b031916909117905586156131d257600d805460010190556131d261dead8e89615337565b8c600060016101000a8154816001600160a01b0302191690836001600160a01b031602179055508b600160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550856002819055508460038190555083600481905550826005819055508160068190555080600781905550426008819055506001600960006101000a81548160ff02191690831515021790555061327461591e565b50505050505050505050505050565b60006001600160a01b0383166132c9576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6001546001600160a01b038481169116141561332c576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526013602052604090205460ff1615613388576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b601254610190116133d2576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b6133da615d13565b600160808201526040805160208101909152600080825261340a918190819081908990829081908b908a90615395565b5050600a546000190192915050565b336000908152601860205260408120600201546134369083614aa6565b336000908152601860205260408082206002908101939093556001600160a01b0386168252902001546134699083614e6c565b6001600160a01b038416600090815260186020908152604080832060020193909355338252600f9052205461349e9083614aa6565b336000908152600f6020526040808220929092556001600160a01b038516815220546134ca9083614e6c565b6001600160a01b0384166000818152600f6020908152604091829020939093558051858152905191923392600080516020615f4e8339815191529281900390910190a350600192915050565b60075481565b613524615d13565b600082815260156020526040808220815160e0810192839052926005909101916007918390855b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161354b575094979650505050505050565b60045481565b60005460ff166135cd576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556001546135ef906001600160a01b031633308461570c565b33600090815260186020526040902054600160a01b900460ff1660011415613646573360009081526018602052604090206001015461362e9082614e6c565b33600090815260186020526040902060010155613650565b6136503382615783565b61365a33826158b5565b600b546136679082614e6c565b600b8190556ec097ce7bc90715b34b9f100000000010156136bd576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917fce3ea4745ffbcdb1833febb705a9558eb9362e915a0ff60625532831df6b375c919081900360200190a2506000805460ff19166001179055565b60005461010090046001600160a01b031681565b600a5481565b601060209081526000928352604080842090915290825290205481565b60005460ff1661377d576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b0316835260189091529020600101546137ea576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090206004810154613842576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b6000816002015411613883576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6138908160030154612e70565b6138cb5760405162461bcd60e51b8152600401808060200182810382526041815260200180615eed6041913960600191505060405180910390fd5b6114c88260008360020154614ba6565b60005460ff1661391e576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155818152601560205260409020600581015460ff161561397a576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff16156139c7576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613a14576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613a549261deaf926001600160a01b039182169291169061592d565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506000805460ff19166001179055565b60166020526000908152604090205460ff1681565b60005460ff16613af3576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055613b0681614e7e565b600060148281548110613b1557fe5b6000918252602080832091909101548083526015909152604090912060058101549192509065010000000000900460ff16600114613b82576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613b9e84615149565b90508015613c225760058201805462ff000019166201000017905581546001600160a01b031660009081526018602052604090206004810185905560018101546002820154613bec91614e6c565b60028201556001810154600b54613c0291614aa6565b600b556001810154600c54613c1691614e6c565b600c5560006001909101555b81546001600160a01b039081166000908152601760205260409020805460ff191690556002830154613c5491166152e6565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a350506000805460ff191660011790555050565b60005460ff16613ce3576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055613cf681614e7e565b600060148281548110613d0557fe5b60009182526020808320919091015480835260159091526040909120600581015491925090600160201b900460ff16158015613d4f5750600581015465010000000000900460ff16155b8015613d6a575060058101546601000000000000900460ff16155b613da7576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613dc384615149565b90506ec097ce7bc90715b34b9f1000000000613df38360070154613ded8560060154613ded611586565b90614e6c565b1115613dfd575060005b60048201546001600160a01b03166000908152600080516020615f2e833981519152602052604090205460088301541115613e36575060005b60008260090154118015613e71575060038201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054155b8015613e80575060c8600d5410155b15613e89575060005b80156140ad5760058201805462ff000019166201000017905581546001600160a01b0316600090815260186020526040902054600160a01b900460ff1660011415613f5b57600682015482546001600160a01b0316600090815260186020526040902060010154613ef991614e6c565b82546001600160a01b03908116600090815260186020526040808220600101939093556007850154855490921681529190912060020154613f3991614e6c565b82546001600160a01b0316600090815260186020526040902060020155613f75565b81546006830154613f75916001600160a01b031690615783565b815460078301546006840154613f9e926001600160a01b031691613f999190614e6c565b6158b5565b6006820154600b54613faf91614e6c565b600b556007820154600c54613fc391614e6c565b600c5560038201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614001575060008260090154115b1561401057600d805460010190555b600382015460098301546140359161deaf9161dead916001600160a01b03169061592d565b81546004830154600884015461405d9261dead926001600160a01b039182169291169061592d565b60048201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614098575060008260080154115b156140a857600d80546000190190555b6140d8565b6001820154600383015460098401546140d89261deaf926001600160a01b039182169291169061592d565b60028201546140ef906001600160a01b03166152e6565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a350506000805460ff191660011790555050565b61deaf81565b6000805460ff16614185576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556ec097ce7bc90715b34b9f10000000006141a98989614e6c565b11156141ea576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526013602052604090205460ff16614257576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526013602052604090205460ff166142c4576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead148015906142ea57506001600160a01b03891661deaf14155b801561430157506001600160a01b03891661deed14155b61434b576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b038916600090815260186020526040902060040154156143ac576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b6000861180156143df57506001600160a01b0385166000908152600080516020615f2e8339815191526020526040902054155b1561442d5760c8600d541061442d576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480156144595750600034115b1561462f578534146144a0576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156144ef57600080fd5b505af1158015614503573d6000803e3d6000fd5b50506040516000925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2915034908381818185875af1925050503d806000811461455d576040519150601f19603f3d011682016040523d82523d6000602084013e614562565b606091505b50509050806145a3576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152306004820152346024820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29163a9059cbb9160448083019260209291908290030181600087803b1580156145fc57600080fd5b505af1158015614610573d6000803e3d6000fd5b505050506040513d602081101561462657600080fd5b50614644915050565b6146446001600160a01b03861633308961570c565b61465161deaf8688615337565b614659615d13565b61467a8a8a8a8a8a8a8a8a8960405180602001604052806000815250615395565b5050600a54600019016000805460ff1916600117905598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b6000805460609060ff16614701576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff1916905561471483614e7e565b60006014848154811061472357fe5b600091825260208083209190910154808352600e825260408084206015909352909220600581015492935090916601000000000000900460ff1660011461479b576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff00191661010017905560006147b787615149565b60015460048401549192506001600160a01b0391821691161480156148555750600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561482257600080fd5b505afa158015614836573d6000803e3d6000fd5b505050506040513d602081101561484c57600080fd5b50516008830154115b1561485e575060005b60048201546001600160a01b031660009081526013602052604090205460ff1680156148b6575060048201546001600160a01b03166000908152600080516020615f2e83398151915260205260409020546008830154115b156148bf575060005b47826009015411156148cf575060005b8015614a545760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156149655780601f10614943576101008083540402835291820191614965565b820191906000526020600020905b815481529060010190602001808311614951575b505091505060006040518083038185875af1925050503d80600081146149a7576040519150601f19603f3d011682016040523d82523d6000602084013e6149ac565b606091505b5060048601546001600160a01b0316600090815260136020526040902054919350915060ff1615614a4557600484015460088501546149fa9161dead916001600160a01b0390911690615943565b60048401546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614a35575060008460080154115b15614a4557600d80546000190190555b9096509450614a929350505050565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b6000805460ff191660011790559092909150565b600082821115614ab557600080fd5b50900390565b6000808211614ac957600080fd5b6000828481614ad457fe5b04949350505050565b3360009081526011602090815260408083206001600160a01b0386168452909152902054811115614b40576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b614b546001600160a01b03831633836159a3565b614b5f338383615943565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b6000614bb0611586565b6001600160a01b0385166000908152601860205260409020600181015491925090841115614c0f576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b8281600201541015614c50576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b614c5d8160030154612e70565b614c985760405162461bcd60e51b8152600401808060200182810382526041815260200180615eed6041913960600191505060405180910390fd5b6000614ca48585614e6c565b9050614cb086826159fa565b6001820154614cbf9086614aa6565b60018301556002820154614cd39085614aa6565b6002830155600b54614ce59086614aa6565b600b55600c54614cf59085614aa6565b600c5560005b601254811015614e205761dead6000908152601160205260128054614d6391600080516020615f2e8339815191529184919086908110614d3757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615a62565b90508015614e175761dead60009081526011602052601280548392600080516020615f2e83398151915292909186908110614d9a57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526011909252908120601280548493919086908110614deb57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614cfb565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a2505050505050565b60008282018381101561171857600080fd5b6014548110614ec0576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614ec8615d31565b6015600060148481548110614ed957fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b0390811682526001830154811695820195909552600282015485168185015260038201548516606082015260048201549094166080850152825160e0810193849052909260a085019260058501916007918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614f5f5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050615012600654613ded600554846101400151614e6c90919063ffffffff16565b61501a611369565b1015615056576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff16156150a0576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b811580615101575060156000601460018503815481106150bc57fe5b906000526020600020015481526020019081526020016000206005016001600781106150e457fe5b602091828204019190069054906101000a900460ff1660ff166001145b615145576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b6000615153615d31565b601560006014858154811061516457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b0390811682526001830154811695820195909552600282015485168185015260038201548516606082015260048201549094166080850152825160e0810193849052909260a085019260058501916007918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116151ea5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050806101800151816101600151111561529457600191505b806101a001516152ae6007546152a8611586565b90615ab6565b10156152b957600091505b80516001600160a01b0316600090815260186020526040902060040154156152e057600091505b50919050565b61530b61deaf33600060019054906101000a90046001600160a01b031660035461592d565b61533461deaf82600060019054906101000a90046001600160a01b03166003546002540361592d565b50565b6001600160a01b0392831660009081526011602090815260408083209490951682529283528381208054830190557f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c62390925291902080549091019055565b61539d615d31565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066007811061544657fe5b602002015160ff166001141561547a57600a546000908152600e60209081526040909120835161547892850190615db1565b505b600a54600090815260156020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a082015182919061551b9060058301906007615e2f565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050600060196000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b0316336001600160a01b03168d6001600160a01b03167f698b6b5a7173505e04fab049527190ad00a5d40a2dfb3d6e811f0e9c47c00c058e8e8e8e8e8e8e8e8e600a54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600760200280838360005b8381101561566c578181015183820152602001615654565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156156b257818101518382015260200161569a565b50505050905090810190601f1680156156df5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600a8054600101905550505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615766908590615add565b50505050565b60008183101561577c5781611718565b5090919050565b6001600160a01b03808316600090815260196020908152604080832054909316825260189052205460ff600160a01b909104166001141561580b576001600160a01b0380831660009081526019602090815260408083205490931680835283832080546001600160a01b03199081168317909155601890925292909120805490911690911790555b6040805160c0810182526001600160a01b03938416808252600160208084018281528486019687526000606086018181526080870182815260a088018381528784526018865289842098518954955160ff16600160a01b0260ff60a01b1991909d166001600160a01b031996871617169b909b1788559851948701949094559251600286015595516003850155955160049093019290925560199094522080549091169091179055565b6001600160a01b0382166000908152600f60205260409020546158d89082614e6c565b6001600160a01b0383166000818152600f60209081526040808320949094558351858152935192939192600080516020615f4e8339815191529281900390910190a35050565b6000805460ff19166001179055565b615938848383615943565b615766838383615337565b6001600160a01b039283166000908152601160209081526040808320949095168252928352838120805483900390557f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c6239092529190208054919091039055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526159f5908490615add565b505050565b6001600160a01b0382166000908152600f6020526040902054615a1d9082614aa6565b6001600160a01b0383166000818152600f6020908152604080832094909455835185815293519193600080516020615f4e833981519152929081900390910190a35050565b600081615a6e57600080fd5b83615a7b57506000611718565b83830283858281615a8857fe5b041415615aa157828181615a9857fe5b04915050611718565b83838681615aab57fe5b040295945050505050565b600082615ac55750600061133d565b82820282848281615ad257fe5b041461171857600080fd5b615aef826001600160a01b0316615c95565b615b40576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7e5780518252601f199092019160209182019101615b5f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615be0576040519150601f19603f3d011682016040523d82523d6000602084013e615be5565b606091505b509150915081615c3c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561576657808060200190516020811015615c5857600080fd5b50516157665760405162461bcd60e51b815260040180806020018281038252602a815260200180615f92602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615cc957508115155b949350505050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b6040518060e001604052806007906020820280368337509192915050565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615d69615d13565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615df257805160ff1916838001178555615e1f565b82800160010185558215615e1f579182015b82811115615e1f578251825591602001919060010190615e04565b50615e2b929150615ebe565b5090565b600183019183908215615eb25791602002820160005b83821115615e8357835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615e45565b8015615eb05782816101000a81549060ff0219169055600101602081600001049283019260010302615e83565b505b50615e2b929150615ed3565b5b80821115615e2b5760008155600101615ebf565b5b80821115615e2b57805460ff19168155600101615ed456fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f63657373657397847ee99463795296047093514439c3127772df3715e628aa85601cf8541716ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122001a0c3df97f03f368990c0294d99aa3753c3f3433da1a3ca5830090b43f26d8664736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80637a609641116101f2578063b2643aab1161010d578063e1780345116100a0578063ea7b6ffd1161006f578063ea7b6ffd146110a1578063f2428621146110f6578063f5d54c771461110b578063ff82cc6c14611120576103c3565b8063e178034514611005578063e1a0e3fa14611038578063e63bc62d14611062578063e681c4aa1461108c576103c3565b8063da35c664116100dc578063da35c66414610f58578063dd62ed3e14610f6d578063dfdd369e14610fa8578063e0a8f6f514610fdb576103c3565b8063b2643aab14610ea2578063b470aade14610f04578063c68e45b714610f19578063c89039c514610f43576103c3565b80639746d94011610185578063a42e01c111610154578063a42e01c114610d12578063a4d2d9ec14610e1b578063a9059cbb14610e54578063afe5475f14610e8d576103c3565b80639746d94014610c7657806399653fbe14610ca05780639d1722cb14610cd3578063a3dc380014610ce8576103c3565b806388fbe1e1116101c157806388fbe1e114610b7b5780638b15a60514610c225780639425a47614610c3757806395d89b4114610c61576103c3565b80637a60964114610afd5780637d5b6c7214610b2757806383240f8314610b3c5780638340bbce14610b66576103c3565b80633793ab3c116102e2578063635e99aa1161027557806373f8fd4b1161024457806373f8fd4b14610a65578063753d756314610aa057806378a8956714610ad3578063797daf7014610ae8576103c3565b8063635e99aa146109cf57806363858f2d146109e45780636d4475eb146109f957806370a0823114610a32576103c3565b8063402c1794116102b1578063402c1794146108875780634482394b146108ba57806351ed6a301461098757806359999b411461099c576103c3565b80633793ab3c146107eb5780633a98ef39146108155780633b214a741461082a5780633fc24bba14610854576103c3565b80630cf20cc91161035a57806323b872dd1161032957806323b872dd146107355780632582bf2a1461077857806327efc086146107ab578063313ce567146107c0576103c3565b80630cf20cc91461066f57806315eb349e146106aa57806318160ddd146106da5780631dafede0146106ef576103c3565b806306fdde031161039657806306fdde0314610511578063086146d21461059b57806308ae4b0c146105b0578063095ea7b314610622576103c3565b8063013cf08b146103c857806303e32fa114610490578063044a0ca8146104b7576103c3565b366103c357005b600080fd5b3480156103d457600080fd5b506103f2600480360360208110156103eb57600080fd5b50356111cb565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b34801561049c57600080fd5b506104a561124a565b60408051918252519081900360200190f35b3480156104c357600080fd5b506104f0600480360360408110156104da57600080fd5b506001600160a01b038135169060200135611250565b6040518082600281111561050057fe5b815260200191505060405180910390f35b34801561051d57600080fd5b50610526611343565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610560578181015183820152602001610548565b50505050905090810190601f16801561058d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105a757600080fd5b506104a5611369565b3480156105bc57600080fd5b506105e3600480360360208110156105d357600080fd5b50356001600160a01b0316611391565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561062e57600080fd5b5061065b6004803603604081101561064557600080fd5b506001600160a01b0381351690602001356113d1565b604080519115158252519081900360200190f35b34801561067b57600080fd5b506106a86004803603604081101561069257600080fd5b506001600160a01b038135169060200135611471565b005b3480156106b657600080fd5b506106a8600480360360408110156106cd57600080fd5b50803590602001356114d9565b3480156106e657600080fd5b506104a5611586565b3480156106fb57600080fd5b506107196004803603602081101561071257600080fd5b503561159f565b604080516001600160a01b039092168252519081900360200190f35b34801561074157600080fd5b5061065b6004803603606081101561075857600080fd5b506001600160a01b038135811691602081013590911690604001356115c6565b34801561078457600080fd5b506106a86004803603602081101561079b57600080fd5b50356001600160a01b031661171f565b3480156107b757600080fd5b50610719611999565b3480156107cc57600080fd5b506107d561199f565b6040805160ff9092168252519081900360200190f35b3480156107f757600080fd5b506106a86004803603602081101561080e57600080fd5b50356119a4565b34801561082157600080fd5b506104a5611bb9565b34801561083657600080fd5b506104a56004803603602081101561084d57600080fd5b5035611bbf565b34801561086057600080fd5b5061065b6004803603602081101561087757600080fd5b50356001600160a01b0316611bdd565b34801561089357600080fd5b50610719600480360360208110156108aa57600080fd5b50356001600160a01b0316611bf2565b3480156108c657600080fd5b506106a8600480360360608110156108dd57600080fd5b810190602081018135600160201b8111156108f757600080fd5b82018360208201111561090957600080fd5b803590602001918460208302840111600160201b8311171561092a57600080fd5b919390929091602081019035600160201b81111561094757600080fd5b82018360208201111561095957600080fd5b803590602001918460208302840111600160201b8311171561097a57600080fd5b9193509150351515611c0d565b34801561099357600080fd5b50610719611d5d565b3480156109a857600080fd5b506106a8600480360360208110156109bf57600080fd5b50356001600160a01b0316611d6c565b3480156109db57600080fd5b506104a5612006565b3480156109f057600080fd5b506104a561200c565b348015610a0557600080fd5b506104a560048036036040811015610a1c57600080fd5b506001600160a01b038135169060200135612012565b348015610a3e57600080fd5b506104a560048036036020811015610a5557600080fd5b50356001600160a01b0316612174565b348015610a7157600080fd5b506104a560048036036040811015610a8857600080fd5b506001600160a01b0381358116916020013516612186565b348015610aac57600080fd5b5061065b60048036036020811015610ac357600080fd5b50356001600160a01b03166121b1565b348015610adf57600080fd5b506104a56121c6565b348015610af457600080fd5b506104a56121cc565b348015610b0957600080fd5b506106a860048036036020811015610b2057600080fd5b50356121d2565b348015610b3357600080fd5b506104a56122d7565b348015610b4857600080fd5b5061052660048036036020811015610b5f57600080fd5b50356122dd565b348015610b7257600080fd5b506104a5612378565b348015610b8757600080fd5b506104a5600480360360c0811015610b9e57600080fd5b6001600160a01b0382358116926020810135909116916040820135916060810135916080820135919081019060c0810160a0820135600160201b811115610be457600080fd5b820183602082011115610bf657600080fd5b803590602001918460018302840111600160201b83111715610c1757600080fd5b50909250905061237e565b348015610c2e57600080fd5b506104a56123fc565b348015610c4357600080fd5b5061065b60048036036020811015610c5a57600080fd5b5035612402565b348015610c6d57600080fd5b50610526612429565b348015610c8257600080fd5b506106a860048036036020811015610c9957600080fd5b503561244a565b348015610cac57600080fd5b506106a860048036036040811015610cc357600080fd5b508035906020013560ff16612a3f565b348015610cdf57600080fd5b506104a5612e6a565b348015610cf457600080fd5b5061065b60048036036020811015610d0b57600080fd5b5035612e70565b348015610d1e57600080fd5b506106a86004803603610160811015610d3657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610d6957600080fd5b820183602082011115610d7b57600080fd5b803590602001918460208302840111600160201b83111715610d9c57600080fd5b919390929091602081019035600160201b811115610db957600080fd5b820183602082011115610dcb57600080fd5b803590602001918460208302840111600160201b83111715610dec57600080fd5b919350915080359060208101359060408101359060608101359060808101359060a08101359060c00135612f11565b348015610e2757600080fd5b506104a560048036036040811015610e3e57600080fd5b506001600160a01b038135169060200135613283565b348015610e6057600080fd5b5061065b60048036036040811015610e7757600080fd5b506001600160a01b038135169060200135613419565b348015610e9957600080fd5b506104a5613516565b348015610eae57600080fd5b50610ecc60048036036020811015610ec557600080fd5b503561351c565b604051808260e080838360005b83811015610ef1578181015183820152602001610ed9565b5050505090500191505060405180910390f35b348015610f1057600080fd5b506104a5613584565b348015610f2557600080fd5b506106a860048036036020811015610f3c57600080fd5b503561358a565b348015610f4f57600080fd5b50610719613703565b348015610f6457600080fd5b506104a5613717565b348015610f7957600080fd5b506104a560048036036040811015610f9057600080fd5b506001600160a01b038135811691602001351661371d565b348015610fb457600080fd5b506106a860048036036020811015610fcb57600080fd5b50356001600160a01b031661373a565b348015610fe757600080fd5b506106a860048036036020811015610ffe57600080fd5b50356138db565b34801561101157600080fd5b5061065b6004803603602081101561102857600080fd5b50356001600160a01b0316613a9b565b34801561104457600080fd5b506106a86004803603602081101561105b57600080fd5b5035613ab0565b34801561106e57600080fd5b506106a86004803603602081101561108557600080fd5b5035613ca0565b34801561109857600080fd5b5061071961413b565b6104a560048036036101008110156110b857600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e00135614141565b34801561110257600080fd5b5061071961469c565b34801561111757600080fd5b506107196146b4565b34801561112c57600080fd5b5061114a6004803603602081101561114357600080fd5b50356146ba565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561118f578181015183820152602001611177565b50505050905090810190601f1680156111bc5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6015602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60035481565b6001600160a01b038216600090815260186020526040812054600160a01b900460ff166001146112b1576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60145482106112f3576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b601560006014848154811061130457fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6040518060400160405280600a8152602001694d59535449432044414f60b01b81525081565b600061138c60045461138660085442614aa690919063ffffffff16565b90614abb565b905090565b601860205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b600081158061140157503360009081526010602090815260408083206001600160a01b0387168452909152902054155b61140a57600080fd5b3360008181526010602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60005460ff166114b4576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556114c88282614add565b50506000805460ff19166001179055565b60005460ff1661151c576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff1916815533815260186020526040902054600160a01b900460ff1660011461157b576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b6114c8338383614ba6565b600061138c600c54600b54614e6c90919063ffffffff16565b601281815481106115ac57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03831660009081526010602090815260408083203384529091528120546115f49083614aa6565b6001600160a01b0385166000818152601060209081526040808320338452825280832094909455918152601890915220600201546116329083614aa6565b6001600160a01b0380861660009081526018602052604080822060029081019490945591861681522001546116679083614e6c565b6001600160a01b038085166000908152601860209081526040808320600201949094559187168152600f90915220546116a09083614aa6565b6001600160a01b038086166000908152600f602052604080822093909355908516815220546116cf9083614e6c565b6001600160a01b038085166000818152600f60209081526040918290209490945580518681529051919392881692600080516020615f4e83398151915292918290030190a35060015b9392505050565b60005460ff16611762576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601860205260409020600101546117c3576040805162461bcd60e51b815260206004820152601360248201527231b0b63632b91010b9b430b932b437b63232b960691b604482015290519081900360640190fd5b6001600160a01b038116611813576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b0381163314611903576001600160a01b038116600090815260186020526040902054600160a01b900460ff161561188d576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601960209081526040808320549093168252601890522054600160a01b900460ff1615611903576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b33600081815260186020908152604080832080546001600160a01b0390811685526019845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506000805460ff19166001179055565b61deed81565b601281565b60005460ff166119e7576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556119fa81614e7e565b600060148281548110611a0957fe5b60009182526020808320919091015480835260159091526040909120600581015491925090600160201b900460ff16600114611a79576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611a9584615149565b60125490915061019011611aa7575060005b8015611b385760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601360205260408120805460ff1916600190811790915592546012805494850181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601660205260409020805460ff191690556002830154611b6d91166152e6565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a350506000805460ff191660011790555050565b600b5481565b60148181548110611bcc57fe5b600091825260209091200154905081565b60176020526000908152604090205460ff1681565b6019602052600090815260409020546001600160a01b031681565b60005460ff16611c50576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055838214611ca2576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611d48576000848483818110611cbb57fe5b9050602002013590508215611d1a5733600090815260116020526040812090888885818110611ce657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611d3f878784818110611d2957fe5b905060200201356001600160a01b031682614add565b50600101611ca5565b50506000805460ff1916600117905550505050565b6001546001600160a01b031681565b60005460ff16611daf576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b031683526018909152902060010154611e1c576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c623602090815260408083205481516370a0823160e01b815230600482015291519394611ec894919390926370a082319260248083019392829003018186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d6020811015611ec057600080fd5b505190614aa6565b905060008111611f09576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526013602052604090205460ff16611f65576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615f2e8339815191526020526040902054158015611f9a575060c8600d54105b15611fa957600d805460010190555b611fb661dead8383615337565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506000805460ff19166001179055565b600c5481565b60065481565b600061201c615cd1565b506001600160a01b03838116600090815260186020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a0830152151580612094575060008160600151115b6120d4576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601860205260409020600401541561212b576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b612133615d13565b600160a08201526040805160208101909152600080825261216491879190819081908190819081908c908a90615395565b5050600a54600019019392505050565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b60136020526000908152604090205460ff1681565b60125490565b60145490565b60005460ff16612215576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601860205260409020600101546122399082614aa6565b33600090815260186020526040902060018101919091556002015461225e9082614e6c565b33600090815260186020526040902060020155600b5461227e9082614aa6565b600b55600c5461228e9082614e6c565b600c5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506000805460ff19166001179055565b60085481565b600e6020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156123705780601f1061234557610100808354040283529160200191612370565b820191906000526020600020905b81548152906001019060200180831161235357829003601f168201915b505050505081565b60055481565b6000612388615d13565b6001816006602002019060ff16908160ff16815250506123e8896000808960008c8e8c898d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061539592505050565b5050600a5460001901979650505050505050565b60025481565b600061241960055483614e6c90919063ffffffff16565b612421611369565b101592915050565b604051806040016040528060058152602001644d5844414f60d81b81525081565b60005460ff1661248d576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b0316835260189091529020600101546124fa576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b60025460005461251d916101009091046001600160a01b0316903390309061570c565b61254161deaf600060019054906101000a90046001600160a01b0316600254615337565b600081815260156020526040902060018101546001600160a01b031661259a576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff16156125e0576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff161561262d576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601860205260409020600401541561268f576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b600081600901541180156126ca575060038101546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054155b156127185760c8600d5410612718576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff166001141561286c5760038101546001600160a01b031660009081526013602052604090205460ff161561278f576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526016602052604090205460ff16156127f6576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60125461019011612840576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601660205260409020805460ff19166001179055612909565b600581015465010000000000900460ff16600114156129095780546001600160a01b031660009081526017602052604090205460ff16156128e4576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601760205260409020805460ff191660011790555b6000612960612916611369565b601454156129585760148054601591600091600019810190811061293657fe5b90600052602060002001548152602001908152602001600020600a015461295b565b60005b61576c565b6001908101600a8401819055336000818152601960209081526040808320546002890180546001600160a01b0319166001600160a01b03909216918217905560058901805460ff191688179055601480549788018155938490527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9096018990559154825189815260001990910191810191909152808201849052905192945083927f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a350506000805460ff191660011790555050565b60005460ff16612a82576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b031683526018909152902060010154612aef576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601960209081526040808320546001600160a01b031680845260189092529091206014548410612b58576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60006015600060148781548110612b6b57fe5b90600052602060002001548152602001908152602001600020905060038460ff1610612bc4576040805162461bcd60e51b8152602060048201526003602482015262213c3360e81b604482015290519081900360640190fd5b60008460ff166002811115612bd557fe5b905081600a0154612be4611369565b1015612c21576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612c2e82600a0154612402565b15612c6a576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f8301602052604081205460ff166002811115612c9357fe5b14612ccd576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612cdb57fe5b1480612cf257506002816002811115612cf057fe5b145b612d2e576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f830160205260409020805482919060ff19166001836002811115612d5f57fe5b02179055506001816002811115612d7257fe5b1415612dc2576001830154600b8301805490910190556003830154861115612d9c57600383018690555b81600d0154612da9611586565b1115612dbd57612db7611586565b600d8301555b612de7565b6002816002811115612dd057fe5b1415612de7576001830154600c8301805490910190555b836001600160a01b0316336001600160a01b0316877f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a2060148a81548110612e2a57fe5b906000526020600020015489604051808381526020018260ff1681526020019250505060405180910390a450506000805460ff1916600117905550505050565b600d5481565b6014546000908210612eb5576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b6015600060148481548110612ec657fe5b90600052602060002001548152602001908152602001600020600501600160078110612eee57fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b60095460ff1615612f57576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b8b6001600160a01b03168d6001600160a01b03161415612fbe576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b898814613012576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b848610156130515760405162461bcd60e51b8152600401808060200182810382526024815260200180615f6e6024913960400191505060405180910390fd5b60005b8a8110156130fc576130938c8c8381811061306b57fe5b905060200201356001600160a01b03168b8b8481811061308757fe5b90506020020135615783565b6130ca8c8c838181106130a257fe5b905060200201356001600160a01b03168b8b848181106130be57fe5b905060200201356158b5565b6130f18a8a838181106130d957fe5b90506020020135600b54614e6c90919063ffffffff16565b600b55600101613054565b506ec097ce7bc90715b34b9f1000000000600b541115613151576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038d166000818152601360205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b031916909117905586156131d257600d805460010190556131d261dead8e89615337565b8c600060016101000a8154816001600160a01b0302191690836001600160a01b031602179055508b600160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550856002819055508460038190555083600481905550826005819055508160068190555080600781905550426008819055506001600960006101000a81548160ff02191690831515021790555061327461591e565b50505050505050505050505050565b60006001600160a01b0383166132c9576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6001546001600160a01b038481169116141561332c576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526013602052604090205460ff1615613388576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b601254610190116133d2576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b6133da615d13565b600160808201526040805160208101909152600080825261340a918190819081908990829081908b908a90615395565b5050600a546000190192915050565b336000908152601860205260408120600201546134369083614aa6565b336000908152601860205260408082206002908101939093556001600160a01b0386168252902001546134699083614e6c565b6001600160a01b038416600090815260186020908152604080832060020193909355338252600f9052205461349e9083614aa6565b336000908152600f6020526040808220929092556001600160a01b038516815220546134ca9083614e6c565b6001600160a01b0384166000818152600f6020908152604091829020939093558051858152905191923392600080516020615f4e8339815191529281900390910190a350600192915050565b60075481565b613524615d13565b600082815260156020526040808220815160e0810192839052926005909101916007918390855b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161354b575094979650505050505050565b60045481565b60005460ff166135cd576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556001546135ef906001600160a01b031633308461570c565b33600090815260186020526040902054600160a01b900460ff1660011415613646573360009081526018602052604090206001015461362e9082614e6c565b33600090815260186020526040902060010155613650565b6136503382615783565b61365a33826158b5565b600b546136679082614e6c565b600b8190556ec097ce7bc90715b34b9f100000000010156136bd576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917fce3ea4745ffbcdb1833febb705a9558eb9362e915a0ff60625532831df6b375c919081900360200190a2506000805460ff19166001179055565b60005461010090046001600160a01b031681565b600a5481565b601060209081526000928352604080842090915290825290205481565b60005460ff1661377d576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155338152601960209081526040808320546001600160a01b0316835260189091529020600101546137ea576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660009081526018602052604090206004810154613842576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b6000816002015411613883576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6138908160030154612e70565b6138cb5760405162461bcd60e51b8152600401808060200182810382526041815260200180615eed6041913960600191505060405180910390fd5b6114c88260008360020154614ba6565b60005460ff1661391e576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19168155818152601560205260409020600581015460ff161561397a576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff16156139c7576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613a14576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613a549261deaf926001600160a01b039182169291169061592d565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506000805460ff19166001179055565b60166020526000908152604090205460ff1681565b60005460ff16613af3576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055613b0681614e7e565b600060148281548110613b1557fe5b6000918252602080832091909101548083526015909152604090912060058101549192509065010000000000900460ff16600114613b82576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613b9e84615149565b90508015613c225760058201805462ff000019166201000017905581546001600160a01b031660009081526018602052604090206004810185905560018101546002820154613bec91614e6c565b60028201556001810154600b54613c0291614aa6565b600b556001810154600c54613c1691614e6c565b600c5560006001909101555b81546001600160a01b039081166000908152601760205260409020805460ff191690556002830154613c5491166152e6565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a350506000805460ff191660011790555050565b60005460ff16613ce3576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff19169055613cf681614e7e565b600060148281548110613d0557fe5b60009182526020808320919091015480835260159091526040909120600581015491925090600160201b900460ff16158015613d4f5750600581015465010000000000900460ff16155b8015613d6a575060058101546601000000000000900460ff16155b613da7576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613dc384615149565b90506ec097ce7bc90715b34b9f1000000000613df38360070154613ded8560060154613ded611586565b90614e6c565b1115613dfd575060005b60048201546001600160a01b03166000908152600080516020615f2e833981519152602052604090205460088301541115613e36575060005b60008260090154118015613e71575060038201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054155b8015613e80575060c8600d5410155b15613e89575060005b80156140ad5760058201805462ff000019166201000017905581546001600160a01b0316600090815260186020526040902054600160a01b900460ff1660011415613f5b57600682015482546001600160a01b0316600090815260186020526040902060010154613ef991614e6c565b82546001600160a01b03908116600090815260186020526040808220600101939093556007850154855490921681529190912060020154613f3991614e6c565b82546001600160a01b0316600090815260186020526040902060020155613f75565b81546006830154613f75916001600160a01b031690615783565b815460078301546006840154613f9e926001600160a01b031691613f999190614e6c565b6158b5565b6006820154600b54613faf91614e6c565b600b556007820154600c54613fc391614e6c565b600c5560038201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614001575060008260090154115b1561401057600d805460010190555b600382015460098301546140359161deaf9161dead916001600160a01b03169061592d565b81546004830154600884015461405d9261dead926001600160a01b039182169291169061592d565b60048201546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614098575060008260080154115b156140a857600d80546000190190555b6140d8565b6001820154600383015460098401546140d89261deaf926001600160a01b039182169291169061592d565b60028201546140ef906001600160a01b03166152e6565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a350506000805460ff191660011790555050565b61deaf81565b6000805460ff16614185576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff191690556ec097ce7bc90715b34b9f10000000006141a98989614e6c565b11156141ea576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526013602052604090205460ff16614257576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526013602052604090205460ff166142c4576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead148015906142ea57506001600160a01b03891661deaf14155b801561430157506001600160a01b03891661deed14155b61434b576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b038916600090815260186020526040902060040154156143ac576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b6000861180156143df57506001600160a01b0385166000908152600080516020615f2e8339815191526020526040902054155b1561442d5760c8600d541061442d576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480156144595750600034115b1561462f578534146144a0576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156144ef57600080fd5b505af1158015614503573d6000803e3d6000fd5b50506040516000925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2915034908381818185875af1925050503d806000811461455d576040519150601f19603f3d011682016040523d82523d6000602084013e614562565b606091505b50509050806145a3576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152306004820152346024820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29163a9059cbb9160448083019260209291908290030181600087803b1580156145fc57600080fd5b505af1158015614610573d6000803e3d6000fd5b505050506040513d602081101561462657600080fd5b50614644915050565b6146446001600160a01b03861633308961570c565b61465161deaf8688615337565b614659615d13565b61467a8a8a8a8a8a8a8a8a8960405180602001604052806000815250615395565b5050600a54600019016000805460ff1916600117905598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b6000805460609060ff16614701576040805162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b604482015290519081900360640190fd5b6000805460ff1916905561471483614e7e565b60006014848154811061472357fe5b600091825260208083209190910154808352600e825260408084206015909352909220600581015492935090916601000000000000900460ff1660011461479b576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff00191661010017905560006147b787615149565b60015460048401549192506001600160a01b0391821691161480156148555750600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561482257600080fd5b505afa158015614836573d6000803e3d6000fd5b505050506040513d602081101561484c57600080fd5b50516008830154115b1561485e575060005b60048201546001600160a01b031660009081526013602052604090205460ff1680156148b6575060048201546001600160a01b03166000908152600080516020615f2e83398151915260205260409020546008830154115b156148bf575060005b47826009015411156148cf575060005b8015614a545760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156149655780601f10614943576101008083540402835291820191614965565b820191906000526020600020905b815481529060010190602001808311614951575b505091505060006040518083038185875af1925050503d80600081146149a7576040519150601f19603f3d011682016040523d82523d6000602084013e6149ac565b606091505b5060048601546001600160a01b0316600090815260136020526040902054919350915060ff1615614a4557600484015460088501546149fa9161dead916001600160a01b0390911690615943565b60048401546001600160a01b03166000908152600080516020615f2e8339815191526020526040902054158015614a35575060008460080154115b15614a4557600d80546000190190555b9096509450614a929350505050565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b6000805460ff191660011790559092909150565b600082821115614ab557600080fd5b50900390565b6000808211614ac957600080fd5b6000828481614ad457fe5b04949350505050565b3360009081526011602090815260408083206001600160a01b0386168452909152902054811115614b40576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b614b546001600160a01b03831633836159a3565b614b5f338383615943565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b6000614bb0611586565b6001600160a01b0385166000908152601860205260409020600181015491925090841115614c0f576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b8281600201541015614c50576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b614c5d8160030154612e70565b614c985760405162461bcd60e51b8152600401808060200182810382526041815260200180615eed6041913960600191505060405180910390fd5b6000614ca48585614e6c565b9050614cb086826159fa565b6001820154614cbf9086614aa6565b60018301556002820154614cd39085614aa6565b6002830155600b54614ce59086614aa6565b600b55600c54614cf59085614aa6565b600c5560005b601254811015614e205761dead6000908152601160205260128054614d6391600080516020615f2e8339815191529184919086908110614d3757fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615a62565b90508015614e175761dead60009081526011602052601280548392600080516020615f2e83398151915292909186908110614d9a57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526011909252908120601280548493919086908110614deb57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614cfb565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a2505050505050565b60008282018381101561171857600080fd5b6014548110614ec0576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614ec8615d31565b6015600060148481548110614ed957fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b0390811682526001830154811695820195909552600282015485168185015260038201548516606082015260048201549094166080850152825160e0810193849052909260a085019260058501916007918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614f5f5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050615012600654613ded600554846101400151614e6c90919063ffffffff16565b61501a611369565b1015615056576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff16156150a0576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b811580615101575060156000601460018503815481106150bc57fe5b906000526020600020015481526020019081526020016000206005016001600781106150e457fe5b602091828204019190069054906101000a900460ff1660ff166001145b615145576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b6000615153615d31565b601560006014858154811061516457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b0390811682526001830154811695820195909552600282015485168185015260038201548516606082015260048201549094166080850152825160e0810193849052909260a085019260058501916007918390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116151ea5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050806101800151816101600151111561529457600191505b806101a001516152ae6007546152a8611586565b90615ab6565b10156152b957600091505b80516001600160a01b0316600090815260186020526040902060040154156152e057600091505b50919050565b61530b61deaf33600060019054906101000a90046001600160a01b031660035461592d565b61533461deaf82600060019054906101000a90046001600160a01b03166003546002540361592d565b50565b6001600160a01b0392831660009081526011602090815260408083209490951682529283528381208054830190557f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c62390925291902080549091019055565b61539d615d31565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066007811061544657fe5b602002015160ff166001141561547a57600a546000908152600e60209081526040909120835161547892850190615db1565b505b600a54600090815260156020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a082015182919061551b9060058301906007615e2f565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050600060196000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b0316336001600160a01b03168d6001600160a01b03167f698b6b5a7173505e04fab049527190ad00a5d40a2dfb3d6e811f0e9c47c00c058e8e8e8e8e8e8e8e8e600a54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600760200280838360005b8381101561566c578181015183820152602001615654565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156156b257818101518382015260200161569a565b50505050905090810190601f1680156156df5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600a8054600101905550505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615766908590615add565b50505050565b60008183101561577c5781611718565b5090919050565b6001600160a01b03808316600090815260196020908152604080832054909316825260189052205460ff600160a01b909104166001141561580b576001600160a01b0380831660009081526019602090815260408083205490931680835283832080546001600160a01b03199081168317909155601890925292909120805490911690911790555b6040805160c0810182526001600160a01b03938416808252600160208084018281528486019687526000606086018181526080870182815260a088018381528784526018865289842098518954955160ff16600160a01b0260ff60a01b1991909d166001600160a01b031996871617169b909b1788559851948701949094559251600286015595516003850155955160049093019290925560199094522080549091169091179055565b6001600160a01b0382166000908152600f60205260409020546158d89082614e6c565b6001600160a01b0383166000818152600f60209081526040808320949094558351858152935192939192600080516020615f4e8339815191529281900390910190a35050565b6000805460ff19166001179055565b615938848383615943565b615766838383615337565b6001600160a01b039283166000908152601160209081526040808320949095168252928352838120805483900390557f57db7c30545d4d48d1c5d59f308748a14de480f9ecd985c3dc261a416ac0c6239092529190208054919091039055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526159f5908490615add565b505050565b6001600160a01b0382166000908152600f6020526040902054615a1d9082614aa6565b6001600160a01b0383166000818152600f6020908152604080832094909455835185815293519193600080516020615f4e833981519152929081900390910190a35050565b600081615a6e57600080fd5b83615a7b57506000611718565b83830283858281615a8857fe5b041415615aa157828181615a9857fe5b04915050611718565b83838681615aab57fe5b040295945050505050565b600082615ac55750600061133d565b82820282848281615ad257fe5b041461171857600080fd5b615aef826001600160a01b0316615c95565b615b40576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7e5780518252601f199092019160209182019101615b5f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615be0576040519150601f19603f3d011682016040523d82523d6000602084013e615be5565b606091505b509150915081615c3c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561576657808060200190516020811015615c5857600080fd5b50516157665760405162461bcd60e51b815260040180806020018281038252602a815260200180615f92602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615cc957508115155b949350505050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b6040518060e001604052806007906020820280368337509192915050565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615d69615d13565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615df257805160ff1916838001178555615e1f565b82800160010185558215615e1f579182015b82811115615e1f578251825591602001919060010190615e04565b50615e2b929150615ebe565b5090565b600183019183908215615eb25791602002820160005b83821115615e8357835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615e45565b8015615eb05782816101000a81549060ff0219169055600101602081600001049283019260010302615e83565b505b50615e2b929150615ed3565b5b80821115615e2b5760008155600101615ebf565b5b80821115615e2b57805460ff19168155600101615ed456fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f63657373657397847ee99463795296047093514439c3127772df3715e628aa85601cf8541716ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122001a0c3df97f03f368990c0294d99aa3753c3f3433da1a3ca5830090b43f26d8664736f6c634300060c0033

Deployed Bytecode Sourcemap

3495:41211:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10700:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10700:45:0;;:::i;:::-;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4057:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38387:344;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38387:344:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;5322:42;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38249:126;;;;;;;;;;;;;:::i;10871:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10871:41:0;-1:-1:-1;;;;;10871:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;10871:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41387:307;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41387:307:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34349:128;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34349:128:0;;;;;;;;:::i;:::-;;31903:220;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31903:220:0;;;;;;;:::i;43445:106::-;;;;;;;;;;;;;:::i;10566:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10566:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;10566:31:0;;;;;;;;;;;;;;44091:612;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44091:612:0;;;;;;;;;;;;;;;;;:::i;36675:856::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36675:856:0;-1:-1:-1;;;;;36675:856:0;;:::i;7577:47::-;;;;;;;;;;;;;:::i;5280:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28164:943;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28164:943:0;;:::i;7701:26::-;;;;;;;;;;;;;:::i;10663:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10663:30:0;;:::i;10812:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10812:46:0;-1:-1:-1;;;;;10812:46:0;;:::i;10919:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10919:61:0;-1:-1:-1;;;;;10919:61:0;;:::i;34485:516::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34485:516:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34485:516:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34485:516:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34485:516:0;;;;;;;;;;;;-1:-1:-1;34485:516:0;-1:-1:-1;34485:516:0;;;;:::i;3759:25::-;;;;;;;;;;;;;:::i;35364:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35364:644:0;-1:-1:-1;;;;;35364:644:0;;:::i;7769:24::-;;;;;;;;;;;;;:::i;4349:32::-;;;;;;;;;;;;;:::i;16446:600::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16446:600:0;;;;;;;;:::i;8005:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8005:44:0;-1:-1:-1;;;;;8005:44:0;;:::i;39126:146::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39126:146:0;;;;;;;;;;:::i;10604:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10604:46:0;-1:-1:-1;;;;;10604:46:0;;:::i;39014:104::-;;;;;;;;;;;;;:::i;38890:112::-;;;;;;;;;;;;;:::i;42778:430::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42778:430:0;;:::i;4554:28::-;;;;;;;;;;;;;:::i;7929:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7929:40:0;;:::i;4276:33::-;;;;;;;;;;;;;:::i;15031:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15031:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15031:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15031:677:0;;;;;;;;;;-1:-1:-1;15031:677:0;;-1:-1:-1;15031:677:0;-1:-1:-1;15031:677:0;:::i;3989:30::-;;;;;;;;;;;;;:::i;37883:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37883:169:0;;:::i;5371:39::-;;;;;;;;;;;;;:::i;18592:2193::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18592:2193:0;;:::i;20846:1792::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20846:1792:0;;;;;;;;;:::i;7833:35::-;;;;;;;;;;;;;:::i;37628:247::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37628:247:0;;:::i;11134:1814::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11134:1814:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11134:1814:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11134:1814:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11134:1814:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11134:1814:0;;;;;;;;;;;;-1:-1:-1;11134:1814:0;-1:-1:-1;11134:1814:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15720:714::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15720:714:0;;;;;;;;:::i;43559:520::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43559:520:0;;;;;;;;:::i;4421:28::-;;;;;;;;;;;;;:::i;38739:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38739:139:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4178:29;;;;;;;;;;;;;:::i;41931:835::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41931:835:0;;:::i;3672:27::-;;;;;;;;;;;;;:::i;7637:28::-;;;;;;;;;;;;;:::i;8080:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8080:64:0;;;;;;;;;;:::i;33859:478::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33859:478:0;-1:-1:-1;;;;;33859:478:0;;:::i;36130:537::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36130:537:0;;:::i;10754:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10754:51:0;-1:-1:-1;;;;;10754:51:0;;:::i;29115:1064::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29115:1064:0;;:::i;22646:3433::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22646:3433:0;;:::i;7522:48::-;;;;;;;;;;;;;:::i;13032:1987::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13032:1987:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3850:73::-;;;;;;;;;;;;;:::i;7468:47::-;;;;;;;;;;;;;:::i;26091:2065::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26091:2065:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10700:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4057:31::-;;;;:::o;38387:344::-;-1:-1:-1;;;;;38512:22:0;;38487:4;38512:22;;;:7;:22;;;;;:29;-1:-1:-1;;;38512:29:0;;;;38545:1;38512:34;38504:54;;;;;-1:-1:-1;;;38504:54:0;;;;;;;;;;;;-1:-1:-1;;;38504:54:0;;;;;;;;;;;;;;;38593:13;:20;38577:36;;38569:58;;;;;-1:-1:-1;;;38569:58:0;;;;;;;;;;;;-1:-1:-1;;;38569:58:0;;;;;;;;;;;;;;;38655:9;:39;38665:13;38679;38665:28;;;;;;;;;;;;;;;;;;;;38655:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;38655:68:0;;;;:53;;:68;;;;;;;;;-1:-1:-1;38387:344:0;;;;;:::o;5322:42::-;;;;;;;;;;;;;;-1:-1:-1;;;5322:42:0;;;;:::o;38249:126::-;38298:7;38325:42;38352:14;;38325:22;38333:13;;38325:3;:7;;:22;;;;:::i;:::-;:26;;:42::i;:::-;38318:49;;38249:126;:::o;10871:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10871:41:0;;;-1:-1:-1;;;10871:41:0;;;;;;;;:::o;41387:307::-;41455:4;41480:11;;;:50;;-1:-1:-1;41505:10:0;41495:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;41495:30:0;;;;;;;;;;:35;41480:50;41472:59;;;;;;41562:10;41552:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;41552:30:0;;;;;;;;;;;;:39;;;41617:37;;;;;;;41552:30;;41562:10;41617:37;;;;;;;;;;;-1:-1:-1;41682:4:0;41387:307;;;;:::o;34349:128::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;34438:31:::1;34455:5:::0;34462:6;34438:16:::1;:31::i;:::-;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;34349:128::o;31903:220::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;32012:10:::1;32004:19:::0;;:7:::1;:19;::::0;;;;:26;-1:-1:-1;;;32004:26:0;::::1;3416:19:::0;32004:26:::1;3416:19:::0;32004:31:::1;31996:51;;;::::0;;-1:-1:-1;;;31996:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31996:51:0;;;;;;;;;;;;;::::1;;32068:47;32078:10;32090:12;32104:10;32068:9;:47::i;43445:106::-:0;43489:7;43517:26;43533:9;;43517:11;;:15;;:26;;;;:::i;10566:31::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10566:31:0;;-1:-1:-1;10566:31:0;:::o;44091:612::-;-1:-1:-1;;;;;44239:17:0;;44190:4;44239:17;;;:9;:17;;;;;;;;44257:10;44239:29;;;;;;;;:49;;44273:14;44239:33;:49::i;:::-;-1:-1:-1;;;;;44207:17:0;;;;;;:9;:17;;;;;;;;44225:10;44207:29;;;;;;;:81;;;;44322:15;;;:7;:15;;;;:20;;;:40;;44347:14;44322:24;:40::i;:::-;-1:-1:-1;;;;;44299:15:0;;;;;;;:7;:15;;;;;;:20;;;;:63;;;;44399:18;;;;;;:23;;:43;;44427:14;44399:27;:43::i;:::-;-1:-1:-1;;;;;44373:18:0;;;;;;;:7;:18;;;;;;;;:23;;:69;;;;44483:17;;;;;:9;:17;;;;;:37;;44505:14;44483:21;:37::i;:::-;-1:-1:-1;;;;;44463:17:0;;;;;;;:9;:17;;;;;;:57;;;;44554:20;;;;;;;:40;;44579:14;44554:24;:40::i;:::-;-1:-1:-1;;;;;44531:20:0;;;;;;;:9;:20;;;;;;;;;:63;;;;44620:43;;;;;;;44531:20;;44620:43;;;;-1:-1:-1;;;;;;;;;;;44620:43:0;;;;;;;;-1:-1:-1;44691:4:0;44091:612;;;;;;:::o;36675:856::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;36775:10:::1;36767:19:::0;;:7:::1;:19;::::0;;;;3416;36767:26:::1;::::0;36759:62:::1;;;::::0;;-1:-1:-1;;;36759:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36759:62:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;36840:28:0;::::1;36832:59;;;::::0;;-1:-1:-1;;;36832:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36832:59:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;36994:28:0;::::1;37012:10;36994:28;36990:233;;-1:-1:-1::0;;;;;37047:23:0;::::1;;::::0;;;:7:::1;:23;::::0;;;;:30;-1:-1:-1;;;37047:30:0;::::1;;;:35:::0;37039:66:::1;;;::::0;;-1:-1:-1;;;37039:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37039:66:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37136:42:0;;::::1;37128:51;37136:42:::0;;;:26:::1;:42;::::0;;;;;;;;;;::::1;37128:51:::0;;:7:::1;:51:::0;;;:58;-1:-1:-1;;;37128:58:0;::::1;;;:63:::0;37120:91:::1;;;::::0;;-1:-1:-1;;;37120:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37120:91:0;;;;;;;;;;;;;::::1;;37267:10;37235:21;37259:19:::0;;;:7:::1;:19;::::0;;;;;;;37316:18;;-1:-1:-1;;;;;37316:18:0;;::::1;37289:46:::0;;:26:::1;:46:::0;;;;;:59;;-1:-1:-1;;;;;;37289:59:0;;::::1;::::0;;;37359:42;;::::1;::::0;;;;;;;:55;;;::::1;::::0;::::1;::::0;;37425:35;;::::1;::::0;::::1;::::0;;37478:45;;;;;;;37259:19;;37267:10;37478:45:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;36675:856::o;7577:47::-;7617:6;7577:47;:::o;5280:35::-;5313:2;5280:35;:::o;28164:943::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;28254:45:::1;28285:13:::0;28254:30:::1;:45::i;:::-;28312:18;28333:13;28347;28333:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;28400:21;;;:9:::1;:21:::0;;;;;;;28442:14:::1;::::0;::::1;:17:::0;28333:28;;-1:-1:-1;28400:21:0;-1:-1:-1;;;28442:17:0;::::1;;;28463:1;28442:22;28434:45;;;::::0;;-1:-1:-1;;;28434:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28434:45:0;;;;;;;;;;;;;::::1;;28492:14;::::0;::::1;:21:::0;;-1:-1:-1;;28492:21:0::1;;;::::0;;:17;28554:23:::1;28563:13:::0;28554:8:::1;:23::i;:::-;28594:14;:21:::0;28539:38;;-1:-1:-1;5082:3:0::1;-1:-1:-1::0;28590:98:0::1;;-1:-1:-1::0;28671:5:0::1;28590:98;28704:7;28700:197;;;28728:14;::::0;::::1;:21:::0;;-1:-1:-1;;28728:21:0::1;::::0;::::1;::::0;;28798::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28798:21:0;;::::1;28728:17:::0;28775:46;;;:14:::1;28728:17;28775:46:::0;;;;:53;;-1:-1:-1;;28775:53:0::1;28748:1;28775:53:::0;;::::1;::::0;;;28863:21;;28843:14:::1;:42:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;28863:21;;;::::1;-1:-1:-1::0;;;;;;28843:42:0;;::::1;::::0;;;::::1;::::0;;28700:197:::1;28937:21;::::0;::::1;::::0;-1:-1:-1;;;;;28937:21:0;;::::1;28963:5;28909:51:::0;;;:19:::1;:51;::::0;;;;:59;;-1:-1:-1;;28909:59:0::1;::::0;;28996:16:::1;::::0;::::1;::::0;28981:32:::1;::::0;28996:16:::1;28981:14;:32::i;:::-;29039:60;::::0;;;::::1;;::::0;;;;29079:10;;29064:13;;29039:60:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;28164:943:0:o;7701:26::-;;;;:::o;10663:30::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10663:30:0;:::o;10812:46::-;;;;;;;;;;;;;;;:::o;10919:61::-;;;;;;;;;;;;-1:-1:-1;;;;;10919:61:0;;:::o;34485:516::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;34617:31;;::::1;34609:61;;;::::0;;-1:-1:-1;;;34609:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34609:61:0;;;;;;;;;;;;;::::1;;34688:9;34683:311;34701:17:::0;;::::1;34683:311;;;34740:22;34765:7;;34773:1;34765:10;;;;;;;;;;;;;34740:35;;34794:3;34790:133;;;34885:10;34867:29;::::0;;;:17:::1;:29;::::0;;;;;34897:6;;34904:1;34897:9;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34897:9:0::1;-1:-1:-1::0;;;;;34867:40:0::1;-1:-1:-1::0;;;;;34867:40:0::1;;;;;;;;;;;;;34850:57;;34790:133;34939:43;34956:6;;34963:1;34956:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;34956:9:0::1;34967:14;34939:16;:43::i;:::-;-1:-1:-1::0;34720:3:0::1;;34683:311;;;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;;;34485:516:0:o;3759:25::-;;;-1:-1:-1;;;;;3759:25:0;;:::o;35364:644::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;11069:10:::1;11042:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;11042:38:0::1;11034:47:::0;;:7:::1;:47:::0;;;;;3416:19;11034:54:::1;::::0;11026:80:::1;;;::::0;;-1:-1:-1;;;11026:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11026:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35517:31:0;::::2;35448:23;35517:31:::0;;;:24;::::2;:31:::0;;;:24;:31;;;;35474:38;;-1:-1:-1;;;35474:38:0;;35506:4:::2;35474:38;::::0;::::2;::::0;;;35448:23;;35474:75:::2;::::0;35517:31;;;;35474:23:::2;::::0;:38;;;;;35517:24;35474:38;;;;;35517:31;35474:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35474:38:0;;:42:::2;:75::i;:::-;35448:101;;35671:1;35653:15;:19;35645:39;;;::::0;;-1:-1:-1;;;35645:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35645:39:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35703:21:0;::::2;;::::0;;;:14:::2;:21;::::0;;;;;::::2;;35695:46;;;::::0;;-1:-1:-1;;;35695:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35695:46:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35766:31:0;::::2;:24;:31:::0;;;-1:-1:-1;;;;;;;;;;;35766:24:0::2;:31:::0;:24;:31;;;:36;:88;::::2;;;;5177:3;35806:20;;:48;35766:88;35762:122;;;35857:20;:25:::0;;35881:1:::2;35857:25;::::0;;35762:122:::2;35894:49;7508:6;35920:5;35927:15;35894:18;:49::i;:::-;35961:39;::::0;;;;;;;-1:-1:-1;;;;;35961:39:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;35364:644::o;7769:24::-;;;;:::o;4349:32::-;;;;:::o;16446:600::-;16536:18;16567:20;;:::i;:::-;-1:-1:-1;;;;;;16590:21:0;;;;;;;:7;:21;;;;;;;;;16567:44;;;;;;;;;;;;;;-1:-1:-1;;;16567:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16632:17;;;:36;;;16667:1;16653:6;:11;;;:15;16632:36;16624:61;;;;;-1:-1:-1;;;16624:61:0;;;;;;;;;;;;-1:-1:-1;;;16624:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16704:21:0;;;;;;:7;:21;;;;;:28;;;:33;16696:52;;;;;-1:-1:-1;;;16696:52:0;;;;;;;;;;;;-1:-1:-1;;;16696:52:0;;;;;;;;;;;;;;;16761:21;;:::i;:::-;16880:1;16869:8;;;:12;16908:85;;;16869:8;16908:85;;;;;16938:1;16908:85;;;;;16924:12;;16938:1;;;;;;;;;;;16974:7;;16869:5;;16908:15;:85::i;:::-;-1:-1:-1;;17021:13:0;;-1:-1:-1;;17021:17:0;;16446:600;-1:-1:-1;;;16446:600:0:o;8005:44::-;;;;;;;;;;;;;:::o;39126:146::-;-1:-1:-1;;;;;39234:23:0;;;39207:7;39234:23;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;;39126:146::o;10604:46::-;;;;;;;;;;;;;;;:::o;39014:104::-;39089:14;:21;39014:104;:::o;38890:112::-;38974:13;:20;38890:112;:::o;42778:430::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;42899:10:::1;42891:19:::0;;:7:::1;:19;::::0;;;;3416;42891:26:::1;::::0;:44:::1;::::0;42922:12;42891:30:::1;:44::i;:::-;42870:10;42862:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;::::0;::::1;:73:::0;;;;42973:24:::1;;::::0;:42:::1;::::0;43002:12;42973:28:::1;:42::i;:::-;42954:10;42946:19;::::0;;;:7:::1;:19;::::0;;;;:24:::1;;:69:::0;43050:11:::1;::::0;:29:::1;::::0;43066:12;43050:15:::1;:29::i;:::-;43036:11;:43:::0;43102:9:::1;::::0;:27:::1;::::0;43116:12;43102:13:::1;:27::i;:::-;43090:9;:39:::0;43155:45:::1;::::0;;;;;;;43175:10:::1;::::0;43155:45:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;42778:430::o;4554:28::-;;;;:::o;7929:40::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7929:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4276:33::-;;;;:::o;15031:677::-;15347:18;15388:21;;:::i;:::-;15507:1;15496:5;15502:1;15496:8;;;:12;;;;;;;;;;;15545:110;15561:8;15571:1;15574;15577:11;15598:1;15602:17;15621:11;15634:7;15643:5;15650:4;;15545:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15545:15:0;;-1:-1:-1;;;15545:110:0:i;:::-;-1:-1:-1;;15683:13:0;;-1:-1:-1;;15683:17:0;15031:677;;;;;;;;;:::o;3989:30::-;;;;:::o;37883:169::-;37960:4;38006:38;38025:18;;38006:14;:18;;:38;;;;:::i;:::-;37984:18;:16;:18::i;:::-;:60;;;37883:169;-1:-1:-1;;37883:169:0:o;5371:39::-;;;;;;;;;;;;;;-1:-1:-1;;;5371:39:0;;;;:::o;18592:2193::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;11069:10:::1;11042:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;11042:38:0::1;11034:47:::0;;:7:::1;:47:::0;;;;;3416:19;11034:54:::1;::::0;11026:80:::1;;;::::0;;-1:-1:-1;;;11026:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11026:80:0;;;;;;;;;;;;;::::1;;18855:15:::2;::::0;18797:12:::2;::::0;18790:81:::2;::::0;18797:12:::2;::::0;;::::2;-1:-1:-1::0;;;;;18797:12:0::2;::::0;18828:10:::2;::::0;18848:4:::2;::::0;18790:37:::2;:81::i;:::-;18882:57;7563:6;18909:12;;;;;;;;;-1:-1:-1::0;;;;;18909:12:0::2;18923:15;;18882:18;:57::i;:::-;18952:25;18980:21:::0;;;:9:::2;:21;::::0;;;;19022:17:::2;::::0;::::2;::::0;-1:-1:-1;;;;;19022:17:0::2;19014:53;;;::::0;;-1:-1:-1;;;19014:53:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19014:53:0;;;;;;;;;;;;;::::2;;19086:14;::::0;::::2;:17:::0;::::2;;:22:::0;19078:44:::2;;;::::0;;-1:-1:-1;;;19078:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19078:44:0;;;;;;;;;;;;;::::2;;19141:14;::::0;::::2;:17:::0;;;::::2;;;:22:::0;19133:44:::2;;;::::0;;-1:-1:-1;;;19133:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19133:44:0;;;;;;;;;;;;;::::2;;19204:18:::0;;-1:-1:-1;;;;;19204:18:0::2;19196:27;::::0;;;:7:::2;:27;::::0;;;;:34:::2;;::::0;:39;19188:68:::2;;;::::0;;-1:-1:-1;;;19188:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19188:68:0;;;;;;;;;;;;;::::2;;19299:1;19273:8;:23;;;:27;:83;;;;-1:-1:-1::0;19329:21:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;19329:21:0::2;19304:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;19304:24:0::2;:47:::0;:24;:47;;;:52;19273:83:::2;19269:192;;;5177:3;19381:20;;:48;19373:76;;;::::0;;-1:-1:-1;;;19373:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19373:76:0;;;;;;;;;;;;;::::2;;19508:14;::::0;::::2;:17:::0;-1:-1:-1;;;19508:17:0;::::2;;;19529:1;19508:22;19504:601;;;19579:21;::::0;::::2;::::0;-1:-1:-1;;;;;19579:21:0::2;19556:46;::::0;;;:14:::2;:46;::::0;;;;;::::2;;19555:47;19547:71;;;::::0;;-1:-1:-1;;;19547:71:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19547:71:0;;;;;;;;;;;;;::::2;;19670:21;::::0;::::2;::::0;-1:-1:-1;;;;;19670:21:0::2;19642:51;::::0;;;:19:::2;:51;::::0;;;;;::::2;;19641:52;19633:83;;;::::0;;-1:-1:-1;;;19633:83:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19633:83:0;;;;;;;;;;;;;::::2;;19739:14;:21:::0;5082:3:::2;-1:-1:-1::0;19731:77:0::2;;;::::0;;-1:-1:-1;;;19731:77:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19731:77:0;;;;;;;;;;;;;::::2;;19851:21;::::0;::::2;::::0;-1:-1:-1;;;;;19851:21:0::2;19823:51;::::0;;;:19:::2;:51;::::0;;;;:58;;-1:-1:-1;;19823:58:0::2;19877:4;19823:58;::::0;;19504:601:::2;;;19937:14;::::0;::::2;:17:::0;;;::::2;;;19958:1;19937:22;19933:172;;;20000:18:::0;;-1:-1:-1;;;;;20000:18:0::2;19985:34;::::0;;;:14:::2;:34;::::0;;;;;::::2;;19984:35;19976:61;;;::::0;;-1:-1:-1;;;19976:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19976:61:0;;;;;;;;;;;;;::::2;;20067:18:::0;;-1:-1:-1;;;;;20067:18:0::2;20052:34;::::0;;;:14:::2;:34;::::0;;;;:41;;-1:-1:-1;;20052:41:0::2;20089:4;20052:41;::::0;;19933:172:::2;20165:22;20190:159;20208:18;:16;:18::i;:::-;20241:13;:20:::0;:25;:97:::2;;20283:13;20297:20:::0;;20273:9:::2;::::0;:50:::2;::::0;-1:-1:-1;;20297:24:0;;;20283:39;::::2;;;;;;;;;;;;;20273:50;;;;;;;;;;;:65;;;20241:97;;;20269:1;20241:97;20190:3;:159::i;:::-;20352:1;20190:163:::0;;::::2;20366:23;::::0;::::2;:40:::0;;;20470:10:::2;20419:21;20443:38:::0;;;:26:::2;:38;::::0;;;;;;;;20492:16:::2;::::0;::::2;:32:::0;;-1:-1:-1;;;;;;20492:32:0::2;-1:-1:-1::0;;;;;20443:38:0;;::::2;20492:32:::0;;::::2;::::0;;20537:14:::2;::::0;::::2;:21:::0;;-1:-1:-1;;20537:21:0::2;::::0;::::2;::::0;;20625:13:::2;:30:::0;;;;::::2;::::0;;;;;;;;;::::2;::::0;;;20736:20;;20681:96;;;;;-1:-1:-1;;20736:24:0;;;20681:96;;::::2;::::0;;;;;;;;;;;;20190:163;;-1:-1:-1;20443:38:0;;20681:96:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;18592:2193:0:o;20846:1792::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;11069:10:::1;11042:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;11042:38:0::1;11034:47:::0;;:7:::1;:47:::0;;;;;3416:19;11034:54:::1;::::0;11026:80:::1;;;::::0;;-1:-1:-1;;;11026:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11026:80:0;;;;;;;;;;;;;::::1;;21002:10:::2;20951:21;20975:38:::0;;;:26:::2;:38;::::0;;;;;;;;-1:-1:-1;;;;;20975:38:0::2;21048:22:::0;;;:7:::2;:22:::0;;;;;;21107:13:::2;:20:::0;21091:36;::::2;21083:58;;;::::0;;-1:-1:-1;;;21083:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21083:58:0;;;;;;;;;;;;;::::2;;21152:25;21180:9;:39;21190:13;21204;21190:28;;;;;;;;;;;;;;;;21180:39;;;;;;;;;;;21152:67;;21251:1;21240:8;:12;;;21232:28;;;::::0;;-1:-1:-1;;;21232:28:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21232:28:0;;;;;;;;;;;;;::::2;;21271:9;21288:8;21283:14;;;;;;;;;;21271:26;;21340:8;:23;;;21318:18;:16;:18::i;:::-;:45;;21310:65;;;::::0;;-1:-1:-1;;;21310:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21310:65:0;;;;;;;;;;;;;::::2;;21395:47;21418:8;:23;;;21395:22;:47::i;:::-;21394:48;21386:68;;;::::0;;-1:-1:-1;;;21386:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21386:68:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21473:37:0;::::2;21514:9;21473:37:::0;;;:22:::2;::::0;::::2;:37;::::0;;;;;::::2;;:50;::::0;::::2;;;;;;;21465:68;;;::::0;;-1:-1:-1;;;21465:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21465:68:0;;;;;;;;;;;;;::::2;;21560:8;21552:4;:16;;;;;;;;;:35;;;-1:-1:-1::0;21580:7:0::2;21572:4;:15;;;;;;;;;21552:35;21544:56;;;::::0;;-1:-1:-1;;;21544:56:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21544:56:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21613:37:0;::::2;;::::0;;;:22:::2;::::0;::::2;:37;::::0;;;;:44;;21653:4;;21613:37;-1:-1:-1;;21613:44:0::2;::::0;21653:4;21613:44:::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;21682:8:0::2;21674:4;:16;;;;;;;;;21670:685;;;21728:13;::::0;::::2;::::0;21707:17:::2;::::0;::::2;:34:::0;;;;::::2;::::0;;21873:26:::2;::::0;::::2;::::0;21857:42;::::2;21853:125;;;21920:26;::::0;::::2;:42:::0;;;21853:125:::2;22124:8;:39;;;22108:13;:11;:13::i;:::-;:55;22104:151;;;22226:13;:11;:13::i;:::-;22184:39;::::0;::::2;:55:::0;22104:151:::2;21670:685;;;22286:7;22278:4;:15;;;;;;;;;22274:81;;;22330:13;::::0;::::2;::::0;22310:16:::2;::::0;::::2;:33:::0;;;;::::2;::::0;;22274:81:::2;22606:13;-1:-1:-1::0;;;;;22538:92:0::2;22594:10;-1:-1:-1::0;;;;;22538:92:0::2;22579:13;22538:92;22549:13;22563;22549:28;;;;;;;;;;;;;;;;22621:8;22538:92;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;;;20846:1792:0:o;7833:35::-;;;;:::o;37628:247::-;37746:13;:20;37699:4;;37724:42;;37716:64;;;;;-1:-1:-1;;;37716:64:0;;;;;;;;;;;;-1:-1:-1;;;37716:64:0;;;;;;;;;;;;;;;37808:9;:45;37818:13;37832:19;37818:34;;;;;;;;;;;;;;;;37808:45;;;;;;;;;;;:51;;37860:1;37808:54;;;;;;;;;;;;;;;;;;;;;;;;;:59;;37866:1;37808:59;37801:66;;37628:247;;;:::o;11134:1814::-;11578:11;;;;11577:12;11569:36;;;;;-1:-1:-1;;;11569:36:0;;;;;;;;;;;;-1:-1:-1;;;11569:36:0;;;;;;;;;;;;;;;11641:11;-1:-1:-1;;;;;11624:28:0;:13;-1:-1:-1;;;;;11624:28:0;;;11616:66;;;;;-1:-1:-1;;;11616:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11701:42;;;11693:81;;;;;-1:-1:-1;;;11693:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11813:17;11793:16;:37;;11785:86;;;;-1:-1:-1;;;11785:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11897:9;11892:249;11912:20;;;11892:249;;;11954:48;11969:9;;11979:1;11969:12;;;;;;;;;;;;;-1:-1:-1;;;;;11969:12:0;11983:15;;11999:1;11983:18;;;;;;;;;;;;;11954:14;:48::i;:::-;12017;12032:9;;12042:1;12032:12;;;;;;;;;;;;;-1:-1:-1;;;;;12032:12:0;12046:15;;12062:1;12046:18;;;;;;;;;;;;;12017:14;:48::i;:::-;12094:35;12110:15;;12126:1;12110:18;;;;;;;;;;;;;12094:11;;:15;;:35;;;;:::i;:::-;12080:11;:49;11934:3;;11892:249;;;;4986:6;12169:11;;:30;;12161:54;;;;;-1:-1:-1;;;12161:54:0;;;;;;;;;;;;-1:-1:-1;;;12161:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;12236:29:0;;;;;;:14;:29;;;;;:36;;-1:-1:-1;;12236:36:0;12268:4;12236:36;;;;;;12283:14;:34;;;;;;;;;;;;;;-1:-1:-1;;;;;;12283:34:0;;;;;;12342:20;;12338:151;;12379:20;:25;;12403:1;12379:25;;;12419:58;7508:6;12445:13;12460:16;12419:18;:58::i;:::-;12524:13;12509:12;;:28;;;;;-1:-1:-1;;;;;12509:28:0;;;;;-1:-1:-1;;;;;12509:28:0;;;;;;12561:11;12548:10;;:24;;;;;-1:-1:-1;;;;;12548:24:0;;;;;-1:-1:-1;;;;;12548:24:0;;;;;;12601:16;12583:15;:34;;;;12647:17;12628:16;:36;;;;12692:15;12675:14;:32;;;;12739:19;12718:18;:40;;;;12789:18;12769:17;:38;;;;12834:14;12818:13;:30;;;;12875:3;12859:13;:19;;;;12903:4;12889:11;;:18;;;;;;;;;;;;;;;;;;12918:22;:20;:22::i;:::-;11134:1814;;;;;;;;;;;;;:::o;15720:714::-;15814:18;-1:-1:-1;;;;;15853:30:0;;15845:49;;;;;-1:-1:-1;;;15845:49:0;;;;;;;;;;;;-1:-1:-1;;;15845:49:0;;;;;;;;;;;;;;;15933:10;;-1:-1:-1;;;;;15913:30:0;;;15933:10;;15913:30;;15905:72;;;;;-1:-1:-1;;;15905:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15997:32:0;;;;;;:14;:32;;;;;;;;15996:33;15988:57;;;;;-1:-1:-1;;;15988:57:0;;;;;;;;;;;;-1:-1:-1;;;15988:57:0;;;;;;;;;;;;;;;16064:14;:21;5082:3;-1:-1:-1;16056:77:0;;;;;-1:-1:-1;;;16056:77:0;;;;;;;;;;;;-1:-1:-1;;;16056:77:0;;;;;;;;;;;;;;;16146:21;;:::i;:::-;16265:1;16254:8;;;:12;16292:89;;;16254:8;16292:89;;;;;16316:1;16292:89;;;;;16316:1;;;;;;16329:16;;16316:1;;;;16362:7;;16254:5;;16292:15;:89::i;:::-;-1:-1:-1;;16409:13:0;;-1:-1:-1;;16409:17:0;15720:714;;;;:::o;43559:520::-;43690:10;43638:4;43682:19;;;:7;:19;;;;;:24;;;:44;;43711:14;43682:28;:44::i;:::-;43663:10;43655:19;;;;:7;:19;;;;;;:24;;;;:71;;;;-1:-1:-1;;;;;43763:18:0;;;;;;:23;;:43;;43791:14;43763:27;:43::i;:::-;-1:-1:-1;;;;;43737:18:0;;;;;;:7;:18;;;;;;;;:23;;:69;;;;43861:10;43851:21;;:9;:21;;;;:41;;43877:14;43851:25;:41::i;:::-;43837:10;43827:21;;;;:9;:21;;;;;;:65;;;;-1:-1:-1;;;;;43926:20:0;;;;;;:40;;43951:14;43926:24;:40::i;:::-;-1:-1:-1;;;;;43903:20:0;;;;;;:9;:20;;;;;;;;;:63;;;;43992:47;;;;;;;43903:20;;44001:10;;-1:-1:-1;;;;;;;;;;;43992:47:0;;;;;;;;;-1:-1:-1;44067:4:0;43559:520;;;;:::o;4421:28::-;;;;:::o;38739:139::-;38808:15;;:::i;:::-;38843:21;;;;:9;:21;;;;;;38836:34;;;;;;;;;;38843:27;;;;;38836:34;;38843:27;;38836:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38836:34:0;;38739:139;-1:-1:-1;;;;;;;38739:139:0:o;4178:29::-;;;;:::o;41931:835::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;;42008:10;42001:70:::1;::::0;-1:-1:-1;;;;;42008:10:0::1;42037;42057:4;42064:6:::0;42001:35:::1;:70::i;:::-;42225:10;42217:19;::::0;;;:7:::1;:19;::::0;;;;:26;-1:-1:-1;;;42217:26:0;::::1;;;42247:1;42217:31;42213:272;;;42302:10;42294:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;:38:::1;::::0;42325:6;42294:30:::1;:38::i;:::-;42273:10;42265:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:67:::0;42213:272:::1;;;42439:34;42454:10;42466:6;42439:14;:34::i;:::-;42540;42555:10;42567:6;42540:14;:34::i;:::-;42599:11;::::0;:23:::1;::::0;42615:6;42599:15:::1;:23::i;:::-;42585:11;:37:::0;;;4986:6:::1;-1:-1:-1::0;42655:30:0::1;42647:54;;;::::0;;-1:-1:-1;;;42647:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42647:54:0;;;;;;;;;;;;;::::1;;42727:31;::::0;;;;;;;42739:10:::1;::::0;42727:31:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;41931:835::o;3672:27::-;;;;;;-1:-1:-1;;;;;3672:27:0;;:::o;7637:28::-;;;;:::o;8080:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;33859:478::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;11069:10:::1;11042:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;11042:38:0::1;11034:47:::0;;:7:::1;:47:::0;;;;;3416:19;11034:54:::1;::::0;11026:80:::1;;;::::0;;-1:-1:-1;;;11026:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11026:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33969:21:0;::::2;33945;33969::::0;;;:7:::2;:21;::::0;;;;34011:13:::2;::::0;::::2;::::0;34003:38:::2;;;::::0;;-1:-1:-1;;;34003:38:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34003:38:0;;;;;;;;;;;;;::::2;;34074:1;34060:6;:11;;;:15;34052:33;;;::::0;;-1:-1:-1;;;34052:33:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34052:33:0;;;;;;;;;;;;;::::2;;34168:39;34180:6;:26;;;34168:11;:39::i;:::-;34160:117;;;;-1:-1:-1::0;;;34160:117:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34290:39;34300:12;34314:1;34317:6;:11;;;34290:9;:39::i;36130:537::-:0;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;36235:21;;;:9:::1;:21;::::0;;;;36275:14:::1;::::0;::::1;:17:::0;::::1;;:22:::0;36267:44:::1;;;::::0;;-1:-1:-1;;;36267:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36267:44:0;;;;;;;;;;;;;::::1;;36330:14;::::0;::::1;:17:::0;;;::::1;;;:22:::0;36322:44:::1;;;::::0;;-1:-1:-1;;;36322:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36322:44:0;;;;;;;;;;;;;::::1;;36399:17;::::0;::::1;::::0;-1:-1:-1;;;;;36399:17:0::1;36385:10;:31;36377:53;;;::::0;;-1:-1:-1;;;36377:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36377:53:0;;;;;;;;;;;;;::::1;;36443:14;::::0;::::1;:21:::0;;-1:-1:-1;;36443:21:0::1;::::0;::::1;::::0;;36463:1:::1;36529:17:::0;::::1;::::0;36458:1:::1;36548:21:::0;::::1;::::0;36571:23:::1;::::0;::::1;::::0;36498:97:::1;::::0;7563:6:::1;::::0;-1:-1:-1;;;;;36529:17:0;;::::1;::::0;36548:21;::::1;::::0;36498:22:::1;:97::i;:::-;36621:38;::::0;;36648:10:::1;36621:38:::0;;;;36636:10;;36621:38:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;36130:537::o;10754:51::-;;;;;;;;;;;;;;;:::o;29115:1064::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;29205:45:::1;29236:13:::0;29205:30:::1;:45::i;:::-;29263:18;29284:13;29298;29284:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;29351:21;;;:9:::1;:21:::0;;;;;;;29393:14:::1;::::0;::::1;:17:::0;29284:28;;-1:-1:-1;29351:21:0;29393:17;;::::1;;;29414:1;29393:22;29385:40;;;::::0;;-1:-1:-1;;;29385:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29385:40:0;;;;;;;;;;;;;::::1;;29438:14;::::0;::::1;:21:::0;;-1:-1:-1;;29438:21:0::1;;;::::0;;:17;29500:23:::1;29509:13:::0;29500:8:::1;:23::i;:::-;29485:38;;29540:7;29536:450;;;29564:14;::::0;::::1;:21:::0;;-1:-1:-1;;29564:21:0::1;::::0;::::1;::::0;;29643:18;;-1:-1:-1;;;;;29643:18:0::1;29564:17:::0;29635:27;;;:7:::1;29564:17;29635:27:::0;;;;29677:13:::1;::::0;::::1;:29:::0;;;29584:1:::1;29793:13:::0;::::1;::::0;29579:1:::1;29777:11:::0;::::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;29763:11;::::0;::::1;:44:::0;29852:13:::1;::::0;::::1;::::0;29836:11:::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;29822:11;:44:::0;29907:13:::1;::::0;::::1;::::0;29893:9:::1;::::0;:28:::1;::::0;:13:::1;:28::i;:::-;29881:9;:40:::0;29952:1:::1;29936:13;::::0;;::::1;:17:::0;29536:450:::1;30013:18:::0;;-1:-1:-1;;;;;30013:18:0;;::::1;30035:5;29998:34:::0;;;:14:::1;:34;::::0;;;;:42;;-1:-1:-1;;29998:42:0::1;::::0;;30068:16:::1;::::0;::::1;::::0;30053:32:::1;::::0;30068:16:::1;30053:14;:32::i;:::-;30111:60;::::0;;;::::1;;::::0;;;;30151:10;;30136:13;;30111:60:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;29115:1064:0:o;22646:3433::-;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;22727:45:::1;22758:13:::0;22727:30:::1;:45::i;:::-;22785:18;22806:13;22820;22806:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;22873:21;;;:9:::1;:21:::0;;;;;;;22915:14:::1;::::0;::::1;:17:::0;22806:28;;-1:-1:-1;22873:21:0;-1:-1:-1;;;22915:17:0;::::1;;;:22:::0;:48;::::1;;;-1:-1:-1::0;22941:14:0::1;::::0;::::1;:17:::0;;;::::1;;;:22:::0;22915:48:::1;:74;;;;-1:-1:-1::0;22967:14:0::1;::::0;::::1;:17:::0;;;::::1;;;:22:::0;22915:74:::1;22907:96;;;::::0;;-1:-1:-1;;;22907:96:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22907:96:0;;;;;;;;;;;;;::::1;;23016:14;::::0;::::1;:21:::0;;-1:-1:-1;;23016:21:0::1;;;::::0;;:17;23078:23:::1;23087:13:::0;23078:8:::1;:23::i;:::-;23063:38;;4986:6;23212:71;23260:8;:22;;;23212:43;23230:8;:24;;;23212:13;:11;:13::i;:::-;:17:::0;::::1;:43::i;:71::-;:89;23208:137;;;-1:-1:-1::0;23328:5:0::1;23208:137;23530:21;::::0;::::1;::::0;-1:-1:-1;;;;;23530:21:0::1;23505:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23505:24:0::1;:47:::0;:24;:47;;;23477:25:::1;::::0;::::1;::::0;:75:::1;23473:123;;;-1:-1:-1::0;23579:5:0::1;23473:123;23747:1;23721:8;:23;;;:27;:83;;;;-1:-1:-1::0;23777:21:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;23777:21:0::1;23752:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23752:24:0::1;:47:::0;:24;:47;;;:52;23721:83:::1;:136;;;;;5177:3;23808:20;;:49;;23721:136;23717:184;;;-1:-1:-1::0;23884:5:0::1;23717:184;23945:7;23941:2009;;;23969:14;::::0;::::1;:21:::0;;-1:-1:-1;;23969:21:0::1;::::0;::::1;::::0;;24120:18;;-1:-1:-1;;;;;24120:18:0::1;23969:17:::0;24112:27;;;:7:::1;23969:17;24112:27:::0;;;;:34;-1:-1:-1;;;24112:34:0;::::1;23969:21;24112:34;23989:1;24112:39;24108:477;;;24248:24;::::0;::::1;::::0;24217:18;;-1:-1:-1;;;;;24217:18:0::1;24209:27;::::0;;;:7:::1;:27;::::0;;;;24217:18;24209:34:::1;::::0;:64:::1;::::0;:38:::1;:64::i;:::-;24180:18:::0;;-1:-1:-1;;;;;24180:18:0;;::::1;24172:27;::::0;;;:7:::1;:27;::::0;;;;;24180:18;24172:34:::1;:101:::0;;;;24364:22:::1;::::0;::::1;::::0;24335:18;;;;::::1;24327:27:::0;;;;;;:32:::1;;::::0;:60:::1;::::0;:36:::1;:60::i;:::-;24300:18:::0;;-1:-1:-1;;;;;24300:18:0::1;24292:27;::::0;;;:7:::1;:27;::::0;;;;:32:::1;;:95:::0;24108:477:::1;;;24524:18:::0;;24544:24:::1;::::0;::::1;::::0;24509:60:::1;::::0;-1:-1:-1;;;;;24524:18:0::1;::::0;24509:14:::1;:60::i;:::-;24669:18:::0;;24718:22:::1;::::0;::::1;::::0;24689:24:::1;::::0;::::1;::::0;24654:88:::1;::::0;-1:-1:-1;;;;;24669:18:0::1;::::0;24689:52:::1;::::0;:24;:28:::1;:52::i;:::-;24654:14;:88::i;:::-;24787:24;::::0;::::1;::::0;24771:11:::1;::::0;:41:::1;::::0;:15:::1;:41::i;:::-;24757:11;:55:::0;24853:22:::1;::::0;::::1;::::0;24839:9:::1;::::0;:37:::1;::::0;:13:::1;:37::i;:::-;24827:9;:49:::0;25059:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;25059:21:0::1;25034:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;25034:24:0::1;:47:::0;:24;:47;;;:52;:83;::::1;;;;25116:1;25090:8;:23;;;:27;25034:83;25030:149;;;25138:20;:25:::0;;25162:1:::1;25138:25;::::0;;25030:149:::1;25233:21;::::0;::::1;::::0;25256:23:::1;::::0;::::1;::::0;25195:85:::1;::::0;7563:6:::1;::::0;7508::::1;::::0;-1:-1:-1;;;;;25233:21:0::1;::::0;25195:22:::1;:85::i;:::-;25325:18:::0;;25345:21:::1;::::0;::::1;::::0;25368:25:::1;::::0;::::1;::::0;25295:99:::1;::::0;7508:6:::1;::::0;-1:-1:-1;;;;;25325:18:0;;::::1;::::0;25345:21;::::1;::::0;25295:22:::1;:99::i;:::-;25553:21;::::0;::::1;::::0;-1:-1:-1;;;;;25553:21:0::1;25528:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;25528:24:0::1;:47:::0;:24;:47;;;:52;:85;::::1;;;;25612:1;25584:8;:25;;;:29;25528:85;25524:151;;;25634:20;:25:::0;;-1:-1:-1;;25634:25:0;;;25524:151:::1;23941:2009;;;25872:17;::::0;::::1;::::0;25891:21:::1;::::0;::::1;::::0;25914:23:::1;::::0;::::1;::::0;25841:97:::1;::::0;7563:6:::1;::::0;-1:-1:-1;;;;;25872:17:0;;::::1;::::0;25891:21;::::1;::::0;25841:22:::1;:97::i;:::-;25977:16;::::0;::::1;::::0;25962:32:::1;::::0;-1:-1:-1;;;;;25977:16:0::1;25962:14;:32::i;:::-;26020:51;::::0;;;::::1;;::::0;;;;26051:10;;26036:13;;26020:51:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3462:11:0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;-1:-1:-1;;22646:3433:0:o;7522:48::-;7563:6;7522:48;:::o;13032:1987::-;13352:18;3378:11;;;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;4986:6:::1;13391:34;:15:::0;13411:13;13391:19:::1;:34::i;:::-;:53;;13383:77;;;::::0;;-1:-1:-1;;;13383:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13383:77:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13479:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;13471:66;;;::::0;;-1:-1:-1;;;13471:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13556:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;13548:66;;;::::0;;-1:-1:-1;;;13548:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13633:18:0;::::1;7508:6;13633:18;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;;;;;;13655:19:0;::::1;7563:6;13655:19;;13633:41;:63;;;;-1:-1:-1::0;;;;;;13678:18:0;::::1;7617:6;13678:18;;13633:63;13625:98;;;::::0;;-1:-1:-1;;;13625:98:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13625:98:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13742:18:0;::::1;;::::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;:30;13734:59:::1;;;::::0;;-1:-1:-1;;;13734:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13734:59:0;;;;;;;;;;;;;::::1;;13827:1;13810:14;:18;:65;;;;-1:-1:-1::0;;;;;;13832:38:0;::::1;:24;:38:::0;;;-1:-1:-1;;;;;;;;;;;13832:24:0::1;:38:::0;:24;:38;;;:43;13810:65:::1;13806:174;;;5177:3;13900:20;;:48;13892:76;;;::::0;;-1:-1:-1;;;13892:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13892:76:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;14130:20:0;::::1;3881:42;14130:20;:37:::0;::::1;;;;14166:1;14154:9;:13;14130:37;14126:439;;;14205:14;14192:9;:27;14184:51;;;::::0;;-1:-1:-1;;;14184:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;14184:51:0;;;;;;;;;;;;;::::1;;3881:42;-1:-1:-1::0;;;;;14250:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;14305:31:0::1;::::0;14287:12:::1;::::0;-1:-1:-1;3881:42:0::1;::::0;-1:-1:-1;14322:9:0::1;::::0;14287:12;14305:31;14287:12;14305:31;14322:9;3881:42;14305:31:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14286:50;;;14359:7;14351:28;;;::::0;;-1:-1:-1;;;14351:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;14351:28:0;;;;;;;;;;;;;::::1;;14394:46;::::0;;-1:-1:-1;;;14394:46:0;;14423:4:::1;14394:46;::::0;::::1;::::0;14430:9:::1;14394:46:::0;;;;;;3881:42:::1;::::0;14394:20:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;-1:-1:-1;3881:42:0;14394:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14126:439:0::1;::::0;-1:-1:-1;;14126:439:0::1;;14473:80;-1:-1:-1::0;;;;;14473:37:0;::::1;14511:10;14531:4;14538:14:::0;14473:37:::1;:80::i;:::-;14585:56;7563:6;14612:12;14626:14;14585:18;:56::i;:::-;14654:21;;:::i;:::-;14764:140;14780:9;14791:15;14808:13;14823:14;14839:12;14853:16;14871:12;14885:7;14894:5;14764:140;;;;;;;;;;;::::0;:15:::1;:140::i;:::-;-1:-1:-1::0;;14932:13:0::1;::::0;-1:-1:-1;;14932:17:0;3462:11;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;13032:1987;;-1:-1:-1;;;;;;;;13032:1987:0:o;3850:73::-;3881:42;3850:73;:::o;7468:47::-;7508:6;7468:47;:::o;26091:2065::-;26176:4;3378:11;;26182:12;;3378:11;;3370:33;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;-1:-1:-1;;;3370:33:0;;;;;;;;;;;;;;;3430:5;3416:19;;-1:-1:-1;;3416:19:0;;;26207:45:::1;26238:13:::0;26207:30:::1;:45::i;:::-;26273:18;26294:13;26308;26294:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;26356:19;;;:7:::1;:19:::0;;;;;;26414:9:::1;:21:::0;;;;;;26464:14:::1;::::0;::::1;:17:::0;26294:28;;-1:-1:-1;26356:19:0;;26464:17;;::::1;;;26485:1;26464:22;26456:42;;;::::0;;-1:-1:-1;;;26456:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26456:42:0;;;;;;;;;;;;;::::1;;26511:14;::::0;::::1;:21:::0;;-1:-1:-1;;26511:21:0::1;;;::::0;;:17;26573:23:::1;26582:13:::0;26573:8:::1;:23::i;:::-;26752:10;::::0;26727:21:::1;::::0;::::1;::::0;26558:38;;-1:-1:-1;;;;;;26727:21:0;;::::1;26752:10:::0;::::1;26727:35;:110:::0;::::1;;;-1:-1:-1::0;26801:10:0::1;::::0;26794:43:::1;::::0;;-1:-1:-1;;;26794:43:0;;26831:4:::1;26794:43;::::0;::::1;::::0;;;-1:-1:-1;;;;;26801:10:0;;::::1;::::0;26794:28:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;26801:10;26794:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26794:43:0;26766:25:::1;::::0;::::1;::::0;:71:::1;26727:110;26723:158;;;-1:-1:-1::0;26864:5:0::1;26723:158;27025:21;::::0;::::1;::::0;-1:-1:-1;;;;;27025:21:0::1;27010:37;::::0;;;:14:::1;:37;::::0;;;;;::::1;;:116:::0;::::1;;;-1:-1:-1::0;27104:21:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;27104:21:0::1;27079:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;27079:24:0::1;:47:::0;:24;:47;;;27051:25:::1;::::0;::::1;::::0;:75:::1;27010:116;27006:164;;;-1:-1:-1::0;27153:5:0::1;27006:164;27319:21;27293:8;:23;;;:47;27289:95;;;-1:-1:-1::0;27367:5:0::1;27289:95;27400:7;27396:670;;;27424:14;::::0;::::1;:21:::0;;-1:-1:-1;;27424:21:0::1;::::0;::::1;::::0;;27513:18;;27544:23:::1;::::0;::::1;::::0;27513:63:::1;::::0;;;27424:17;;27486:23:::1;::::0;-1:-1:-1;;;;;27513:18:0;;::::1;::::0;27544:23;;27569:6;;27513:63;;;27569:6;;27439:1:::1;-1:-1:-1::0;;27444:1:0::1;27513:63:::0;::::1;;27424:21;27513:63;::::0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27610:21:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;27610:21:0::1;27595:37;::::0;;;:14:::1;:37;::::0;;;;;27471:105;;-1:-1:-1;27471:105:0;-1:-1:-1;27595:37:0::1;;27591:421;;;27686:21;::::0;::::1;::::0;27709:25:::1;::::0;::::1;::::0;27653:82:::1;::::0;7508:6:::1;::::0;-1:-1:-1;;;;;27686:21:0;;::::1;::::0;27653:25:::1;:82::i;:::-;27907:21;::::0;::::1;::::0;-1:-1:-1;;;;;27907:21:0::1;27882:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;27882:24:0::1;:47:::0;:24;:47;;;:52;:85;::::1;;;;27966:1;27938:8;:25;;;:29;27882:85;27878:119;;;27970:20;:25:::0;;-1:-1:-1;;27970:25:0;;;27878:119:::1;28034:7:::0;;-1:-1:-1;28043:10:0;-1:-1:-1;28026:28:0::1;::::0;-1:-1:-1;;;;28026:28:0::1;27396:670;28091:57;::::0;;;::::1;;::::0;;;;28128:10;;28113:13;;28091:57:::1;::::0;;;;::::1;::::0;;::::1;3448:1;;;;;3462:11:::0;:18;;-1:-1:-1;;3462:18:0;3476:4;3462:18;;;26091:2065;;;;-1:-1:-1;26091:2065:0:o;2607:150::-;2665:7;2698:1;2693;:6;;2685:15;;;;;;-1:-1:-1;2723:5:0;;;2607:150::o;2990:149::-;3048:7;3080:1;3076;:5;3068:14;;;;;;3093:9;3109:1;3105;:5;;;;;;;2990:149;-1:-1:-1;;;;2990:149:0:o;35013:343::-;35116:10;35098:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;35098:36:0;;;;;;;;;;:46;-1:-1:-1;35098:46:0;35090:67;;;;;-1:-1:-1;;;35090:67:0;;;;;;;;;;;;-1:-1:-1;;;35090:67:0;;;;;;;;;;;;;;;35178:46;-1:-1:-1;;;;;35178:26:0;;35205:10;35217:6;35178:26;:46::i;:::-;35235:52;35261:10;35273:5;35280:6;35235:25;:52::i;:::-;35313:35;;;-1:-1:-1;;;;;35313:35:0;;;;;;;;;;;;35322:10;;35313:35;;;;;;;;35013:343;;:::o;32131:1720::-;32235:33;32271:13;:11;:13::i;:::-;-1:-1:-1;;;;;32321:22:0;;32297:21;32321:22;;;:7;:22;;;;;32364:13;;;;32235:49;;-1:-1:-1;32321:22:0;32364:29;-1:-1:-1;32364:29:0;32356:49;;;;;-1:-1:-1;;;32356:49:0;;;;;;;;;;;;-1:-1:-1;;;32356:49:0;;;;;;;;;;;;;;;32439:10;32424:6;:11;;;:25;;32416:43;;;;;-1:-1:-1;;;32416:43:0;;;;;;;;;;;;-1:-1:-1;;;32416:43:0;;;;;;;;;;;;;;;32478:39;32490:6;:26;;;32478:11;:39::i;:::-;32470:117;;;;-1:-1:-1;;;32470:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32600:27;32630:28;:12;32647:10;32630:16;:28::i;:::-;32600:58;;32715:50;32730:13;32745:19;32715:14;:50::i;:::-;32792:13;;;;:31;;32810:12;32792:17;:31::i;:::-;32776:13;;;:47;32848:11;;;;:27;;32864:10;32848:15;:27::i;:::-;32834:11;;;:41;32900:11;;:29;;32916:12;32900:15;:29::i;:::-;32886:11;:43;32952:9;;:25;;32966:10;32952:13;:25::i;:::-;32940:9;:37;32995:9;32990:787;33014:14;:21;33010:25;;32990:787;;;7508:6;33057:24;33094;;;:17;:24;;33119:14;:17;;33084:102;;-1:-1:-1;;;;;;;;;;;33094:24:0;33057;;33119:14;33134:1;;33119:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33119:17:0;33094:43;;;;;;;;;;;;;33139:19;33160:25;33084:9;:102::i;:::-;33057:129;-1:-1:-1;33205:20:0;;33201:565;;7508:6;33597:24;;;;:17;:24;;33622:14;:17;;33644:16;;-1:-1:-1;;;;;;;;;;;33597:24:0;;;33637:1;;33622:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33622:17:0;;;33597:43;;;;;;;;;;;;;;;:63;;;;;;;;;33679:32;;;;;:17;:32;;;;;;33712:14;:17;;33734:16;;33622:17;33712:14;33727:1;;33712:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33712:17:0;33679:51;;;;;;;;;;;;:71;;;;;;;33201:565;-1:-1:-1;33037:3:0;;32990:787;;;-1:-1:-1;33794:49:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33794:49:0;;;;;;;;;;;32131:1720;;;;;;:::o;2445:150::-;2503:7;2535:5;;;2559:6;;;;2551:15;;;;;31115:529;31227:13;:20;31211:36;;31203:58;;;;;-1:-1:-1;;;31203:58:0;;;;;;;;;;;;-1:-1:-1;;;31203:58:0;;;;;;;;;;;;;;;31272:24;;:::i;:::-;31299:9;:39;31309:13;31323;31309:28;;;;;;;;;;;;;;;;;;;;;31299:39;;;;;;;;;;;;;;;31272:66;;;;;;;;;-1:-1:-1;;;;;31272:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31299:39;;31272:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31381:70;31433:17;;31381:47;31409:18;;31381:8;:23;;;:27;;:47;;;;:::i;:70::-;31359:18;:16;:18::i;:::-;:92;;31351:111;;;;;-1:-1:-1;;;31351:111:0;;;;;;;;;;;;-1:-1:-1;;;31351:111:0;;;;;;;;;;;;;;;31481:14;;;;:17;;;:22;;;31473:44;;;;;-1:-1:-1;;;31473:44:0;;;;;;;;;;;;-1:-1:-1;;;31473:44:0;;;;;;;;;;;;;;;31536:18;;;:79;;;31558:9;:43;31568:13;31598:1;31582:13;:17;31568:32;;;;;;;;;;;;;;;;31558:43;;;;;;;;;;;:49;;31608:1;31558:52;;;;;;;;;;;;;;;;;;;;;;;;;:57;;31614:1;31558:57;31536:79;31528:108;;;;;-1:-1:-1;;;31528:108:0;;;;;;;;;;;;-1:-1:-1;;;31528:108:0;;;;;;;;;;;;;;;31115:529;;:::o;30187:920::-;30251:12;30276:24;;:::i;:::-;30303:9;:39;30313:13;30327;30313:28;;;;;;;;;;;;;;;;;;;;;30303:39;;;;;;;;;;;;;;;30276:66;;;;;;;;;-1:-1:-1;;;;;30276:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30303:39;;30276:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30387:8;:16;;;30367:8;:17;;;:36;30363:83;;;30430:4;30420:14;;30363:83;30575:8;:39;;;30539:32;30557:13;;30539;:11;:13::i;:::-;:17;;:32::i;:::-;30538:76;30534:124;;;30641:5;30631:15;;30534:124;30998:18;;-1:-1:-1;;;;;30990:27:0;;;;;:7;:27;;;;;:34;;;:39;30986:87;;31056:5;31046:15;;30986:87;31085:14;30187:920;;;:::o;31652:243::-;31713:74;7563:6;31744:10;31756:12;;;;;;;;;-1:-1:-1;;;;;31756:12:0;31770:16;;31713:22;:74::i;:::-;31798:89;7563:6;31829:7;31838:12;;;;;;;;;-1:-1:-1;;;;;31838:12:0;31870:16;;31852:15;;:34;31798:22;:89::i;:::-;31652:243;:::o;40670:193::-;-1:-1:-1;;;;;40763:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;40814:24;:31;;;;;;:41;;;;;;;40670:193::o;17058:1526::-;17420:24;;:::i;:::-;17447:595;;;;;;;;17483:9;-1:-1:-1;;;;;17447:595:0;;;;;17518:10;-1:-1:-1;;;;;17447:595:0;;;;;17561:1;-1:-1:-1;;;;;17447:595:0;;;;;17593:12;-1:-1:-1;;;;;17447:595:0;;;;;17635:12;-1:-1:-1;;;;;17447:595:0;;;;;17670:5;17447:595;;;;17708:15;17447:595;;;;17754:13;17447:595;;;;17801:16;17447:595;;;;17849:14;17447:595;;;;17895:1;17447:595;;;;17922:1;17447:595;;;;17948:1;17447:595;;;;17997:1;17447:595;;;;18023:7;17447:595;;;17420:622;;18067:8;:14;;;18082:1;18067:17;;;;;;;;;;;:22;;18088:1;18067:22;18063:84;;;18114:13;;18106:22;;;;:7;:22;;;;;;;;:29;;;;;;;;:::i;:::-;;18063:84;18177:13;;18167:24;;;;:9;:24;;;;;;;;;:35;;;;-1:-1:-1;;;;;;18167:35:0;;;-1:-1:-1;;;;;18167:35:0;;;;;;;;;;-1:-1:-1;18167:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18213:21;18237:26;:38;18264:10;-1:-1:-1;;;;;18237:38:0;-1:-1:-1;;;;;18237:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18237:38:0;18213:62;;18523:13;-1:-1:-1;;;;;18354:183:0;18511:10;-1:-1:-1;;;;;18354:183:0;18369:9;-1:-1:-1;;;;;18354:183:0;;18380:15;18397:13;18412:14;18428:12;18442:16;18460:12;18474:7;18483:5;18490:4;18496:13;;18354:183;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18354:183:0;;;;;;;;;;;-1:-1:-1;;;;;18354:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18558:13:0;:18;;18575:1;18558:18;;;-1:-1:-1;;;;;;;;;;17058:1526:0:o;1669:205::-;1797:68;;;-1:-1:-1;;;;;1797:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1797:68:0;-1:-1:-1;;;1797:68:0;;;1770:96;;1790:5;;1770:19;:96::i;:::-;1669:205;;;;:::o;38130:107::-;38188:7;38220:1;38215;:6;;:14;;38228:1;38215:14;;;-1:-1:-1;38224:1:0;;38208:21;-1:-1:-1;38130:107:0:o;39853:805::-;-1:-1:-1;;;;;40047:37:0;;;40039:46;40047:37;;;:26;:37;;;;;;;;;;;;40039:46;;:7;:46;;;:53;;-1:-1:-1;;;40039:53:0;;;;40047:37;40039:58;40035:304;;;-1:-1:-1;;;;;40141:37:0;;;40114:24;40141:37;;;:26;:37;;;;;;;;;;;;40193:44;;;;;;:63;;-1:-1:-1;;;;;;40193:63:0;;;;;;;;40271:7;:25;;;;;;;:56;;;;;;;;;;40035:304;40380:208;;;;;;;;-1:-1:-1;;;;;40380:208:0;;;;;;40449:1;40380:208;;;;;;;;;;;;;-1:-1:-1;40380:208:0;;;;;;;;;;;;;;;;;;40359:18;;;:7;:18;;;;;:229;;;;;;40380:208;40359:229;-1:-1:-1;;;40359:229:0;-1:-1:-1;;;;40359:229:0;;;;-1:-1:-1;;;;;;40359:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40601:26;:37;;;;:49;;;;;;;;;;39853:805::o;43220:213::-;-1:-1:-1;;;;;43330:24:0;;;;;;:9;:24;;;;;;:36;;43359:6;43330:28;:36::i;:::-;-1:-1:-1;;;;;43303:24:0;;;;;;:9;:24;;;;;;;;:63;;;;43382:43;;;;;;;43303:24;;;;-1:-1:-1;;;;;;;;;;;43382:43:0;;;;;;;;;43220:213;;:::o;3248:79::-;3301:11;:18;;-1:-1:-1;;3301:18:0;3315:4;3301:18;;;3248:79::o;40875:211::-;40984:46;41010:4;41016:5;41023:6;40984:25;:46::i;:::-;41041:37;41060:2;41064:5;41071:6;41041:18;:37::i;41094:200::-;-1:-1:-1;;;;;41194:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;;41245:24;:31;;;;;;:41;;;;;;;;41094:200::o;1484:177::-;1594:58;;;-1:-1:-1;;;;;1594:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1594:58:0;-1:-1:-1;;;1594:58:0;;;1567:86;;1587:5;;1567:19;:86::i;:::-;1484:177;;;:::o;41706:213::-;-1:-1:-1;;;;;41816:24:0;;;;;;:9;:24;;;;;;:36;;41845:6;41816:28;:36::i;:::-;-1:-1:-1;;;;;41789:24:0;;;;;;:9;:24;;;;;;;;:63;;;;41868:43;;;;;;;41789:24;;-1:-1:-1;;;;;;;;;;;41868:43:0;;;;;;;;;;41706:213;;:::o;39391:450::-;39494:7;39522:23;39514:32;;;;;;39563:12;39559:31;;-1:-1:-1;39586:1:0;39579:8;;39559:31;39617:16;;;39627:6;39617:7;:16;:7;39650:14;;;;;:24;39646:129;;;39745:18;39738:4;:25;;;;;;39731:32;;;;;39646:129;39827:6;39805:18;39795:7;:28;;;;;;39794:39;;39391:450;-1:-1:-1;;;;;39391:450:0:o;2769:213::-;2827:7;2851:6;2847:47;;-1:-1:-1;2881:1:0;2874:8;;2847:47;2918:5;;;2922:1;2918;:5;:1;2942:5;;;;;:10;2934:19;;;;;1881:481;1970:27;1978:5;-1:-1:-1;;;;;1970:25:0;;:27::i;:::-;1962:71;;;;;-1:-1:-1;;;1962:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2047:12;2061:23;2096:5;-1:-1:-1;;;;;2088:19:0;2108:4;2088:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2088:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2046:67;;;;2132:7;2124:52;;;;;-1:-1:-1;;;2124:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2193:17;;:21;2189:166;;2277:10;2266:30;;;;;;;;;;;;;;;-1:-1:-1;2266:30:0;2258:85;;;;-1:-1:-1;;;2258:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;720:562;780:4;1191:20;;1091:66;1231:23;;;;;;:42;;-1:-1:-1;1258:15:0;;;1231:42;1223:51;720:562;-1:-1:-1;;;;720:562:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://01a0c3df97f03f368990c0294d99aa3753c3f3433da1a3ca5830090b43f26d86

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  ]

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.